Author: ssteiner Date: Tue Jun 20 08:06:24 2017 New Revision: 1799314 URL: http://svn.apache.org/viewvc?rev=1799314&view=rev Log: FOP-2715: Optimise PDFWriter writing out floats
Modified: 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/PDFWriterTestCase.java 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=1799314&r1=1799313&r2=1799314&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 Tue Jun 20 08:06:24 2017 @@ -21,6 +21,7 @@ import java.text.DecimalFormat; import java.text.DecimalFormatSymbols; import java.util.ArrayList; import java.util.Collection; +import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; @@ -39,6 +40,8 @@ import org.apache.pdfbox.pdmodel.common. public class PDFWriter { + private DecimalFormat df = new DecimalFormat("#.####", new DecimalFormatSymbols(Locale.US)); + private Map<Float, String> floatCache = new HashMap<Float, String>(); protected StringBuilder s = new StringBuilder(); protected UniqueName key; private int currentMCID; @@ -88,8 +91,14 @@ public class PDFWriter { s.append(" "); } else if (c instanceof COSFloat) { float f = ((COSFloat) c).floatValue(); - s.append(new DecimalFormat("#.####", new DecimalFormatSymbols(Locale.US)).format(f)); + if (!floatCache.containsKey(f)) { + addCache(f); + } + s.append(floatCache.get(f)); s.append(" "); + if (floatCache.size() > 1024) { + floatCache.clear(); + } } else if (c instanceof COSName) { COSName cn = (COSName)c; s.append("/" + key.getName(cn)); @@ -127,6 +136,11 @@ public class PDFWriter { } } + protected void addCache(float f) { + String formatted = df.format(f); + floatCache.put(f, formatted); + } + private void updateMCID(Map.Entry<COSName, COSBase> cn, Collection<COSBase> dictArgs) { COSBase cosMCID = cn.getValue(); assert cosMCID instanceof COSInteger; Modified: xmlgraphics/fop-pdf-images/trunk/test/java/org/apache/fop/render/pdf/PDFWriterTestCase.java URL: http://svn.apache.org/viewvc/xmlgraphics/fop-pdf-images/trunk/test/java/org/apache/fop/render/pdf/PDFWriterTestCase.java?rev=1799314&r1=1799313&r2=1799314&view=diff ============================================================================== --- xmlgraphics/fop-pdf-images/trunk/test/java/org/apache/fop/render/pdf/PDFWriterTestCase.java (original) +++ xmlgraphics/fop-pdf-images/trunk/test/java/org/apache/fop/render/pdf/PDFWriterTestCase.java Tue Jun 20 08:06:24 2017 @@ -39,4 +39,26 @@ public class PDFWriterTestCase { Assert.assertEquals(pdfWriter.writeText(pdStream), text + "\n"); Locale.setDefault(l); } + + @Test + public void testFloatCache() throws IOException { + String text = "[1.1 1.1] a"; + PDStream pdStream = new PDStream(new PDDocument(), new ByteArrayInputStream(text.getBytes("UTF-8"))); + MyPDFWriter pdfWriter = new MyPDFWriter(); + pdfWriter.writeText(pdStream); + Assert.assertEquals(pdfWriter.i, 1); + } + + private static class MyPDFWriter extends PDFWriter { + int i; + + public MyPDFWriter() { + super(null, 0); + } + + protected void addCache(float f) { + super.addCache(f); + i++; + } + }; } --------------------------------------------------------------------- To unsubscribe, e-mail: fop-commits-unsubscr...@xmlgraphics.apache.org For additional commands, e-mail: fop-commits-h...@xmlgraphics.apache.org