Author: jahewson Date: Mon Jun 30 18:33:45 2014 New Revision: 1606858 URL: http://svn.apache.org/r1606858 Log: PDFBOX-2126: let Java do the GC'ing for cached resources and state
Added: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/TilingPatternDrawer.java Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDPage.java pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDResources.java pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType3Font.java pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/PDXObject.java pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/PDImageXObject.java pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/pattern/TilingPaint.java pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PDFRenderer.java pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PageDrawer.java pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/PDFStreamEngine.java pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/content/PreflightContentStream.java pdfbox/trunk/tools/src/main/java/org/apache/pdfbox/tools/ExtractImages.java Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDPage.java URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDPage.java?rev=1606858&r1=1606857&r2=1606858&view=diff ============================================================================== --- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDPage.java (original) +++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDPage.java Mon Jun 30 18:33:45 2014 @@ -42,23 +42,15 @@ import org.apache.pdfbox.pdmodel.interac /** * This represents a single page in a PDF document. * - * @author <a href="mailto:b...@benlitchfield.com">Ben Litchfield</a> - * + * @author Ben Litchfield */ public class PDPage implements COSObjectable { - - /** - * Log instance. - */ private static final Log LOG = LogFactory.getLog(PDPage.class); - private static final int DEFAULT_USER_SPACE_UNIT_DPI = 72; - private static final float MM_TO_UNITS = 1 / (10 * 2.54f) * DEFAULT_USER_SPACE_UNIT_DPI; private COSDictionary page; - private PDResources pageResources; /** @@ -760,17 +752,13 @@ public class PDPage implements COSObject page.setItem(COSName.ANNOTS, COSArrayList.converterToCOSArray(annots)); } - /** - * {@inheritDoc} - */ + @Override public boolean equals(Object other) { return other instanceof PDPage && ((PDPage) other).getCOSObject() == this.getCOSObject(); } - /** - * {@inheritDoc} - */ + @Override public int hashCode() { return this.getCOSDictionary().hashCode(); @@ -778,15 +766,12 @@ public class PDPage implements COSObject /** * Calling this will release all cached information. - * */ - public void clear() + public void clearCache() { if (pageResources != null) { - pageResources.clear(); + pageResources.clearCache(); } - mediaBox = null; - parent = null; } } Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDResources.java URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDResources.java?rev=1606858&r1=1606857&r2=1606858&view=diff ============================================================================== --- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDResources.java (original) +++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDResources.java Mon Jun 30 18:33:45 2014 @@ -101,9 +101,8 @@ public class PDResources implements COSO /** * Calling this will release all cached information. - * */ - public void clear() + public void clearCache() { if (fonts != null) { @@ -128,7 +127,7 @@ public class PDResources implements COSO { for(PDXObject xobject : xobjects.values()) { - xobject.clear(); + xobject.clearCache(); } xobjects.clear(); xobjects = null; Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType3Font.java URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType3Font.java?rev=1606858&r1=1606857&r2=1606858&view=diff ============================================================================== --- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType3Font.java (original) +++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType3Font.java Mon Jun 30 18:33:45 2014 @@ -120,7 +120,7 @@ public class PDType3Font extends PDFont charProcs = null; if (type3Resources != null) { - type3Resources.clear(); + type3Resources.clearCache(); type3Resources = null; } } Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/PDXObject.java URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/PDXObject.java?rev=1606858&r1=1606857&r2=1606858&view=diff ============================================================================== --- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/PDXObject.java (original) +++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/PDXObject.java Mon Jun 30 18:33:45 2014 @@ -132,7 +132,7 @@ public class PDXObject implements COSObj /** * Calling this will release all cached information. */ - public void clear() + public void clearCache() { } } Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/PDImageXObject.java URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/PDImageXObject.java?rev=1606858&r1=1606857&r2=1606858&view=diff ============================================================================== --- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/PDImageXObject.java (original) +++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/PDImageXObject.java Mon Jun 30 18:33:45 2014 @@ -490,9 +490,9 @@ public final class PDImageXObject extend } @Override - public void clear() + public void clearCache() { - super.clear(); + super.clearCache(); cachedImage = null; } } Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/pattern/TilingPaint.java URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/pattern/TilingPaint.java?rev=1606858&r1=1606857&r2=1606858&view=diff ============================================================================== --- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/pattern/TilingPaint.java (original) +++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/pattern/TilingPaint.java Mon Jun 30 18:33:45 2014 @@ -34,10 +34,12 @@ import org.apache.pdfbox.rendering.PageD import org.apache.pdfbox.pdmodel.common.PDRectangle; import org.apache.pdfbox.pdmodel.graphics.color.PDColor; import org.apache.pdfbox.pdmodel.graphics.color.PDColorSpace; +import org.apache.pdfbox.rendering.TilingPatternDrawer; import org.apache.pdfbox.util.Matrix; /** * AWT Paint for a tiling pattern, which consists of a small repeating graphical figure. + * * @author Andreas Lehmkühler * @author John Hewson */ @@ -129,12 +131,12 @@ public class TilingPaint extends Texture matrix.setValue(2, 1, matrix.getValue(2, 1) - (float)rect.getY()); // ty } - PageDrawer drawer = new PageDrawer(renderer); + // TODO: need to make it easy to use a custom TilingPatternDrawer + PageDrawer drawer = new TilingPatternDrawer(renderer); PDRectangle pdRect = new PDRectangle(0, 0, width, height); Graphics2D graphics = image.createGraphics(); drawer.drawTilingPattern(graphics, pattern, pdRect, matrix, colorSpace, color); - drawer.dispose(); graphics.dispose(); return image; Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PDFRenderer.java URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PDFRenderer.java?rev=1606858&r1=1606857&r2=1606858&view=diff ============================================================================== --- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PDFRenderer.java (original) +++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PDFRenderer.java Mon Jun 30 18:33:45 2014 @@ -38,7 +38,7 @@ public class PDFRenderer // TODO keep rendering state such as caches here private boolean clearResourcesAutomatically; - + /** * Creates a new PDFRenderer. * @param document the document to render @@ -51,7 +51,7 @@ public class PDFRenderer /** * Creates a new PDFRenderer. * @param document the document to render - * @param clearResourcesAutomatically indicates that all resources will be cleared automatically after rendering + * @param clearResourcesAutomatically true to clear cached page resources after rendering */ public PDFRenderer(PDDocument document, boolean clearResourcesAutomatically) { @@ -223,12 +223,13 @@ public class PDFRenderer graphics.rotate((float) Math.toRadians(rotationAngle)); } - PageDrawer drawer = new PageDrawer(this); // TODO: need to make it easy to use a custom PageDrawer - drawer.drawPage(graphics, page, cropBox); - drawer.dispose(); + // TODO: need to make it easy to use a custom PageDrawer and TilingPatternDrawer + PageDrawer drawer = new PageDrawer(this, page); + drawer.drawPage(graphics, cropBox); + if (clearResourcesAutomatically) { - page.clear(); + page.clearCache(); } } } Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PageDrawer.java URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PageDrawer.java?rev=1606858&r1=1606857&r2=1606858&view=diff ============================================================================== --- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PageDrawer.java (original) +++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PageDrawer.java Mon Jun 30 18:33:45 2014 @@ -40,7 +40,6 @@ import java.awt.image.Raster; import java.awt.image.WritableRaster; import java.io.IOException; import java.util.HashMap; -import java.util.Iterator; import java.util.List; import java.util.Map; @@ -89,10 +88,9 @@ import org.apache.pdfbox.util.PDFStreamE import org.apache.pdfbox.util.ResourceLoader; /** - * This will paint a page in a PDF document to a graphics context. - * - * @author <a href="mailto:b...@benlitchfield.com">Ben Litchfield</a> + * Paints a page in a PDF document to a Graphics context. * + * @author Ben Litchfield */ public class PageDrawer extends PDFStreamEngine { @@ -102,14 +100,15 @@ public class PageDrawer extends PDFStrea // parent document renderer private final PDFRenderer renderer; + private final PDPage page; // will be null if this is a TilingPatternDrawer private Graphics2D graphics; // clipping winding rule used for the clipping path private int clipWindingRule = -1; private GeneralPath linePath = new GeneralPath(); - private Map<PDFont, Glyph2D> fontGlyph2D = new HashMap<PDFont, Glyph2D>(); - private Map<PDFont, Font> awtFonts = new HashMap<PDFont, Font>(); + private final Map<PDFont, Glyph2D> fontGlyph2D = new HashMap<PDFont, Glyph2D>(); + private final Map<PDFont, Font> awtFonts = new HashMap<PDFont, Font>(); private int pageHeight; @@ -118,10 +117,23 @@ public class PageDrawer extends PDFStrea * * @throws IOException If there is an error loading properties from the file. */ - public PageDrawer(PDFRenderer renderer) throws IOException + public PageDrawer(PDFRenderer renderer, PDPage page) throws IOException { super(ResourceLoader.loadProperties("org/apache/pdfbox/resources/PageDrawer.properties", true)); this.renderer = renderer; + this.page = page; + } + + /** + * Tiling pattern constructor, loads properties from file. + * + * @throws IOException If there is an error loading properties from the file. + */ + PageDrawer(PDFRenderer renderer) throws IOException + { + super(ResourceLoader.loadProperties("org/apache/pdfbox/resources/PageDrawer.properties", true)); + this.renderer = renderer; + this.page = null; } /** @@ -146,12 +158,11 @@ public class PageDrawer extends PDFStrea * This will draw the page to the requested context. * * @param g The graphics context to draw onto. - * @param page The page to draw. * @param pageSize The size of the page to draw. * * @throws IOException If there is an IO error while drawing the page. */ - public void drawPage(Graphics g, PDPage page, PDRectangle pageSize) throws IOException + public void drawPage(Graphics g, PDRectangle pageSize) throws IOException { graphics = (Graphics2D) g; pageHeight = (int)pageSize.getHeight(); @@ -243,30 +254,6 @@ public class PageDrawer extends PDFStrea } /** - * Remove all cached resources. - */ - public void dispose() - { - super.dispose(); - if (fontGlyph2D != null) - { - Iterator<Glyph2D> iter = fontGlyph2D.values().iterator(); - while (iter.hasNext()) - { - iter.next().dispose(); - } - fontGlyph2D.clear(); - fontGlyph2D = null; - } - if (awtFonts != null) - { - awtFonts.clear(); - } - graphics = null; - linePath = null; - } - - /** * You should override this method if you want to perform an action when a text is being processed. * * @param text The text to process Added: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/TilingPatternDrawer.java URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/TilingPatternDrawer.java?rev=1606858&view=auto ============================================================================== --- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/TilingPatternDrawer.java (added) +++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/TilingPatternDrawer.java Mon Jun 30 18:33:45 2014 @@ -0,0 +1,37 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.pdfbox.rendering; + +import java.io.IOException; + +/** + * Tiling pattern drawer. + * + * @author John Hewson + */ +public class TilingPatternDrawer extends PageDrawer +{ + /** + * Tiling pattern constructor, loads properties from file. + * + * @throws java.io.IOException If there is an error loading properties from the file. + */ + public TilingPatternDrawer(PDFRenderer renderer) throws IOException + { + super(renderer); + } +} Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/PDFStreamEngine.java URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/PDFStreamEngine.java?rev=1606858&r1=1606857&r2=1606858&view=diff ============================================================================== --- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/PDFStreamEngine.java (original) +++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/PDFStreamEngine.java Mon Jun 30 18:33:45 2014 @@ -62,15 +62,13 @@ public class PDFStreamEngine private static final Log LOG = LogFactory.getLog(PDFStreamEngine.class); private final Set<String> unsupportedOperators = new HashSet<String>(); - private Map<String, OperatorProcessor> operators = new HashMap<String, OperatorProcessor>(); - - private PDGraphicsState graphicsState; + private final Map<String, OperatorProcessor> operators = new HashMap<String, OperatorProcessor>(); private Matrix textMatrix; private Matrix textLineMatrix; - private Stack<PDGraphicsState> graphicsStack = new Stack<PDGraphicsState>(); + private final Stack<PDGraphicsState> graphicsStack = new Stack<PDGraphicsState>(); - private Stack<PDResources> streamResourcesStack = new Stack<PDResources>(); + private final Stack<PDResources> streamResourcesStack = new Stack<PDResources>(); private int pageRotation; private PDRectangle drawingRectangle; @@ -186,10 +184,10 @@ public class PDFStreamEngine { drawingRectangle = drawingSize; pageRotation = rotation; - graphicsState = new PDGraphicsState(drawingRectangle); + graphicsStack.clear(); + graphicsStack.push(new PDGraphicsState(drawingRectangle)); textMatrix = null; textLineMatrix = null; - graphicsStack.clear(); streamResourcesStack.clear(); } @@ -218,6 +216,13 @@ public class PDFStreamEngine */ public void processSubStream(PDResources resources, COSStream cosStream) throws IOException { + // sanity check + if (drawingRectangle == null) + { + throw new IllegalStateException("Call to processSubStream() before processStream() " + + "or initStream()"); + } + if (resources != null) { streamResourcesStack.push(resources); @@ -227,7 +232,7 @@ public class PDFStreamEngine } finally { - streamResourcesStack.pop().clear(); + streamResourcesStack.pop().clearCache(); } } else @@ -286,6 +291,8 @@ public class PDFStreamEngine // Text or Disp to represent if the values are in text or disp units (no glyph units are // saved). + PDGraphicsState graphicsState = getGraphicsState(); + final float fontSizeText = graphicsState.getTextState().getFontSize(); final float horizontalScalingText = graphicsState.getTextState().getHorizontalScaling() / 100f; final float riseText = graphicsState.getTextState().getRise(); @@ -551,7 +558,7 @@ public class PDFStreamEngine */ public void saveGraphicsState() { - graphicsStack.push(getGraphicsState().clone()); + graphicsStack.push(graphicsStack.peek().clone()); } /** @@ -559,7 +566,7 @@ public class PDFStreamEngine */ public void restoreGraphicsState() { - graphicsState = graphicsStack.pop(); + graphicsStack.pop(); } /** @@ -575,15 +582,7 @@ public class PDFStreamEngine */ public PDGraphicsState getGraphicsState() { - return graphicsState; - } - - /** - * @param value The graphicsState to set. - */ - public void setGraphicsState(PDGraphicsState value) - { - graphicsState = value; + return graphicsStack.peek(); } /** @@ -595,14 +594,6 @@ public class PDFStreamEngine } /** - * @param value The graphicsStates to set. - */ - public void setGraphicsStates(Map<String, PDExtendedGraphicsState> value) - { - streamResourcesStack.peek().setGraphicsStates(value); - } - - /** * @return Returns the textLineMatrix. */ public Matrix getTextLineMatrix() @@ -686,42 +677,8 @@ public class PDFStreamEngine protected float transformWidth(float width) { Matrix ctm = getGraphicsState().getCurrentTransformationMatrix(); - - if (ctm == null) - { - // TODO does the CTM really need to use null? - return width; - } - float x = ctm.getValue(0, 0) + ctm.getValue(1, 0); float y = ctm.getValue(0, 1) + ctm.getValue(1, 1); return width * (float)Math.sqrt((x * x + y * y) * 0.5); } - - /** - * Remove all cached resources. - */ - public void dispose() - { - drawingRectangle = null; - graphicsState = null; - textLineMatrix = null; - textMatrix = null; - if (graphicsStack != null) - { - graphicsStack.clear(); - graphicsStack = null; - } - if (streamResourcesStack != null) - { - streamResourcesStack.clear(); - streamResourcesStack = null; - } - if (operators != null) - { - operators.clear(); - operators = null; - } - unsupportedOperators.clear(); - } } Modified: pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/content/PreflightContentStream.java URL: http://svn.apache.org/viewvc/pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/content/PreflightContentStream.java?rev=1606858&r1=1606857&r2=1606858&view=diff ============================================================================== --- pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/content/PreflightContentStream.java (original) +++ pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/content/PreflightContentStream.java Mon Jun 30 18:33:45 2014 @@ -96,6 +96,7 @@ public class PreflightContentStream exte { try { + initStream(this.processeedPage.findCropBox(), 0); processSubStream(xobj.getResources(), xobj.getCOSStream()); } catch (ContentStreamException e) Modified: pdfbox/trunk/tools/src/main/java/org/apache/pdfbox/tools/ExtractImages.java URL: http://svn.apache.org/viewvc/pdfbox/trunk/tools/src/main/java/org/apache/pdfbox/tools/ExtractImages.java?rev=1606858&r1=1606857&r2=1606858&view=diff ============================================================================== --- pdfbox/trunk/tools/src/main/java/org/apache/pdfbox/tools/ExtractImages.java (original) +++ pdfbox/trunk/tools/src/main/java/org/apache/pdfbox/tools/ExtractImages.java Mon Jun 30 18:33:45 2014 @@ -239,7 +239,7 @@ public class ExtractImages System.out.println( "Writing image:" + name ); write2file( image, name, directJPEG ); - image.clear(); // PDFBOX-2101 get rid of cache ASAP + image.clearCache(); } // maybe there are more images embedded in a form object else if (xobject instanceof PDFormXObject) @@ -250,7 +250,7 @@ public class ExtractImages } } } - resources.clear(); + resources.clearCache(); } // get and write the unmodified JPEG stream