You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by ti...@apache.org on 2020/04/15 14:19:56 UTC

svn commit: r1876558 - /pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/signature/CreateEmbeddedTimeStamp.java

Author: tilman
Date: Wed Apr 15 14:19:55 2020
New Revision: 1876558

URL: http://svn.apache.org/viewvc?rev=1876558&view=rev
Log:
PDFBOX-4071: refactor to use jdk7 and jdk8 constructs

Modified:
    pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/signature/CreateEmbeddedTimeStamp.java

Modified: pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/signature/CreateEmbeddedTimeStamp.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/signature/CreateEmbeddedTimeStamp.java?rev=1876558&r1=1876557&r2=1876558&view=diff
==============================================================================
--- pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/signature/CreateEmbeddedTimeStamp.java (original)
+++ pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/signature/CreateEmbeddedTimeStamp.java Wed Apr 15 14:19:55 2020
@@ -18,20 +18,19 @@
 package org.apache.pdfbox.examples.signature;
 
 import java.io.File;
-import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.OutputStream;
+import java.nio.file.Files;
 import java.security.NoSuchAlgorithmException;
 import java.util.Arrays;
-import java.util.SortedMap;
-import java.util.TreeMap;
+import java.util.Comparator;
+import java.util.Optional;
 
 import org.apache.pdfbox.Loader;
 import org.apache.pdfbox.cos.COSBase;
 import org.apache.pdfbox.cos.COSName;
-import org.apache.pdfbox.io.IOUtils;
 import org.apache.pdfbox.pdmodel.PDDocument;
 import org.apache.pdfbox.pdmodel.interactive.digitalsignature.PDSignature;
 import org.apache.pdfbox.util.Hex;
@@ -92,18 +91,18 @@ public class CreateEmbeddedTimeStamp
         try (PDDocument doc = Loader.loadPDF(inFile))
         {
             document = doc;
-            processTimeStamping(outFile, inFile.getAbsolutePath());
+            processTimeStamping(inFile, outFile);
         }
     }
 
     /**
-     * Processes the time-stamping of the Signature.
+     * Processes the time-stamping of the signature.
      * 
+     * @param inFile The existing PDF file
      * @param outFile Where the new file will be written to
-     * @param fileName of the existing file containing the pdf
      * @throws IOException
      */
-    private void processTimeStamping(File outFile, String fileName) throws IOException
+    private void processTimeStamping(File inFile, File outFile) throws IOException
     {
         int accessPermissions = SigUtils.getMDPPermission(document);
         if (accessPermissions == 1)
@@ -114,19 +113,16 @@ public class CreateEmbeddedTimeStamp
 
         try
         {
-            byte[] documentBytes;
-            try (FileInputStream fis = new FileInputStream(fileName))
-            {
-                documentBytes = IOUtils.toByteArray(fis);
-            }
+            byte[] documentBytes = Files.readAllBytes(inFile.toPath());
             processRelevantSignatures(documentBytes);
 
-            if (changedEncodedSignature != null)
+            if (changedEncodedSignature == null)
             {
-                try (FileOutputStream output = new FileOutputStream(outFile))
-                {
-                    embedNewSignatureIntoDocument(documentBytes, output);
-                }
+                throw new IllegalStateException("No signature");
+            }
+            try (FileOutputStream output = new FileOutputStream(outFile))
+            {
+                embedNewSignatureIntoDocument(documentBytes, output);
             }
         }
         catch (IOException | NoSuchAlgorithmException | CMSException e)
@@ -185,23 +181,27 @@ public class CreateEmbeddedTimeStamp
      */
     private void getRelevantSignature(PDDocument document)
     {
+        Comparator<PDSignature> comparatorByOffset =
+                Comparator.comparing(sig -> sig.getByteRange()[1]);
+
         // we can't use getLastSignatureDictionary() because this will fail (see PDFBOX-3978) 
         // if a signature is assigned to a pre-defined empty signature field that isn't the last.
         // we get the last in time by looking at the offset in the PDF file.
-        SortedMap<Integer, PDSignature> sortedMap = new TreeMap<>();
-        for (PDSignature sig : document.getSignatureDictionaries())
+        Optional<PDSignature> optLastSignature =
+                document.getSignatureDictionaries().stream().
+                sorted(comparatorByOffset.reversed()).
+                findFirst();
+
+        if (!optLastSignature.isPresent())
         {
-            int sigOffset = sig.getByteRange()[1];
-            sortedMap.put(sigOffset, sig);
+            return;
         }
-        if (sortedMap.size() > 0)
+
+        PDSignature lastSignature = optLastSignature.get();
+        COSBase type = lastSignature.getCOSObject().getItem(COSName.TYPE);
+        if (COSName.SIG.equals(type))
         {
-            PDSignature lastSignature = sortedMap.get(sortedMap.lastKey());
-            COSBase type = lastSignature.getCOSObject().getItem(COSName.TYPE);
-            if (type.equals(COSName.SIG))
-            {
-                signature = lastSignature;
-            }
+            signature = lastSignature;
         }
     }