You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by ja...@apache.org on 2014/06/30 20:33:45 UTC

svn commit: r1606858 - in /pdfbox/trunk: pdfbox/src/main/java/org/apache/pdfbox/pdmodel/ pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/ pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/ pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphi...

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:ben@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:ben@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