【问题标题】:Converting PDFBox coordinates to pixel coordinates of PDPage::convertToImage将 PDFBox 坐标转换为 PDPage::convertToImage 的像素坐标
【发布时间】:2015-08-20 22:54:41
【问题描述】:

我正在使用 PDFBox 的 PDPage::convertToImage 以 Java 显示 PDF 页面。我正在尝试根据页面中的COSObjects(即 AcroForm 字段)在 PDF 页面的图像上创建可点击区域。问题是 PDF 似乎使用了完全不同的坐标系:

System.out.println(field.getDictionary().getItem(COSName.RECT));

产量

COSArray{[COSFloat{149.04}, COSFloat{678.24}, COSInt{252}, COSFloat{697.68}]}

如果我要估计图像上字段矩形的实际尺寸,它将是 40,40,50,10 (x,y,width,height)。两者之间没有明显的相关性,我似乎无法通过 Google 找到任何相关信息。

如何确定 PDPage 的 COSObjects 的像素位置?

【问题讨论】:

    标签: java pdf coordinates pdfbox


    【解决方案1】:

    pdf 坐标系与图像中使用的坐标系没有不同。唯一的区别是:

    • y 轴指向向上,而不是向下
    • 规模很可能不同。

    您可以使用以下公式将 pdf 坐标转换为图像坐标:

    x_image = x_pdf * width_image / width_page
    y_image = (height_pdf - y_pdf) * height_image / height_pdf
    

    要获取页面大小,只需使用包含注释的页面的媒体框大小:

    PDRectangle pageBounds = page.getMediaBox();
    

    您可能错过了 pdf 中的数组与图像坐标估计值之间的相关性,因为 pdf 中的矩形表示为数组 [x_left, y_bottom, x_right, y_top]

    幸运的是,PDFBox 提供了在比 cos 结构更高级别上运行的类。将其用于您的优势并使用例如PDRectangle 您使用 getRectangle()PDAnnotation 获得,而不是访问您从字段字典中提取的 COSArray

    【讨论】:

    • 谢谢!我看不到获取字段相应注释的明确方法。遍历所有字段和注释并通过字典映射它们的最佳方式是(derived from this answer)吗?此外,根据该答案,似乎可以有一个没有注释的字段。使用低级别的COSObject 来避免这些问题会更好吗?
    • 我还注意到,如果我使用int width = x_right - x_left;/int height = y_top - y_bottom; 获得字段的宽度/高度,我将分别获得宽度和高度的一半。
    • @roundar:字段的可视化表示是注释小部件,您可以从页面的注释列表中访问它们。可能还有其他注释,但您可以检查子类型是否为WidgetPDFields 也有一个 getWidget() 方法,但我不建议使用它,除非您确定字段类型是什么,因为它会尝试定位小部件,即使对于没有视觉表示的字段,这也需要您可以通过字段进行树遍历。 PS:您最后的评论是否意味着我的公式不起作用或者这只是一个观察?
    • 太好了,谢谢。公式确实有效,我只是观察到,在比较COSArray(或PDRectangle)的各个x和y分量的差异时,由于某种我无法直观看到的原因,你必须将它乘以2以获得实际字段的准确宽度和高度。如果您知道为什么会这样,则可能值得为后代添加答案。
    猜你喜欢
    • 1970-01-01
    • 2020-07-05
    • 2013-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-11
    • 1970-01-01
    相关资源
    最近更新 更多