You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by le...@apache.org on 2011/11/01 17:35:42 UTC

svn commit: r1196104 - in /pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox: cos/COSName.java pdfwriter/COSWriter.java

Author: lehmi
Date: Tue Nov  1 16:35:42 2011
New Revision: 1196104

URL: http://svn.apache.org/viewvc?rev=1196104&view=rev
Log:
PDFBOX-1125: don't write a signature for non incremental updates as proposed by Gerhard Temper

Modified:
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSName.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfwriter/COSWriter.java

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSName.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSName.java?rev=1196104&r1=1196103&r2=1196104&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSName.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSName.java Tue Nov  1 16:35:42 2011
@@ -405,12 +405,16 @@ public final class COSName extends COSBa
      * A common COSName value.
      */
     public static final COSName DL = new COSName( "DL" );
+    
+    /**
+     * A common COSName value.
+     */
+    public static final COSName DOC_CHECKSUM = new COSName( "DocChecksum" );
 
     /**
      * A common COSName value.
      */
     public static final COSName DOMAIN = new COSName( "Domain" );
-
     /**
      * A common COSName value.
      */

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfwriter/COSWriter.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfwriter/COSWriter.java?rev=1196104&r1=1196103&r2=1196104&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfwriter/COSWriter.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfwriter/COSWriter.java Tue Nov  1 16:35:42 2011
@@ -232,6 +232,7 @@ public class COSWriter implements ICOSVi
      * COSWriter constructor for incremental updates. 
      *
      * @param os The wrapped output stream.
+     * @param is input stream
      */
     public COSWriter(OutputStream os, FileInputStream is)
     {
@@ -240,7 +241,7 @@ public class COSWriter implements ICOSVi
       incrementalUpdate = true;
     }
 
