svn commit: r1864947 - in /xmlgraphics/fop-pdf-images/trunk: src/java/org/apache/fop/render/pdf/pdfbox/PDFBoxAdapter.java src/java/org/apache/fop/render/pdf/pdfbox/PDFWriter.java test/java/org/apache/fop/render/pdf/PDFBoxAdapterTestCase.java

[email protected] Mon, 12 Aug 2019 08:50:01 -0000
Newsgroups gmane.text.xml.fop.cvs
Message-ID <[email protected]>
Author: ssteiner
Date: Mon Aug 12 08:50:01 2019
New Revision: 1864947

URL: http://svn.apache.org/viewvc?rev=1864947&view=rev
Log:
FOP-2879: Add caching to avoid parsing content stream

Modified:
    xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/PDFBoxAdapter.java
    xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/PDFWriter.java
    xmlgraphics/fop-pdf-images/trunk/test/java/org/apache/fop/render/pdf/PDFBoxAdapterTestCase.java

Modified: xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/PDFBoxAdapter.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/PDFBoxAdapter.java?rev=1864947&r1=1864946&r2=1864947&view=diff
==============================================================================
--- xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/PDFBoxAdapter.java (original)
+++ xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/PDFBoxAdapter.java Mon Aug 12 08:50:01 2019
@@ -369,10 +369,12 @@ public class PDFBoxAdapter {
 //            }
         }
         if (newStream == null) {
-            PDFWriter writer = new PDFWriter(uniqueName, currentMCID);
-            newStream = writer.writeText(pdStream);
-            currentMCID = writer.getCurrentMCID();
-
+            newStream = (String) clonedVersion.get(key);
+            if (newStream == null) {
+                PDFWriter writer = new PDFWriter(uniqueName, currentMCID);
+                newStream = writer.writeText(pdStream);
+                clonedVersion.put(key, newStream);
+            }
         }
         pdStream = new PDStream(sourceDoc, new ByteArrayInputStream(newStream.getBytes("ISO-8859-1")));
         mergeXObj(sourcePageResources, fontinfo, uniqueName);

Modified: xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/PDFWriter.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/PDFWriter.java?rev=1864947&r1=1864946&r2=1864947&view=diff
==============================================================================
--- xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/PDFWriter.java (original)
+++ xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/PDFWriter.java Mon Aug 12 08:50:01 2019
@@ -149,8 +149,4 @@ public class PDFWriter {
         dictArgs.add(cn.getKey());
         dictArgs.add(updatedID);
     }
-
-    protected int getCurrentMCID() {
-        return currentMCID;
-    }
 }

Modified: xmlgraphics/fop-pdf-images/trunk/test/java/org/apache/fop/render/pdf/PDFBoxAdapterTestCase.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop-pdf-images/trunk/test/java/org/apache/fop/render/pdf/PDFBoxAdapterTestCase.java?rev=1864947&r1=1864946&r2=1864947&view=diff
==============================================================================
--- xmlgraphics/fop-pdf-images/trunk/test/java/org/apache/fop/render/pdf/PDFBoxAdapterTestCase.java (original)
+++ xmlgraphics/fop-pdf-images/trunk/test/java/org/apache/fop/render/pdf/PDFBoxAdapterTestCase.java Mon Aug 12 08:50:01 2019
@@ -30,6 +30,7 @@ import java.io.OutputStream;
 import java.net.URI;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.Iterator;
 import java.util.LinkedHashMap;
 import java.util.Map;
 
