You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@pdfbox.apache.org by Hartmann Toël <To...@elanders.com> on 2016/02/24 16:28:48 UTC

exampes/util/PrintImageLocations.java

Hi,

The example in exampes/util/PrintImageLocations.java in pdfbox-2.0.0-RC3 seems faulty.

Would this output more correct values?

             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 scalingFactorX = ctmNew.getScalingFactorX();
                   float scalingFactorY = ctmNew.getScalingFactorY();
                   System.out.println("position = " + ctmNew.getTranslateX() + ", " + ctmNew.getTranslateY());
                   // size in pixel
                   System.out.println("size = " + imageWidth + "px, " + imageHeight + "px");
                   // size in page units
                   System.out.println("size = " + imageWidth*scalingFactorX + "pu, " + imageHeight*scalingFactorY + "pu");
                   // size in inches
                   scalingFactorX /= 72;
                   scalingFactorY /= 72;
                   System.out.println("size = " + imageWidth*scalingFactorX + "in, " + imageHeight*scalingFactorY + "in");
                   // size in millimeter
                   scalingFactorX *= 25.4;
                   scalingFactorY *= 25.4;
                   System.out.println("size = " + imageWidth*scalingFactorX + "mm, " + imageHeight*scalingFactorY + "mm");
                   System.out.println();
                   (…)

How to get the size of the image as it will be actually rendered? The scaling factor seem to be 1 even if the image is heavily scaled like in this example pdf:
http://files.m3lite.elanders.com/temp/image2.pdf

 I am trying to compute a DPI estimation for each included images, in order to have an estimation of the print result quality.


/Toël


On 7 jul 2015, at 17:43, Tilman Hausherr <TH...@t-online.de>> wrote:

Am 07.07.2015 um 10:56 schrieb Manfred Pock:
Hi,

is there a possiblity that i can get the rotation of an PDImageObject.

The rotation of the page is 90 degrees, and it seems to be that the
embedded Pdimage also have this rotation.
How can i get this information from PDImage-Obj?

Not at all. The rotation of an image depends of the CTM (current
transformation matrix). See the PrintImageLocations.java example from
the source code download
https://svn.apache.org/viewvc/pdfbox/branches/1.8/examples/src/main/java/org/apache/pdfbox/examples/util/PrintImageLocations.java?view=markup&sortby=date
you'd have to expand this to output the rotation.

Tilman

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@pdfbox.apache.org
For additional commands, e-mail: dev-help@pdfbox.apache.org



Re: exampes/util/PrintImageLocations.java

Posted by Hartmann Toël <To...@elanders.com>.
Hi,

This is exactly what I was trying to achieve!

> Here's an additional line from my answer at
> https://stackoverflow.com/questions/5472711/dpi-of-image-extracted-from-pdf-with-pdfbox
> but which I am starting to doubt, I suspect it is either wrong or 
> incomplete because the dpi of an image would depend of the dpi of a 
> rendering.


Yes: exactly.
The eventual DPI information in the image metadata is not relevant at all either: What counts is the size of the image in pixels and the actual size while rendering.

Thank you very much.


/Toël

On 25 feb 2016, at 18:00, Tilman Hausherr <TH...@t-online.de> wrote:

> Am 24.02.2016 um 16:28 schrieb Hartmann Toël:
>> Hi,
>> 
>> The example in exampes/util/PrintImageLocations.java in pdfbox-2.0.0-RC3 seems faulty.
>> 
>> Would this output more correct values?
>> 
>>              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 scalingFactorX = ctmNew.getScalingFactorX();
>>                    float scalingFactorY = ctmNew.getScalingFactorY();
>>                    System.out.println("position = " + ctmNew.getTranslateX() + ", " + ctmNew.getTranslateY());
>>                    // size in pixel
>>                    System.out.println("size = " + imageWidth + "px, " + imageHeight + "px");
>>                    // size in page units
>>                    System.out.println("size = " + imageWidth*scalingFactorX + "pu, " + imageHeight*scalingFactorY + "pu");
>>                    // size in inches
>>                    scalingFactorX /= 72;
>>                    scalingFactorY /= 72;
>>                    System.out.println("size = " + imageWidth*scalingFactorX + "in, " + imageHeight*scalingFactorY + "in");
>>                    // size in millimeter
>>                    scalingFactorX *= 25.4;
>>                    scalingFactorY *= 25.4;
>>                    System.out.println("size = " + imageWidth*scalingFactorX + "mm, " + imageHeight*scalingFactorY + "mm");
>>                    System.out.println();
>>                    (…)
>> 
>> How to get the size of the image as it will be actually rendered? The scaling factor seem to be 1 even if the image is heavily scaled like in this example pdf:
>> http://files.m3lite.elanders.com/temp/image2.pdf
>> 
>>  I am trying to compute a DPI estimation for each included images, in order to have an estimation of the print result quality.
>> 
> 
> The code you quoted (and changed) is kindof hard to understand.
> 
> If an image would be rendered with a scaling 1 and a zero translation (1 
> 0 0 1 0 0), it would appear as a single dot at the bottom left. So it 
> has to be scaled, i.e. the current transformation matrix (CTM) must be 
> set. A simple solution would be to set the CTM scale at the sizes of the 
> image, and the translation (= move) at the wished position: (width 0 0 
> height xpos ypos)
> 
> I don't understand your changes and the output doesn't make sense. 
> However here's some improved code which I intend to commit. The logic is 
> the same, but the output text is different to be less confusing 
> (hopefully). Please try it.
> 
>                 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();
> 
> Here's an additional line from my answer at
> https://stackoverflow.com/questions/5472711/dpi-of-image-extracted-from-pdf-with-pdfbox
> but which I am starting to doubt, I suspect it is either wrong or 
> incomplete because the dpi of an image would depend of the dpi of a 
> rendering.
> 
>                 System.out.printf("dpi  = %.0f dpi (X), %.0f dpi (Y) 
> %n", image.getWidth() * 72 / ctmNew.getScalingFactorX(), 
> image.getHeight() * 72 / ctmNew.getScalingFactorY());
> 
> And here's the output that you'd get with the new code:
> 
> Found image [Im0]
> position in PDF = 196.97, 76.156296 in user space units
> raw image size  = 600, 599 in pixels
> displayed size  = 192.636, 630.630.492 in user space units
> displayed size  = 2.6755, 8.756833 in inches at 72 dpi rendering
> displayed size  = 67.957695, 222.42355 in millimeters at 72 dpi rendering
> dpi  = 224 dpi (X), 68 dpi (Y)
> 
> The Y "dpi" value (68) makes sense because it is close to 72 dpi: your 
> image has an Y pixel size of 599. You're streching it to 630, so it will 
> be slightly less dpi than 72. The X makes sense too: the display size 
> (192) is about 1/3, so the dpi is about 3x. 72 x 3 = 216 which is quite 
> close to the 224.
> 
> Hope this helped!
> 
> Tilman
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscribe@pdfbox.apache.org
> For additional commands, e-mail: dev-help@pdfbox.apache.org
> 


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@pdfbox.apache.org
For additional commands, e-mail: dev-help@pdfbox.apache.org


