You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by le...@apache.org on 2011/12/26 17:09:15 UTC

svn commit: r1224747 - /pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/util/PrintImageLocations.java

Author: lehmi
Date: Mon Dec 26 16:09:15 2011
New Revision: 1224747

URL: http://svn.apache.org/viewvc?rev=1224747&view=rev
Log:
PDFBOX-585, PDFBOX-1197: fixed the calculation of the image size, added processing of XImageForms to get all images of a pdf

Modified:
    pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/util/PrintImageLocations.java

Modified: pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/util/PrintImageLocations.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/util/PrintImageLocations.java?rev=1224747&r1=1224746&r2=1224747&view=diff
==============================================================================
--- pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/util/PrintImageLocations.java (original)
+++ pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/util/PrintImageLocations.java Mon Dec 26 16:09:15 2011
@@ -17,12 +17,16 @@
 package org.apache.pdfbox.examples.util;
 
 import org.apache.pdfbox.cos.COSName;
+import org.apache.pdfbox.cos.COSStream;
 import org.apache.pdfbox.exceptions.InvalidPasswordException;
 import org.apache.pdfbox.exceptions.WrappedIOException;
 
 import org.apache.pdfbox.pdmodel.PDDocument;
 import org.apache.pdfbox.pdmodel.PDPage;
+import org.apache.pdfbox.pdmodel.PDResources;
+import org.apache.pdfbox.pdmodel.graphics.PDGraphicsState;
 import org.apache.pdfbox.pdmodel.graphics.xobject.PDXObject;
+import org.apache.pdfbox.pdmodel.graphics.xobject.PDXObjectForm;
 import org.apache.pdfbox.pdmodel.graphics.xobject.PDXObjectImage;
 import org.apache.pdfbox.util.Matrix;
 import org.apache.pdfbox.util.PDFOperator;
@@ -46,6 +50,8 @@ import java.util.Map;
  */
 public class PrintImageLocations extends PDFStreamEngine
 {
+    
+    private static final String INVOKE_OPERATOR = "Do";
     /**
      * Default constructor.
      *
@@ -118,42 +124,80 @@ public class PrintImageLocations extends
     protected void processOperator( PDFOperator operator, List arguments ) throws IOException
     {
         String operation = operator.getOperation();
-        if( operation.equals( "Do" ) )
+        if( INVOKE_OPERATOR.equals(operation) )
         {
             COSName objectName = (COSName)arguments.get( 0 );
-            Map xobjects = getResources().getXObjects();
+            Map<String, PDXObject> xobjects = getResources().getXObjects();
             PDXObject xobject = (PDXObject)xobjects.get( objectName.getName() );
             if( xobject instanceof PDXObjectImage )
             {
-                try
+                PDXObjectImage image = (PDXObjectImage)xobject;
+                PDPage page = getCurrentPage();
+                int imageWidth = image.getWidth();
+                int imageHeight = image.getHeight();
+                double pageHeight = page.getMediaBox().getHeight();
+                System.out.println("*******************************************************************");
+                System.out.println("Found image [" + objectName.getName() + "]");
+        
+                Matrix ctmNew = getGraphicsState().getCurrentTransformationMatrix();
+                float yScaling = ctmNew.getYScale();
+                float angle = (float)Math.acos(ctmNew.getValue(0, 0)/ctmNew.getXScale());
+                if (ctmNew.getValue(0, 1) < 0 && ctmNew.getValue(1, 0) > 0)
                 {
-                    PDXObjectImage image = (PDXObjectImage)xobject;
-                    PDPage page = getCurrentPage();
-                    Matrix ctm = getGraphicsState().getCurrentTransformationMatrix();
-                    double rotationInRadians =(page.findRotation() * Math.PI)/180;
-
-
-                    AffineTransform rotation = new AffineTransform();
-                    rotation.setToRotation( rotationInRadians );
-                    AffineTransform rotationInverse = rotation.createInverse();
-                    Matrix rotationInverseMatrix = new Matrix();
-                    rotationInverseMatrix.setFromAffineTransform( rotationInverse );
-                    Matrix rotationMatrix = new Matrix();
-                    rotationMatrix.setFromAffineTransform( rotation );
-
-                    Matrix unrotatedCTM = ctm.multiply( rotationInverseMatrix );
-                    float xScale = unrotatedCTM.getXScale();
-                    float yScale = unrotatedCTM.getYScale();
-
-                    System.out.println( "Found image[" + objectName.getName() + "] " +
-                            "at " + unrotatedCTM.getXPosition() + "," + unrotatedCTM.getYPosition() +
-                            " size=" + (xScale/100f*image.getWidth()) + "," + (yScale/100f*image.getHeight() ));
+                    angle = (-1)*angle;
+                }
+                ctmNew.setValue(2, 1, (float)(pageHeight - ctmNew.getYPosition() - Math.cos(angle)*yScaling));
+                ctmNew.setValue(2, 0, (float)(ctmNew.getXPosition() - Math.sin(angle)*yScaling));
+                // because of the moved 0,0-reference, we have to shear in the opposite direction
+                ctmNew.setValue(0, 1, (-1)*ctmNew.getValue(0, 1));
+                ctmNew.setValue(1, 0, (-1)*ctmNew.getValue(1, 0));
+                AffineTransform ctmAT = ctmNew.createAffineTransform();
+                ctmAT.scale(1f/imageWidth, 1f/imageHeight);
+
+                float imageXScale = ctmNew.getXScale();
+                float imageYScale = ctmNew.getYScale();
+                System.out.println("position = " + ctmNew.getXPosition() + ", " + ctmNew.getYPosition());
+                // size in pixel
+                System.out.println("size = " + imageWidth + "px, " + imageHeight + "px");
+                // size in page units
+                System.out.println("size = " + imageXScale + ", " + imageYScale);
+                // size in inches 
+                imageXScale /= 72;
+                imageYScale /= 72;
+                System.out.println("size = " + imageXScale + "in, " + imageYScale + "in");
+                // size in millimeter
+                imageXScale *= 25.4;
+                imageYScale *= 25.4;
+                System.out.println("size = " + imageXScale + "mm, " + imageYScale + "mm");
+                System.out.println();
+            }
+            else if(xobject instanceof PDXObjectForm)
+            {
+                // save the graphics state
+                getGraphicsStack().push( (PDGraphicsState)getGraphicsState().clone() );
+                PDPage page = getCurrentPage();
+                
+                PDXObjectForm form = (PDXObjectForm)xobject;
+                COSStream invoke = (COSStream)form.getCOSObject();
+                PDResources pdResources = form.getResources();
+                if(pdResources == null)
+                {
+                    pdResources = page.findResources();
                 }
-                catch( NoninvertibleTransformException e )
+                // if there is an optional form matrix, we have to
+                // map the form space to the user space
+                Matrix matrix = form.getMatrix();
+                if (matrix != null) 
                 {
-                    throw new WrappedIOException( e );
+                    Matrix xobjectCTM = matrix.multiply( getGraphicsState().getCurrentTransformationMatrix());
+                    getGraphicsState().setCurrentTransformationMatrix(xobjectCTM);
                 }
+                processSubStream( page, pdResources, invoke );
+                
+                // restore the graphics state
+                setGraphicsState( (PDGraphicsState)getGraphicsStack().pop() );
             }
+            
         }
         else
         {