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 2018/09/20 06:15:15 UTC

svn commit: r1841425 - /pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDDocument.java

Author: tilman
Date: Thu Sep 20 06:15:15 2018
New Revision: 1841425

URL: http://svn.apache.org/viewvc?rev=1841425&view=rev
Log:
PDFBOX-4312: fix bug that resulted in storage of signature bytes at wrong position or not at all or file corruption + improve javadoc

Modified:
    pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDDocument.java

Modified: pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDDocument.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDDocument.java?rev=1841425&r1=1841424&r2=1841425&view=diff
==============================================================================
--- pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDDocument.java (original)
+++ pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDDocument.java Thu Sep 20 06:15:15 2018
@@ -21,8 +21,6 @@ import java.awt.print.Pageable;
 import java.awt.print.Printable;
 import java.awt.print.PrinterException;
 import java.awt.print.PrinterJob;
-import java.io.BufferedInputStream;
-import java.io.BufferedOutputStream;
 import java.io.Closeable;
 import java.io.File;
 import java.io.FileInputStream;
@@ -50,6 +48,7 @@ import org.apache.pdfbox.cos.COSStream;
 import org.apache.pdfbox.exceptions.COSVisitorException;
 import org.apache.pdfbox.exceptions.CryptographyException;
 import org.apache.pdfbox.exceptions.SignatureException;
+import org.apache.pdfbox.io.IOUtils;
 import org.apache.pdfbox.io.RandomAccess;
 import org.apache.pdfbox.pdfparser.BaseParser;
 import org.apache.pdfbox.pdfparser.NonSequentialPDFParser;
@@ -1378,26 +1377,39 @@ public class PDDocument implements Pagea
         }
     }
 
-    /** 
-     * Save the pdf as incremental.
-     * 
-     * @param fileName the filename to be used
+    /**
+     * Save the pdf as incremental for signing. Use this only for small files
+     * because this method temporarly stores the entire file into memory.
+     *
+     * @param fileName the filename to be used. This should be a copy of the
+     * original file.
      * @throws IOException if something went wrong
-     * @throws COSVisitorException  if something went wrong
+     * @throws COSVisitorException if something went wrong
      */
-    public void saveIncremental( String fileName ) throws IOException, COSVisitorException
+    public void saveIncremental(String fileName) throws IOException, COSVisitorException
     {
-        saveIncremental(new BufferedInputStream(new FileInputStream(fileName)), 
-                new BufferedOutputStream(new FileOutputStream(fileName, true)));
+        FileInputStream fis = new FileInputStream(fileName);
+        byte[] ba = IOUtils.toByteArray(fis);
+        fis.close();
+        FileOutputStream fos = new FileOutputStream(fileName);
+        fos.write(ba);
+        fis = new FileInputStream(fileName);
+        saveIncremental(fis, fos);
     }
-    
-    /** 
-     * Save the pdf as incremental.
-     * 
-     * @param input 
-     * @param output
+
+    /**
+     * Save the pdf as incremental for signing. See the signature examples
+     * sources on how to use this.
+     *
+     * @param input. This must be a FileInputStream or it won't work. It should
+     * point to the same file than the output parameter.
+     * @param output. This must be a FileOutputStream or it won't work. It must
+     * be positioned at the end of the file, i.e. it should just have written
+     * the original file. The appending constructor of FileOutputStream has been
+     * found not to be working, so you need to write the whole file yourself.
+     *
      * @throws IOException if something went wrong
-     * @throws COSVisitorException  if something went wrong
+     * @throws COSVisitorException if something went wrong
      */
     public void saveIncremental(InputStream input, OutputStream output) throws IOException, COSVisitorException
     {