Re: exampes/util/PrintImageLocations.java

Posted by Tilman Hausherr <TH...@t-online.de>.
Am 24.02.2016 um 16:28 schrieb Hartmann Toël:
> Hi,
>
> The example in exampes/util/PrintImageLocations.java in pdfbox-2.0.0-RC3 seems faulty.
>
> Would this output more correct values?
>
>               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 scalingFactorX = ctmNew.getScalingFactorX();
>                     float scalingFactorY = ctmNew.getScalingFactorY();
>                     System.out.println("position = " + ctmNew.getTranslateX() + ", " + ctmNew.getTranslateY());
>                     // size in pixel
>                     System.out.println("size = " + imageWidth + "px, " + imageHeight + "px");
>                     // size in page units
>                     System.out.println("size = " + imageWidth*scalingFactorX + "pu, " + imageHeight*scalingFactorY + "pu");
>                     // size in inches
>                     scalingFactorX /= 72;
>                     scalingFactorY /= 72;
>                     System.out.println("size = " + imageWidth*scalingFactorX + "in, " + imageHeight*scalingFactorY + "in");
>                     // size in millimeter
>                     scalingFactorX *= 25.4;
>                     scalingFactorY *= 25.4;
>                     System.out.println("size = " + imageWidth*scalingFactorX + "mm, " + imageHeight*scalingFactorY + "mm");
>                     System.out.println();
>                     (…)
>
> How to get the size of the image as it will be actually rendered? The scaling factor seem to be 1 even if the image is heavily scaled like in this example pdf:
> http://files.m3lite.elanders.com/temp/image2.pdf
>
>   I am trying to compute a DPI estimation for each included images, in order to have an estimation of the print result quality.
>

The code you quoted (and changed) is kindof hard to understand.

If an image would be rendered with a scaling 1 and a zero translation (1 
0 0 1 0 0), it would appear as a single dot at the bottom left. So it 
has to be scaled, i.e. the current transformation matrix (CTM) must be 
set. A simple solution would be to set the CTM scale at the sizes of the 
image, and the translation (= move) at the wished position: (width 0 0 
height xpos ypos)

I don't understand your changes and the output doesn't make sense. 
However here's some improved code which I intend to commit. The logic is 
the same, but the output text is different to be less confusing 
(hopefully). Please try it.

                 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();

Here's an additional line from my answer at
https://stackoverflow.com/questions/5472711/dpi-of-image-extracted-from-pdf-with-pdfbox
but which I am starting to doubt, I suspect it is either wrong or 
incomplete because the dpi of an image would depend of the dpi of a 
rendering.

                 System.out.printf("dpi  = %.0f dpi (X), %.0f dpi (Y) 
%n", image.getWidth() * 72 / ctmNew.getScalingFactorX(), 
image.getHeight() * 72 / ctmNew.getScalingFactorY());

And here's the output that you'd get with the new code:

Found image [Im0]
position in PDF = 196.97, 76.156296 in user space units
raw image size  = 600, 599 in pixels
displayed size  = 192.636, 630.630.492 in user space units
displayed size  = 2.6755, 8.756833 in inches at 72 dpi rendering
displayed size  = 67.957695, 222.42355 in millimeters at 72 dpi rendering
dpi  = 224 dpi (X), 68 dpi (Y)

The Y "dpi" value (68) makes sense because it is close to 72 dpi: your 
image has an Y pixel size of 599. You're streching it to 630, so it will 
be slightly less dpi than 72. The X makes sense too: the display size 
(192) is about 1/3, so the dpi is about 3x. 72 x 3 = 216 which is quite 
close to the 224.

Hope this helped!

Tilman


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@pdfbox.apache.org
For additional commands, e-mail: dev-help@pdfbox.apache.org