首页 > 其他分享 >IText PDF签章时,如何获取PDF页的坐标

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

时间:2023-05-30 18:01:49浏览次数:65  
标签:50000 pdRectangle IText 坐标 pdf 签章 PDF

文章目录 在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(); 1 2 3 4 5 6 7 可通过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(); 1 2 3 4 5 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(); 1 2 3 4 5 6 7 常见的几种坐标偏移方式 我们在进行电子签名时,设置的坐标值默认以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

标签:50000,pdRectangle,IText,坐标,pdf,签章,PDF
From: https://blog.51cto.com/u_15668812/6381202

相关文章

  • 文档在线预览(二)word、pdf文件转html以实现文档在线预览
    @目录一、将文件转换成html字符串1、将word文件转成html字符串2、将pdf文件转成html字符串二、将文件转换成html,并生成html文件FileUtils类将html字符串生成html文件示例:1、将word文件转换成html文件2、将pdf文件转换成html文件实现文档在线预览的方式除了上篇文章《文档在线预览......
  • 【专题】2022中国新能源汽车发展趋势白皮书报告PDF合集分享(附原数据表)
    报告链接:http://tecdat.cn/?p=31861新能源汽车市场从政策推动到市场驱动的转变过程中,行业也在经过了一个萌芽期和初期的探索期之后,步入了一个迅速发展的时期。此外,在科技力量的加持下,品牌、车型、区域等细分领域都在持续地进行着调整,行业格局已经初具规模,在持续的创新中,产业已经......
  • Java中多个pdf合并为一个pdf文件工具类
    Java中多个pdf合并为一个pdf文件工具类方案一:引入依赖<dependency><groupId>com.lowagie</groupId><artifactId>itext</artifactId><version>2.1.7</version></dependency>工具类importcom.lowagie.text.Document;impo......
  • PHP 提取PDF文件内容
    这里以提取 亚马逊日期范围报告PDF汇总的数据根据路径下载PDF/***description:文件下载*@throwsCException*/publicfunctiongetFile($url,$save_dir='',$filename='',$type=0){if(trim($url)==''){......
  • IOS学习-UITextView
    《iOS8开发指南》,自己总结用UITextView文本视图(UITextView)与文本框类似,差别在于文本视图可显示一个可滚动和编辑的文本块,供用户阅读或修改。仅当需要的的输入很多时,才应使用文本视图。AttributeInspector分为3部分(TextField,control,view)(1)Text:设置文本框的默认文本(2)......
  • JasperReport报表导出PDF中文不显示的问题
       首先在JasperReportStudio中加载下载好的中文字体:打开设置页面:Window>>Preferences>>JaspersoftStudio>>Fonts,点击Add添加字体,FamilyName中命名新添加字体名称,TrueType中选择下载的字体文件(.ttf文件),PDFEncoding中选择PDF中中文字体编码格式。     这......
  • C# 打印PDF文档的10种方法
    转:C#打印PDF文档的10种方法-知乎(zhihu.com)前言 操作PDF文档时,打印是常见的需求之一。针对不同的打印需求,可分多种情况来进行,如设置静默打印、指定打印页码范围和打印纸张大小、双面打印、黑白打印等等。 经过测试,下面将对常见的几种PDF打印需求做一些归纳总结,这里归......
  • 如何通过Java代码将 PDF文档转为 HTML格式
    虽然PDF文件适合用于打印和发布,但不适合所有类型的文档。例如,包含复杂图表和图形的文档可能无法在PDF中呈现得很好。但是HTML文件可以在任何可运行浏览器的计算机上进行阅读并显示。并且HTML还具有占用服务器资源较小,便于搜索引擎收录的特点。那么今天这篇文章就将展示如何通过Ja......
  • Mac版PDF编辑器-Acrobat Pro DC 2023
    AcrobatProDC2023(pdf编辑器)是一款能让用户轻松创建和编辑多种pdf格式的实用工具,并且能够同时使用各种方法编辑大量pdf文件。AcrobatProDC是Mac上运行速度最快、处理能力最强、功能最丰富的工具之一。AcrobatProDC包括强大的图像编辑工具,可让您轻松编辑图片和视频,而......
  • 中金公司:全面注册制监管规则解读(附97页报告原文pdf下载链接)
    今天给大家带来中金公司于2023年2月份最新发布的深度研究报告《全面注册制监管规则解读.pdf》。2023年2月1日,全面实行股票发行注册制改革正式启动。从核准制到全面注册制,A股资本市场迎来重要里程碑。做投资的伙伴重点参考哦!本报告共包含如下六大章节:1、全面注册制改革总体情况介绍;2......