将 PDFBox 坐标转换为 PDPage::convertToImage 的像素坐标
Converting PDFBox coordinates to pixel coordinates of PDPage::convertToImage
我正在使用 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 的像素位置?
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
。
我正在使用 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 的像素位置?
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
。