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 2024/06/17 18:23:24 UTC

svn commit: r1918392 - in /pdfbox/trunk/pdfbox/src: main/java/org/apache/pdfbox/multipdf/Splitter.java test/java/org/apache/pdfbox/multipdf/PDFMergerUtilityTest.java

Author: lehmi
Date: Mon Jun 17 18:23:24 2024
New Revision: 1918392

URL: http://svn.apache.org/viewvc?rev=1918392&view=rev
Log:
PDFBOX-5841: copy COSObject instead of PDMetadata to avoid a malformed result

Modified:
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/multipdf/Splitter.java
    pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/multipdf/PDFMergerUtilityTest.java

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/multipdf/Splitter.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/multipdf/Splitter.java?rev=1918392&r1=1918391&r2=1918392&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/multipdf/Splitter.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/multipdf/Splitter.java Mon Jun 17 18:23:24 2024
@@ -35,6 +35,7 @@ import org.apache.pdfbox.cos.COSName;
 import org.apache.pdfbox.cos.COSObject;
 import org.apache.pdfbox.io.RandomAccessStreamCache.StreamCacheCreateFunction;
 import org.apache.pdfbox.pdmodel.PDDocument;
+import org.apache.pdfbox.pdmodel.PDDocumentCatalog;
 import org.apache.pdfbox.pdmodel.PDDocumentInformation;
 import org.apache.pdfbox.pdmodel.PDPage;
 import org.apache.pdfbox.pdmodel.PDPageTree;
@@ -679,14 +680,17 @@ public class Splitter
             }
             document.setDocumentInformation(new PDDocumentInformation(destDocumentInformationDictionary));
         }
-        document.getDocumentCatalog().setViewerPreferences(
-                getSourceDocument().getDocumentCatalog().getViewerPreferences());
-        document.getDocumentCatalog().setLanguage(
-                getSourceDocument().getDocumentCatalog().getLanguage());
-        document.getDocumentCatalog().setMarkInfo(
-                getSourceDocument().getDocumentCatalog().getMarkInfo());
-        document.getDocumentCatalog().setMetadata(
-                getSourceDocument().getDocumentCatalog().getMetadata());
+        PDDocumentCatalog destCatalog = document.getDocumentCatalog();
+        PDDocumentCatalog sourceCatalog = getSourceDocument().getDocumentCatalog();
+        destCatalog.setViewerPreferences(sourceCatalog.getViewerPreferences());
+        destCatalog.setLanguage(sourceCatalog.getLanguage());
+        destCatalog.setMarkInfo(sourceCatalog.getMarkInfo());
+        // copy the COS-object itself instead of the PD-object to avoid a malformed result
+        COSObject metaData = sourceCatalog.getCOSObject().getCOSObject(COSName.METADATA);
+        if (metaData != null)
+        {
+            destCatalog.getCOSObject().setItem(COSName.METADATA, metaData);
+        }
         return document;
     }
 

Modified: pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/multipdf/PDFMergerUtilityTest.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/multipdf/PDFMergerUtilityTest.java?rev=1918392&r1=1918391&r2=1918392&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/multipdf/PDFMergerUtilityTest.java (original)
+++ pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/multipdf/PDFMergerUtilityTest.java Mon Jun 17 18:23:24 2024
@@ -16,6 +16,7 @@
 package org.apache.pdfbox.multipdf;
 
 import java.awt.image.BufferedImage;
+import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.FileOutputStream;
 import java.io.IOException;
@@ -59,6 +60,7 @@ import org.apache.pdfbox.rendering.PDFRe
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertNull;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.junit.jupiter.api.Assertions.assertTrue;
@@ -1242,6 +1244,14 @@ class PDFMergerUtilityTest
                 assertEquals(3, pageTree.indexOf(pd3.getPage()));
                 assertEquals(3, pageTree.indexOf(pd4.getPage()));
                 assertEquals(5, pageTree.indexOf(pd5.getPage()));
+
+                assertNotNull(dstDoc.getDocumentCatalog().getMetadata());
+
+                ByteArrayOutputStream baos = new ByteArrayOutputStream();
+                dstDoc.save(baos);
+                PDDocument reloadedDoc = Loader.loadPDF(baos.toByteArray());
+                assertNotNull(reloadedDoc.getDocumentCatalog().getMetadata());
+                reloadedDoc.close();
             }
             // Check that source document is unchanged
             annotations = doc.getPage(0).getAnnotations();