如何在itext中获得pdf矩形区域的坐标原因解决方案?itext5itext7的几种常见坐标偏移方法总结了如何在itext中获得pdf矩形区域的坐标原因。最近,当使用itext工具进行PDF电子签名时,PDF区域外的印章签名出现了问题,XPDF的默认坐标系是X、Y坐标轴的起源,在线业务中相同的签名坐标参数在一些PDF上,签名位置偏移,花了很长时间踩坑,以下是解决方案和盖章错位的原因。
PDRectanglele解决方案 pdRectangle = pdfPage.getMediaBox();获取PDF创建时设置的矩形坐标位置,并根据偏移量重新计算需要盖章的坐标位置。
itext5加载pdf后,获得pdf坐标和页面宽度
PDDocument document = PDDocument.load(bytes);PDPage pdPage = document.getPage(1);PDRectangle pdRectangle = pdPage.getMediaBox();float x = pdRectangle.getLowerLeftX();float y = pdRectangle.getLowerLeftY();float pageW = pdRectangle.getWidth();float pageH = pdRectangle.getHeight();pdf在坐标轴中的位置可以通过y坐标值来判断,在创建页面尺寸时,设置了上述四个数据:Rectangle rectangle = new Rectangle(0, 0, 50000, 50000);(0,0,595.27563F,841.8898F)这个尺寸也是itext中A4纸的大小,本文为了便于计算和理解,PDF尺寸统一设置为5万。
常见的PDF是垂直的,与我们通常的阅读习惯相同。当然,我们也会遇到PDF旋转变为水平的情况。因此,有必要根据旋转角度改变PDF的宽度和高度。转换方法:
///根据pdf旋转角度转换PDFint rotation = pdPage.getRotation();boolean rotate = rotation == 90 || rotation == 270;float pageW = rotate ? pdPage.getCropBox().getHeight() : pdPage.getCropBox().getWidth();float pageH = rotate ? pdPage.getCropBox().getWidth() : pdPage.getCropBox().getHeight();在itext7中,12345itext7获得矩形坐标的方式略有不同
PDDocument document = PDDocument.load(bytes);PDPage pdPage = document.getPage(1);PDRectangle pdRectangle = pdPage.getMediaBox();float x = pdRectangle.getX();float y = pdRectangle.getY();float w = pdRectangle.getWidth();float h = pdRectangle.getHeight();当我们进行电子签名时,1234567常见的几种坐标偏移方式,默认情况下,设置的坐标值以pdf左下角为坐标原点,但在一些pdf中,由于在创建过程中修改了坐标原点,调用itext签名方法设置的坐标不准确。例如,在pdf之外经常显示签名,坐标原点不是(0、0、0、xxx,xxx)PDF电子签名时,需要根据偏移量重新计算。
首先,我们将PDF平均分为5万份,统一坐标系统后,前端获得坐标时,x/y坐标范围为(0-50000),调用itext签名方法时x=x/50000*pagew.一般模式
以下特殊情况:
一般情况下,PDF页面在坐标系中的位置沿Y轴向下移动,所以我们在计算签名坐标时,也以左下角为坐标原点。然而,当PDF创建者创建PDF时,也会出现修改签名坐标的问题。例如,在创建PDF时,设置PDF坐标区域为(0、-5万、5万、0)。在这种情况下,PDF坐标被移动,但在计算签名位置时,我们仍然从左下角开始,因此,在计算签名位置时,itext包在PDF区域外覆盖印章图片,因此我们需要重新计算y坐标,计算公式为y=coordinateY-50000。
为什么要使用前端获得的坐标y-5000,因为y坐标来自y轴-pageH(-5万)开始计算,通常我们的签名位置是(1万,1万)。在下图模式下,需要改为(1万,-4万),如图所示。
在我目前遇到的情况下,沿X轴的偏移并没有改变X轴的坐标。在我的推测中,沿X轴偏移的PDF矩形坐标是(-5万,0,0,5万),但实际上,由于PDF的旋转(旋转90°),会导致PDF沿X轴左移,获得实际坐标或(0,-5万,5万,0),如下图所示:
这种偏移方式也可以理解为Y轴偏移的特殊情况,需要通过PDF的旋转角度来判断。PDF旋转角度:int rotation = pdPage.getRotation();
PDF的旋转角度为90°,此时需要重新计算x坐标,计算方法为x=coordinatex-50000
总结创建PDF时,Rectangle rectangle = new Rectangle(x, y, pdfWidth, pdfHeight);,尽量不要修改默认坐标位置。也就是说,使用Rectangle rectangle = new Rectangle(0, 0, 595.27563, 841.8898F);如果以这种方式创建,如果修改x、y参数,虽然pdf在阅读器中的显示没有问题,但在电子签名pdf时,签名坐标会被x接受、y参数的影响。
参考:itext官方社区:https://kb.itextpdf.com/home/it5kb/faq/how-should-i-interpret-the-coordinates-of-a-rectangle-in-pdf