@@ -478,55 +479,60 @@ public class PDFBoxAdapterTestCase {
 
     @Test
     public void testPDFCache() throws IOException {
-        PDFDocument pdfdoc = new PDFDocument("");
-        Map<Object, Object> pdfCache = new LinkedHashMap<Object, Object>();
-        Map<Object, Object> objectCachePerFile = loadPDFWithCache(pdfdoc, pdfCache, LOOP);
+        LoadPDFWithCache loadPDFWithCache = new LoadPDFWithCache();
+        loadPDFWithCache.run(LOOP);
 
-        Object item = pdfCache.values().iterator().next();
+        Object item = loadPDFWithCache.pdfCache.values().iterator().next();
         Assert.assertEquals(item.getClass(), PDFStream.class);
-        item = pdfCache.keySet().iterator().next();
+        item = loadPDFWithCache.pdfCache.keySet().iterator().next();
         Assert.assertEquals(item.getClass(), Integer.class);
-        Assert.assertEquals(pdfCache.size(), 12);
+        Assert.assertEquals(loadPDFWithCache.pdfCache.size(), 12);
 
-        int pdfDictionary = 0;
-        int strings = 0;
-        for (Map.Entry<Object, Object> o : objectCachePerFile.entrySet()) {
-            if (o.getValue().getClass().equals(PDFDictionary.class)) {
-                pdfDictionary++;
-            }
-            if (o.getKey() instanceof String) {
-                strings++;
-            }
-        }
-        Assert.assertEquals(pdfDictionary, 26);
-        Assert.assertEquals(strings, 33);
-        Assert.assertEquals(objectCachePerFile.size(), 45);
+        Iterator<Object> iterator = loadPDFWithCache.objectCachePerFile.values().iterator();
+        iterator.next();
+        item = iterator.next();
+        Assert.assertEquals(item.getClass(), PDFDictionary.class);
+        item = loadPDFWithCache.objectCachePerFile.keySet().iterator().next();
+        Assert.assertEquals(item.getClass(), String.class);
+        Assert.assertEquals(loadPDFWithCache.objectCachePerFile.size(), 46);
     }
 
-    private Map<Object, Object> loadPDFWithCache(PDFDocument pdfdoc, Map<Object, Object> pdfCache, String pdf)
-        throws IOException {
-        Map<Object, Object> objectCachePerFile = new LinkedHashMap<Object, Object>();
-        PDFPage pdfpage = getPDFPage(pdfdoc);
-        pdfdoc.assignObjectNumber(pdfpage);
-        pdfpage.setDocument(pdfdoc);
-        PDFBoxAdapter adapter = new PDFBoxAdapter(
-                pdfpage, objectCachePerFile, new HashMap<Integer, PDFArray>(), pdfCache);
-        PDDocument doc = PDDocument.load(new File(pdf));
-        PDPage page = doc.getPage(0);
-        adapter.createStreamFromPDFBoxPage(doc, page, "key", new AffineTransform(), null, new Rectangle());
-        doc.close();
-        return objectCachePerFile;
+    @Test
+    public void testPDFCache2() throws IOException {
+        LoadPDFWithCache loadPDFWithCache = new LoadPDFWithCache();
+        String stream = loadPDFWithCache.run(LOOP);
+        String cachedStream = (String) loadPDFWithCache.objectCachePerFile.get(LOOP);
+        Assert.assertTrue(cachedStream.contains("EMC"));
+        Assert.assertTrue(stream.endsWith(cachedStream));
+    }
+
+    private static class LoadPDFWithCache {
+        private PDFDocument pdfdoc = new PDFDocument("");
+        private Map<Object, Object> pdfCache = new LinkedHashMap<Object, Object>();
+        private Map<Object, Object> objectCachePerFile = new LinkedHashMap<Object, Object>();
+        private String run(String pdf) throws IOException {
+            PDFPage pdfpage = getPDFPage(pdfdoc);
+            pdfdoc.assignObjectNumber(pdfpage);
+            pdfpage.setDocument(pdfdoc);
+            PDFBoxAdapter adapter = new PDFBoxAdapter(
+                    pdfpage, objectCachePerFile, new HashMap<Integer, PDFArray>(), pdfCache);
+            PDDocument doc = PDDocument.load(new File(pdf));
+            PDPage page = doc.getPage(0);
+            String stream = adapter.createStreamFromPDFBoxPage(
+                    doc, page, pdf, new AffineTransform(), null, new Rectangle());
+            doc.close();
+            return stream;
+        }
     }
 
     @Test
     public void testPDFSize() throws IOException {
-        PDFDocument pdfdoc = new PDFDocument("");
-        Map<Object, Object> pdfCache = new HashMap<Object, Object>();
-        loadPDFWithCache(pdfdoc, pdfCache, ANNOT);
-        loadPDFWithCache(pdfdoc, pdfCache, ANNOT);
+        LoadPDFWithCache loadPDFWithCache = new LoadPDFWithCache();
+        loadPDFWithCache.run(ANNOT);
+        loadPDFWithCache.run(ANNOT);
         ByteArrayOutputStream bos = new ByteArrayOutputStream();
-        pdfdoc.output(bos);
-        Assert.assertEquals(pdfCache.size(), 2);
+        loadPDFWithCache.pdfdoc.output(bos);
+        Assert.assertEquals(loadPDFWithCache.pdfCache.size(), 2);
         Assert.assertTrue(bos.size() <= 6418);
     }