pdfbox,PDFRenderer.renderImagegetWidth和PDImageXObject.getImagegetWidth返回不同比例的数字吗?

问题描述

我使用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”大于实际大小。下图显示了实际比率(整页与红色框)。

enter image description here

解决方法

您确定页面大小的方法

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页面的默认用户空间单位。默认情况下,它们等于 1 / 72 英寸。

您可以按以下用户空间单位来获取PDPage page的页面大小:

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

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

PDFBox示例PrintImageLocations对此进行了演示,您正在寻找的输出“显示的大小= XXX,以用户空间单位表示的YYY”。