【问题标题】:pdfbox, PDFRenderer.renderImage().getWidth() and PDImageXObject.getImage().getWidth() return numbers in different scale?pdfbox、PDFRenderer.renderImage().getWidth() 和 PDImageXObject.getImage().getWidth() 返回不同比例的数字?
【发布时间】:2020-08-25 00:46:44
【问题描述】:

我用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”大于实际大小。实际比例如下图所示(整页与红框)。

【问题讨论】:

    标签: java pdfbox


    【解决方案1】:

    确定页面大小的方式

    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 演示了这一点,输出“displayed size = XXX, YYY in user space units”就是您要查找的。​​p>

    【讨论】:

    • 谢谢,我昨晚还参考了 PrintImageLocations 示例,发现用户空间单位似乎是正确的数字,您刚刚确认了这一点 :-)
    猜你喜欢
    • 2011-09-02
    • 2014-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多