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());
+        }
+    }
 }


Reply via email to