IText PDF签章时如何获取PDF页的坐标

发布时间:2021-07-10 14:46:32 作者:chen
来源:亿速云 阅读:901

这篇文章主要介绍“IText PDF签章时如何获取PDF页的坐标”,在日常操作中,相信很多人在IText PDF签章时如何获取PDF页的坐标问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”IText PDF签章时如何获取PDF页的坐标”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

在itext中如何获取pdf矩形区域的坐标

起因

最近在使用ITEXT工具做PDF的电子签章时发生了印章签在PDF区域外的问题,PDF的默认坐标系为X、Y坐标轴的原点,线上业务中同样的签章坐标参数在部分PDF上,发生了签章位置偏移的问题,花了很长时间踩坑,以下是解决方法和盖章错位的原因。

解决方法

使用PDRectangle 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();

可通过y坐标值来判断pdf在坐标轴中的位置,以上四个数据,为创建页面尺寸时设置的: Rectangle rectangle = new Rectangle(0, 0, 50000, 50000); (0,0,595.27563F,841.8898F)这个尺寸也是itext中一张A4纸的大小,本文为了方便计算和理解,统一将PDF尺寸设置为50000。

常见的PDF为纵向,与我们平时阅读习惯相同,当然也会遇到pdf旋转,变为横向的情况,因此需要根据旋转角度,转换pdf的宽高,转换方式:

//根据pdf旋转角度,转换PDF
int 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

在itext7中,获取矩形坐标方式略有不同

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();

常见的几种坐标偏移方式

我们在进行电子签名时,设置的坐标值默认以pdf左下角为坐标原点,但是某些pdf中,因为在创建时,修改了坐标原点,导致调用itext签名方法设置的坐标不准确,比如经常签章显示在pdf外,坐标原点不为(0,0,xxx,xxx)时,进行PDF的电子签章时需要根据偏移量重新计算。

首先,我们将PDF平均分为50000份,这样统一了坐标体系后,前端获取坐标时,x/y坐标范围为(0-50000),在调用itext签章方法时x=x/50000*pageW 1.一般模式 IText PDF签章时如何获取PDF页的坐标 以下几种特殊情况:

沿Y轴下移

上图是一般情况下,PDF页在坐标系中的位置,因此我们计算签章坐标时也是以左下角作为坐标原点。 但是也会遇到PDF创建者创建PDF时,修改签章坐标的问题,比如创建PDF时设置PDF坐标区域为(0,-50000,50000,0),这种情况将PDF的坐标下移,但是我们在计算签章位置时仍然以左下角为起点,导致itext包在计算签章位置时将印章图片盖在了PDF区域外,因此我们需要重新计算y坐标,计算公式为y=coordinateY-50000IText PDF签章时如何获取PDF页的坐标

这里为什么要用前端获取的坐标y-50000呢,因为y坐标是从Y轴的-pageH(-50000)处开始计算的,通常情况下我们签章位置为(10000,10000)处,在下图这种模式下,就需要改为(10000,-40000),如图所示。

沿X轴偏移

目前我所遇到的情况中,沿着X轴偏移并未改变X轴的坐标。在我的推测中,沿着X轴偏移的PDF矩形域坐标为(-50000,0,0,50000),但实际情况中,因为PDF的旋转(旋转90°),会导致沿着X轴左移的PDF,获取实际坐标还是(0,-50000,50000,0),如下图所示: IText PDF签章时如何获取PDF页的坐标 这种偏移方式也可以理解为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 PDF签章时如何获取PDF页的坐标”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!

推荐阅读:
  1. ava中怎么对PDF文件进行电子签章
  2. C#如何实现PDF签名时添加时间戳

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

上一篇:Python中怎么实现一个冰山委托策略

下一篇:Python中怎么实现一个菲阿里四价策略

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》