-    protected void prepareIncrement(PDDocument doc)
+    private void prepareIncrement(PDDocument doc)
     {
       try
       {
@@ -251,7 +252,8 @@ public class COSWriter implements ICOSVi
           Map<COSObjectKey, Integer> xrefTable = cosDoc.getXrefTable();
           Set<COSObjectKey> keySet = xrefTable.keySet();
           long highestNumber=0;
-          for ( COSObjectKey cosObjectKey : keySet ) {
+          for ( COSObjectKey cosObjectKey : keySet ) 
+          {
             COSBase object = cosDoc.getObjectFromPool(cosObjectKey).getObject();
             if (object != null && cosObjectKey!= null && !(object instanceof COSNumber))
             {
@@ -261,7 +263,9 @@ public class COSWriter implements ICOSVi
             
             long num = cosObjectKey.getNumber();
             if (num > highestNumber)
-              highestNumber=num;
+            {
+                highestNumber=num;
+            }
           }
           setNumber(highestNumber);
           // xrefTable.clear();
@@ -461,11 +465,13 @@ public class COSWriter implements ICOSVi
             COSBase cosBase=null;
             COSObjectKey cosObjectKey = null;
             if(actual != null)
+            {
                 cosObjectKey= objectKeys.get(actual);
-          
+            }
             if(cosObjectKey!=null)
+            {
                 cosBase = keyObject.get(cosObjectKey);
-          
+            }
             if(actual != null && objectKeys.containsKey(actual) &&
                     !object.isNeedToBeUpdate() && (cosBase!= null &&
                     !cosBase.isNeedToBeUpdate()))
@@ -498,7 +504,8 @@ public class COSWriter implements ICOSVi
             {
                 COSDictionary dict = (COSDictionary)obj;
                 COSName item = (COSName)dict.getItem(COSName.TYPE);
-                if(COSName.SIG.equals(item)) {
+                if(COSName.SIG.equals(item)) 
+                {
                     reachedSignature = true;
                 }
             }
@@ -561,10 +568,12 @@ public class COSWriter implements ICOSVi
         COSWriterXRefEntry lastEntry = getXRefEntries().get( getXRefEntries().size()-1);
         trailer.setInt(COSName.SIZE, (int)lastEntry.getKey().getNumber()+1);
         // Only need to stay, if an incremental update will be performed
-        if (!incrementalUpdate)
+        if (!incrementalUpdate) 
+        {
           trailer.removeItem( COSName.PREV );
+        }
         // Remove a checksum if present
-        trailer.removeItem( COSName.getPDFName("DocChecksum") );
+        trailer.removeItem( COSName.DOC_CHECKSUM );
         
         /**
         COSObject catalog = doc.getCatalog();
@@ -624,7 +633,7 @@ public class COSWriter implements ICOSVi
         }
     }
 
-    protected void doWriteXRefInc(COSDocument doc) throws IOException
+    private void doWriteXRefInc(COSDocument doc) throws IOException
     {
         COSDictionary trailer = doc.getTrailer();
         trailer.setLong(COSName.PREV, doc.getStartXref());
@@ -649,7 +658,7 @@ public class COSWriter implements ICOSVi
         {
             writeXrefRange(xRefRanges[x], xRefRanges[x + 1]);
 
-            for(int i = 0 ; i < xRefRanges[x + 1] ; ++i)
+            for(int i = 0; i < xRefRanges[x + 1]; ++i)
             {
                 writeXrefEntry(xRefEntries.get(j++));
             }
@@ -657,7 +666,7 @@ public class COSWriter implements ICOSVi
         }
     }
 
-    protected void doWriteSignature(COSDocument doc) throws IOException, SignatureException
+    private void doWriteSignature(COSDocument doc) throws IOException, SignatureException
     {
         // need to calculate the ByteRange
         if (signaturePosition[0]>0 && byterangePosition[1] > 0)
@@ -666,7 +675,9 @@ public class COSWriter implements ICOSVi
             String newByteRange = "0 "+signaturePosition[0]+" "+signaturePosition[1]+" "+left+"]";
             int leftByterange = byterangePosition[1]-byterangePosition[0]-newByteRange.length();
             if(leftByterange<0)
+            {
                 throw new IOException("Can't write new ByteRange, not enough space");
+            }
             getStandardOutput().setPos(byterangePosition[0]);
             getStandardOutput().write(newByteRange.getBytes());
             for(int i=0;i<leftByterange;++i)
@@ -676,16 +687,24 @@ public class COSWriter implements ICOSVi
         
             getStandardOutput().setPos(0);
             // Begin - extracting document
-            InputStream filterInputStream = new COSFilterInputStream(in, new int[] {0,signaturePosition[0],signaturePosition[1],left});
+            InputStream filterInputStream = new COSFilterInputStream(in, 
+                    new int[] {0,signaturePosition[0],signaturePosition[1],left});
             ByteArrayOutputStream bytes = new ByteArrayOutputStream();
-            try {
+            try 
+            {
                 byte[] buffer = new byte[1024];
                 int c;
                 while((c = filterInputStream.read(buffer)) != -1)
+                {
                     bytes.write(buffer, 0, c);
-            } finally {
+                }
+            } 
+            finally 
+            {
                 if(filterInputStream !=null)
+                {
                     filterInputStream.close();
+                }
             }
 
             byte[] pdfContent = bytes.toByteArray();
@@ -696,13 +715,15 @@ public class COSWriter implements ICOSVi
             String signature = new COSString(sign).getHexString();
             int leftSignaturerange = signaturePosition[1]-signaturePosition[0]-signature.length();
             if(leftSignaturerange<0)
+            {
                 throw new IOException("Can't write signature, not enough space");
+            }
             getStandardOutput().setPos(signaturePosition[0]+1);
             getStandardOutput().write(signature.getBytes());
         }
     }
     
-    protected void writeXrefRange(long x, long y) throws IOException
+    private void writeXrefRange(long x, long y) throws IOException
     {
         getStandardOutput().write(String.valueOf(x).getBytes());
         getStandardOutput().write(SPACE);
@@ -710,7 +731,7 @@ public class COSWriter implements ICOSVi
         getStandardOutput().writeEOL();
     }
 
-    protected void writeXrefEntry(COSWriterXRefEntry entry) throws IOException
+    private void writeXrefEntry(COSWriterXRefEntry entry) throws IOException
     {
         String offset = formatXrefOffset.format(entry.getOffset());
         String generation = formatXrefGeneration.format(entry.getKey().getGeneration());
@@ -1029,14 +1050,23 @@ public class COSWriter implements ICOSVi
         try
         {
             if(!incrementalUpdate)
+            {
                 doWriteHeader(doc);
+            }
             doWriteBody(doc);
             if(incrementalUpdate)
+            {
                 doWriteXRefInc(doc);
+            }
             else
+            {
                 doWriteXRef(doc);
+            }
             doWriteTrailer(doc);
-            doWriteSignature(doc);
+            if(incrementalUpdate)
+            {
+                doWriteSignature(doc);
+            }
             
             return null;
         }
@@ -1284,7 +1314,9 @@ public class COSWriter implements ICOSVi
     {
         document = doc;
         if(incrementalUpdate)
+        {
             prepareIncrement(doc);
+        }
         
         // if the document says we should remove encryption, then we shouldn't encrypt
         if(doc.isAllSecurityToBeRemoved())