Skip to content

Commit

Permalink
PDFBOX-5841: copy COSObject instead of PDMetadata to avoid a malforme…
Browse files Browse the repository at this point in the history
…d result

git-svn-id: https://svn.apache.org/repos/asf/pdfbox/trunk@1918392 13f79535-47bb-0310-9956-ffa450edef68
  • Loading branch information
lehmi committed Jun 17, 2024
1 parent 5684c90 commit 539c7fb
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 8 deletions.
20 changes: 12 additions & 8 deletions pdfbox/src/main/java/org/apache/pdfbox/multipdf/Splitter.java
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
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;
Expand Down Expand Up @@ -679,14 +680,17 @@ protected PDDocument createNewDocument() throws IOException
}
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;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -59,6 +60,7 @@

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;
Expand Down Expand Up @@ -1242,6 +1244,14 @@ void testSplitWithNamedDestinations() throws IOException
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();
Expand Down

0 comments on commit 539c7fb

Please sign in to comment.