Author: tilman Date: Sun Jul 2 15:01:20 2023 New Revision: 1910741 URL: http://svn.apache.org/viewvc?rev=1910741&view=rev Log: PDFBOX-5627: subset when doing incremental test + test, as suggested by DvdM
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDDocument.java pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/cos/TestCOSIncrement.java Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDDocument.java URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDDocument.java?rev=1910741&r1=1910740&r2=1910741&view=diff ============================================================================== --- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDDocument.java (original) +++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDDocument.java Sun Jul 2 15:01:20 2023 @@ -1027,16 +1027,21 @@ public class PDDocument implements Close // object stream compression requires a cross reference stream. document.setIsXRefStream(compressParameters != null // && CompressParameters.NO_COMPRESSION != compressParameters); + subsetDesignatedFonts(); + + // save PDF + COSWriter writer = new COSWriter(output, compressParameters); + writer.write(this); + } + + private void subsetDesignatedFonts() throws IOException + { // subset designated fonts for (PDFont font : fontsToSubset) { font.subset(); } fontsToSubset.clear(); - - // save PDF - COSWriter writer = new COSWriter(output, compressParameters); - writer.write(this); } /** @@ -1064,6 +1069,7 @@ public class PDDocument implements Close */ public void saveIncremental(OutputStream output) throws IOException { + subsetDesignatedFonts(); if (pdfSource == null) { throw new IllegalStateException("document was not loaded from a file or a stream"); @@ -1100,6 +1106,7 @@ public class PDDocument implements Close */ public void saveIncremental(OutputStream output, Set<COSDictionary> objectsToWrite) throws IOException { + subsetDesignatedFonts(); if (pdfSource == null) { throw new IllegalStateException("document was not loaded from a file or a stream"); @@ -1147,6 +1154,7 @@ public class PDDocument implements Close */ public ExternalSigningSupport saveIncrementalForExternalSigning(OutputStream output) throws IOException { + subsetDesignatedFonts(); if (pdfSource == null) { throw new IllegalStateException("document was not loaded from a file or a stream"); Modified: pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/cos/TestCOSIncrement.java URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/cos/TestCOSIncrement.java?rev=1910741&r1=1910740&r2=1910741&view=diff ============================================================================== --- pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/cos/TestCOSIncrement.java (original) +++ pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/cos/TestCOSIncrement.java Sun Jul 2 15:01:20 2023 @@ -42,6 +42,7 @@ import static org.junit.jupiter.api.Asse import java.io.ByteArrayOutputStream; import java.io.File; +import java.io.FileOutputStream; import java.io.IOException; import java.net.URI; @@ -50,6 +51,9 @@ import java.net.URL; import java.util.ConcurrentModificationException; +import org.apache.pdfbox.pdmodel.font.PDFont; +import org.apache.pdfbox.pdmodel.font.PDType0Font; + class TestCOSIncrement { @@ -285,4 +289,52 @@ class TestCOSIncrement return assertDoesNotThrow(() -> Loader.loadPDF(documentData), "Loading the document failed."); } + /** + * Check that subsetting takes place in incremental saving. + */ + @Test + void testSubsetting() throws IOException + { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + + try (PDDocument document = new PDDocument()) + { + PDPage page = new PDPage(PDRectangle.A4); + document.addPage(page); + document.save(baos); + } + + try (PDDocument document = Loader.loadPDF(baos.toByteArray())) + { + PDPage page = document.getPage(0); + + PDFont font = PDType0Font.load(document, TestCOSIncrement.class.getResourceAsStream( + "/org/apache/pdfbox/resources/ttf/LiberationSans-Regular.ttf")); + + try (PDPageContentStream contentStream = new PDPageContentStream(document, page)) + { + contentStream.beginText(); + contentStream.setFont(font, 12); + contentStream.newLineAtOffset(75, 750); + contentStream.showText("Apache PDFBox"); + contentStream.endText(); + } + + COSDictionary catalog = document.getDocumentCatalog().getCOSObject(); + catalog.setNeedToBeUpdated(true); + COSDictionary pages = catalog.getCOSDictionary(COSName.PAGES); + pages.setNeedToBeUpdated(true); + page.getCOSObject().setNeedToBeUpdated(true); + + document.saveIncremental(new FileOutputStream("target/PDFBOX-5627.pdf")); + } + + try (PDDocument document = Loader.loadPDF(new File("target/PDFBOX-5627.pdf"))) + { + PDPage page = document.getPage(0); + COSName fontName = page.getResources().getFontNames().iterator().next(); + PDFont font = page.getResources().getFont(fontName); + assertTrue(font.isEmbedded()); + } + } }