pdfbox,PDFRenderer.renderImage().getWidth() 和 PDImageXObject.getImage().getWidth() return 不同比例的数字?

pdfbox, PDFRenderer.renderImage().getWidth() and PDImageXObject.getImage().getWidth() return numbers in different scale?

我用pdfbox把pdf转成图片,发现PDFRenderer和PDImageXObject返回的宽度好像比例不一样。 如何获得相同比例的宽度?

这是我获取页面宽度的方式:

PDFRenderer pdRender = new PDFRenderer(pdDoc);
BufferedImage singlePage = pdRender.renderImage(pgIdx-1);
singlePage.getWidth();  // pageWidth = 623

这就是我获取图像块宽度的方式:

PDImageXObject image = (PDImageXObject) o;
image.getImage();  // imageWidth = 484

“pageWidth”是图像元数据中显示的实际尺寸,但“imageWidth”比实际尺寸大。实际比例如下图所示(整页对比红框)。

您确定页面大小的方式

PDFRenderer pdRender = new PDFRenderer(pdDoc);
BufferedImage singlePage = pdRender.renderImage(pgIdx-1);
singlePage.getWidth();  // pageWidth = 623

正在使用一些默认设置将页面呈现为位图后确定页面宽度(以像素为单位),尤其是在某些未知分辨率下。

您确定图像尺寸的方法

PDImageXObject image = (PDImageXObject) o;
image.getImage();  // imageWidth = 484

确定位图资源的实际尺寸,而不考虑它在页面上的使用方式(如果有的话)。

因此,这些数字完全无关。


如果您想比较 PDF 页面上的大小,自然选择的单位是 PDF 页面的默认用户 space 单位。默认情况下,它们等于 1/72 英寸。

您可以像这样以用户 space 为单位检索 PDPage page 的页面大小:

PDRectangle cropBox = page.getCropBox();
float width = cropBox.getWidth();
float height = cropBox.getHeight();

PDF 页面上位图的尺寸有点困难,因为位图受到任意仿射变换,当前变换矩阵 (CTM) 当时它被绘制。因此,您必须确定该 CTM 值。为此,您必须将页面内容解析到绘制位图的位置,然后您必须从当前转换矩阵中读取 CTM。

PDFBox 示例 PrintImageLocations 演示了这一点,输出“以用户 space 单位显示的大小 = XXX,YYY”就是您要找的那个。