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