问题描述
我使用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页面的默认用户空间单位。默认情况下,它们等于 1 / 72 英寸。
您可以按以下用户空间单位来获取PDPage page
的页面大小:
PDRectangle cropBox = page.getCropBox();
float width = cropBox.getWidth();
float height = cropBox.getHeight();
PDF页面上位图的尺寸要困难一些,因为位图会受到任意仿射变换,即绘制时的当前变换矩阵(CTM)。因此,您必须确定该CTM值。为此,您必须解析页面内容直到绘制位图为止,然后必须从当前转换矩阵中读取CTM。
PDFBox示例PrintImageLocations
对此进行了演示,您正在寻找的输出“显示的大小= XXX,以用户空间单位表示的YYY”。