title: PDFBox how to get the upper-left coordinates of an Image?
body: <p>I'm using the following script to get the image positions within a Page. How can I transfer them to Pixel coordinates of the upper-left Corner? Because I want to create a Rectangle based on the position and size of the image and compare it to another Rectangle.</p>
  
  <pre><code>/*
   * 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.examples.util;
  
  import org.apache.pdfbox.cos.COSBase;
  import org.apache.pdfbox.cos.COSName;
  import org.apache.pdfbox.pdmodel.PDDocument;
  import org.apache.pdfbox.pdmodel.PDPage;
  import org.apache.pdfbox.pdmodel.graphics.PDXObject;
  import org.apache.pdfbox.pdmodel.graphics.form.PDFormXObject;
  import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
  import org.apache.pdfbox.util.Matrix;
  import org.apache.pdfbox.contentstream.operator.DrawObject;
  import org.apache.pdfbox.contentstream.operator.Operator;
  import org.apache.pdfbox.contentstream.PDFStreamEngine;
  
  import java.io.File;
  import java.io.IOException;
  import java.util.List;
  
  import org.apache.pdfbox.contentstream.operator.state.Concatenate;
  import org.apache.pdfbox.contentstream.operator.state.Restore;
  import org.apache.pdfbox.contentstream.operator.state.Save;
  import org.apache.pdfbox.contentstream.operator.state.SetGraphicsStateParameters;
  import org.apache.pdfbox.contentstream.operator.state.SetMatrix;
  
  /**
   * This is an example on how to get the x/y coordinates of image locations.
   *
   * @author Ben Litchfield
   */
  public class PrintImageLocations extends PDFStreamEngine
  {
      /**
       * Default constructor.
       *
       * @throws IOException If there is an error loading text stripper properties.
       */
      public PrintImageLocations() throws IOException
      {
          addOperator(new Concatenate());
          addOperator(new DrawObject());
          addOperator(new SetGraphicsStateParameters());
          addOperator(new Save());
          addOperator(new Restore());
          addOperator(new SetMatrix());
      }
  
      /**
       * This will print the documents data.
       *
       * @param args The command line arguments.
       *
       * @throws IOException If there is an error parsing the document.
       */
      public static void main( String[] args ) throws IOException
      {
          if( args.length != 1 )
          {
              usage();
          }
          else
          {
              PDDocument document = null;
              try
              {
                  document = PDDocument.load( new File(args[0]) );
                  PrintImageLocations printer = new PrintImageLocations();
                  int pageNum = 0;
                  for( PDPage page : document.getPages() )
                  {
                      pageNum++;
                      System.out.println( "Processing page: " + pageNum );
                      printer.processPage(page);
                  }
              }
              finally
              {
                  if( document != null )
                  {
                      document.close();
                  }
              }
          }
      }
  
      /**
       * This is used to handle an operation.
       *
       * @param operator The operation to perform.
       * @param operands The list of arguments.
       *
       * @throws IOException If there is an error processing the operation.
       */
      @Override
      protected void processOperator( Operator operator, List&lt;COSBase&gt; operands) throws IOException
      {
          String operation = operator.getName();
          if( "Do".equals(operation) )
          {
              COSName objectName = (COSName) operands.get( 0 );
              PDXObject xobject = getResources().getXObject( objectName );
              if( xobject instanceof PDImageXObject)
              {
                  PDImageXObject image = (PDImageXObject)xobject;
                  int imageWidth = image.getWidth();
                  int imageHeight = image.getHeight();
                  System.out.println("*******************************************************************");
                  System.out.println("Found image [" + objectName.getName() + "]");
  
                  Matrix ctmNew = getGraphicsState().getCurrentTransformationMatrix();
                  float imageXScale = ctmNew.getScalingFactorX();
                  float imageYScale = ctmNew.getScalingFactorY();
  
                  // position in user space units. 1 unit = 1/72 inch at 72 dpi
                  System.out.println("position in PDF = " + ctmNew.getTranslateX() + ", " + ctmNew.getTranslateY() + " in user space units");
                  // raw size in pixels
                  System.out.println("raw image size  = " + imageWidth + ", " + imageHeight + " in pixels");
                  // displayed size in user space units
                  System.out.println("displayed size  = " + imageXScale + ", " + imageYScale + " in user space units");
                  // displayed size in inches at 72 dpi rendering
                  imageXScale /= 72;
                  imageYScale /= 72;
                  System.out.println("displayed size  = " + imageXScale + ", " + imageYScale + " in inches at 72 dpi rendering");
                  // displayed size in millimeters at 72 dpi rendering
                  imageXScale *= 25.4;
                  imageYScale *= 25.4;
                  System.out.println("displayed size  = " + imageXScale + ", " + imageYScale + " in millimeters at 72 dpi rendering");
                  System.out.println();
              }
              else if(xobject instanceof PDFormXObject)
              {
                  PDFormXObject form = (PDFormXObject)xobject;
                  showForm(form);
              }
          }
          else
          {
              super.processOperator( operator, operands);
          }
      }
  
      /**
       * This will print the usage for this document.
       */
      private static void usage()
      {
          System.err.println( "Usage: java " + PrintImageLocations.class.getName() + " &lt;input-pdf&gt;" );
      }
  
  }
  </code></pre>
  
  <p>Source: <a href="https://svn.apache.org/repos/asf/pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/util/PrintImageLocations.java" rel="nofollow">https://svn.apache.org/repos/asf/pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/util/PrintImageLocations.java</a></p>
  
  <p>Possible Formula to get the coordinates of the upper left edge:</p>
  
  <pre><code>X1 = ctmNew.getTranslateX() * topixelfactor
  Y1 = pageheight - ctmNew.getTranslateY() * toPixelFactor - imageHeight
  </code></pre>
  
  <p>I can get the pageHeight by page.getMediaBox().getHeight(); But the problem is to calculate the "toPixelFactor" as the Translation from ctmNew.getTranslateY() is given in User Space Units and not in Pixel.</p>