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 2022/02/27 14:38:18 UTC

svn commit: r1898455 - in /pdfbox/trunk: examples/src/test/java/org/apache/pdfbox/examples/pdfa/CreatePDFATest.java pdfbox/src/main/java/org/apache/pdfbox/pdfwriter/COSWriter.java

Author: lehmi
Date: Sun Feb 27 14:38:18 2022
New Revision: 1898455

URL: http://svn.apache.org/viewvc?rev=1898455&view=rev
Log:
PDFBOX-5381: avoid writing the catalog object twice using a part of a patch povided by the blue mountain in PDFBOX-5369

Modified:
    pdfbox/trunk/examples/src/test/java/org/apache/pdfbox/examples/pdfa/CreatePDFATest.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfwriter/COSWriter.java

Modified: pdfbox/trunk/examples/src/test/java/org/apache/pdfbox/examples/pdfa/CreatePDFATest.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/examples/src/test/java/org/apache/pdfbox/examples/pdfa/CreatePDFATest.java?rev=1898455&r1=1898454&r2=1898455&view=diff
==============================================================================
--- pdfbox/trunk/examples/src/test/java/org/apache/pdfbox/examples/pdfa/CreatePDFATest.java (original)
+++ pdfbox/trunk/examples/src/test/java/org/apache/pdfbox/examples/pdfa/CreatePDFATest.java Sun Feb 27 14:38:18 2022
@@ -16,11 +16,16 @@
 package org.apache.pdfbox.examples.pdfa;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
+import java.io.BufferedReader;
 import java.io.File;
 import java.io.FileInputStream;
+import java.io.InputStreamReader;
 import java.security.KeyStore;
+import java.util.HashSet;
+import java.util.Set;
 
 import org.apache.pdfbox.Loader;
 import org.apache.pdfbox.examples.pdmodel.CreatePDFA;
@@ -90,5 +95,36 @@ class CreatePDFATest
             DublinCoreSchema dc = metadata.getDublinCoreSchema();
             assertEquals(pdfaFilename, dc.getTitle());
         }
+
+        File signedFile = new File(signedPdfaFilename);
+        BufferedReader br = new BufferedReader(
+                new InputStreamReader(new FileInputStream(signedFile)));
+        String line;
+        boolean isIncrementalArea = false;
+        Set<String> set = new HashSet<>();
+        int linePos = 0;
+        while ((line = br.readLine()) != null)
+        {
+            ++linePos;
+            if (line.equals("%%EOF"))
+            {
+                isIncrementalArea = true;
+            }
+            if (line.equals("%%EOF"))
+            {
+                isIncrementalArea = true;
+                set.clear(); // for cases with several revisions
+            }
+            if (line.matches("^\\d+ 0 obj$"))
+            {
+                int pos = line.indexOf(" 0 obj");
+                line = line.substring(0, pos);
+                assertFalse(set.contains(line), "object '" + line
+                        + " 0 obj' twice in incremental part of PDF at line " + linePos);
+                set.add(line);
+            }
+        }
+        br.close();
+
     }
 }

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=1898455&r1=1898454&r2=1898455&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 Sun Feb 27 14:38:18 2022
@@ -1461,8 +1461,19 @@ public class COSWriter implements ICOSVi
         pdDocument = doc;
         COSDocument cosDoc = pdDocument.getDocument();
         COSDictionary trailer = cosDoc.getTrailer();
-        if(incrementalUpdate){
-            trailer.toIncrement().exclude(trailer).forEach(objectsToWrite::add);
+        if (incrementalUpdate)
+        {
+            trailer.toIncrement().exclude(trailer).forEach(base -> {
+                objectsToWrite.add(base);
+                if (base instanceof COSObject)
+                {
+                    actualsAdded.add(((COSObject) base).getObject());
+                }
+                else
+                {
+                    actualsAdded.add(base);
+                }
+            });
         }
         signatureInterface = signInterface;
         number = pdDocument.getDocument().getHighestXRefObjectNumber();