文章目录

  • 在itext中如何获取pdf矩形区域的坐标
    • 起因
    • 解决方法
    • 常用版本
      • itext5
      • itext7
    • 常见的几种坐标偏移方式
      • 沿Y轴下移
      • 沿X轴偏移
    • 总结

在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.一般模式

以下几种特殊情况:

沿Y轴下移

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

这里为什么要用前端获取的坐标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),如下图所示:

这种偏移方式也可以理解为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

IText PDF签章时,如何获取PDF页的坐标相关推荐

  1. Python 实现office单个文件或整个文件夹(word,ppt,excel)转换成PDF文件,并获取PDF文件页数

    Python 实现office单个文件或整个文件夹(word,ppt,excel)转换成PDF文件,并获取PDF文件页数 文件夹中获取需要转换的文件数,将其全部转换或可单独转换单个文件,并获取转成PD ...

  2. java 读取pdf签名域_Java 获取PDF中的数字签名信息

    本文以Java代码演示如何获取PDF文档中的数字签名信息,包括签名人.签名位置.日期.原因.联系方式.签名在文档中的坐标等等. 程序环境包括: Jdk 1.8.0(版本要求>=1.6.0版本即可 ...

  3. java解析pdf 图片文字_Java 读取PDF中的文本和图片

    本文将介绍通过Java程序来读取PDF文档中的文本和图片的方法.分别调用方法extractText()和extractImages()来读取. 使用工具:Free Spire.PDF for Java ...

  4. java pdf 插入图片_java在pdf模板的指定位置插入图片

    个人感觉pdf的操作比word舒心多了 java操作pdf有个非常好用的库itextpdf,maven: com.itextpdf itextpdf 5.5.6 com.itextpdf itext- ...

  5. php对pdf关键字定位,如何在PDF文件中快速查找关键字

    有时候我们在阅读和编辑PDF文章时需要对PDF文件里的重要关键词进行查找,但如果PDF文章内容过长,怎么才能快速查找出想要查找的关键字? 想要在PDF文件中快速查找出关键字,那么利用迅捷PDF编辑器进 ...

  6. 织梦获取文章页第一张图片为缩略图,织梦无法自动获取缩略图

    织梦无法自动获取文章缩略图的原因 通常是我们在系统参数中设置的默认缩略图的尺寸过大,织梦在获取图片时会自动对文章内的图片进行缩小裁剪,如果我们设置的默认缩略图片尺寸过大时,获取文章内容的第一张图片的结 ...

  7. Itext 学习笔记(六) pdf的页眉页脚

    转载一篇blog 源地址为: [url] http://blog.chinaunix.net/uid-122937-id-3052063.html [/url] 1.概述 iText5中并没有之前版本 ...

  8. java生成sm2证书_(转载)Java使用IText实现PDF签章

    前文讲到了如何使用Adobe的PDF工具软件进行电子印章应用.在实际应用中还有一种情形就是需要将电子印章功能集成在我们开发的系统里,这里就要用到一些PDF的二次开发库了.做过相关开发的同学应该知道常用 ...

  9. java获取pdf的页数、内容和缩略图

    1.导入maven依赖 <dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfb ...

  10. dotnet获取PDF文件的页数

    #region 获取PDF文件的页数private int BytesLastIndexOf(Byte[] buffer, int length, string Search){if (buffer ...

最新文章

  1. 【RecyclerView】 四、RecyclerView 布局 ( 网格局管理器 GridLayoutManager )
  2. linux blender骨骼绑定,在Linux系统中安装开源3D创建套件Blender的方法
  3. leetcode557. 反转字符串中的单词 III
  4. PHP 程序员最易犯10种错误
  5. windows 串口中断编程_万变不离其宗之单片机串口共性问题
  6. [转]windows和linux进行socket通信
  7. 路飞学城-Python开发-第一章
  8. 从零开始做运营第一课:运营是做什么的?一篇文章解释清楚!
  9. 软件工程师应该如何吵架?
  10. 【Uplift】因果推断基础篇
  11. echarts 生成中国陕西省份(或其他省份)的地图,大屏使用
  12. 安庆集团-冲刺日志(第五天)
  13. 计算机在运行 显示器出现黑屏,显示器黑屏但电脑一直在运行是什么原因
  14. LeetCode 1052 爱生气的书店老板 HERODING的LeetCode之路
  15. QQ如何让人点一个网址就进自己的空间
  16. 计算机三级网络几时出成绩,全国计算机等级考试成绩查询时间是什么时候?
  17. 运维工程师的发展和前景
  18. 爬虫之机器图像识别(ORC库)
  19. velo2cam_calibration——最新最准确的激光雷达Lidar和相机Camera外参标定算法实现
  20. 基于5G+MEC的电站行业专网部署方案研究

热门文章

  1. android四大组件共性,Android四大组件及意图和意图过滤器
  2. 手机APP测试如何进行兼容性测试?
  3. mysql中使用触发器实例
  4. mac mysql常用命令
  5. 伍德里奇计量经济学计算机课后答案第一章,伍德里奇---计量经济学第7章部分计算机习题详解(STATA)...
  6. you-get下载酷我音乐付费歌曲
  7. kindle刷机ttl_亚马逊卡大树kindle voyage修复刷机救砖KV死机变砖忘记密码维修
  8. STM32 Futaba SBUS协议解析
  9. UAV021(六):系统架构优化、SBUS协议、遥控器控制电机转动
  10. android手机网络Ping测试