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); } --------------------------------------------------------------------- To unsubscribe, e-mail: fop-commits-unsubscr...@xmlgraphics.apache.org For additional commands, e-mail: fop-commits-h...@xmlgraphics.apache.org