PDF电子签章,用鼠标拖动印章到指定的位置, 一种在网页PDF中电子签章定位方法

目录

 

一、需求

二、最后的效果

三、解决思路


一、需求

         在开发PDF电子签章(电子签名),后台用itextpdf进行签名,前台用pdf.js显示pdf文件,在前台用鼠标拖动印章到指定的位置,点击PDF后,获取鼠标点击坐标,将这个坐标转为itexpdf的坐标体系,然后插入图章。

二、最后的效果

三、解决思路

       这个问题困扰我一周,网上各种资料翻了个遍,都没有解决方案,实在没办法,读了pdf.js 的源码,了解在不同分辨率下,坐标的转换,有了以下思路。

  1、在html中,<iframe id='pdffile' src="" name="mainFrame" frameborder="1" width="100%" height="100%" scrolling="auto" noresize="noresize"> </iframe> 用来显示pdf文件,然后利用      viewer.html?file= + encodeURIComponent(src1); 的方式加载文件,这个可以去参考其他文章。

2、在js里,取得viewer里PDFviewer的宽度和高度,注意一下,这个高度是pdf文件的合计高度,比如PDF有10页,高度为7000,那么用这个高度除以总页数,就是每页在浏览器显示的高度了,这个数值是浏览器的坐标体系。方法很简单:

var iFrame = document.getElementById('pdffile'); 

PagesCount  =  $.session.get("PagesCount");//总页数

viewerContainer = iFrame.contentDocument.getElementById('viewer');

var previewheight  = $(viewerContainer).height();
var previewwidth =  $(viewerContainer).width();

previewheight = previewheight / PagesCount;

3、在viewer.js里,取pdf文档每页的宽度 pagewidth和高度pagehight,这个数值是pdf的坐标体系。这个需要viewer.js里取,然后传回到自己的js里。目的是点击pdf时,取点击页的宽度和高度,用来计算。

4、进行坐标转换计算,鼠标点击后,取得鼠标点击坐标。利用Pageheight / previewheight 计算出一个缩放比例,那么

           pdf的X坐标 = 鼠标点击的坐标(positionX) * 缩放比例 就可以了.当然要考虑超出pdf文档的范围,这个自己考虑下就好了,就是判断鼠标位置是否超出了pdf文档的宽度。

            var targetX = positionX * ( Pageheight / previewheight )

           pdf的Y坐标 就比较麻烦了,因为在pdf里,(0,0)是左下角,鼠标点击在网页时,(0,0)是左上角。所以 pdf的Y坐标的计算方法:

var mousepage =  Math.ceil(positionY/previewheight);//判断点击了第几页

var mouse_page_y =  previewheight *  mousepage -  positionY;//转换成点击pdf页的高度

var targetY  = mouse_page_y  * ( Pageheight / previewheight ) - dragImageHeight (dragImageHeight是图章的高度)

还有点小问题 就是如果把鼠标样式变成图章形状(圆形的),点击位置和显示位置有点微小差别,需要微调一下就好。

至此 大概的解决办法就完成了。

  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 13
    评论
要使用iTextPDF类库完成PDF电子签章,需要以下步骤: 1.准备电子签章图片 首先需要准备好电子签章图片,可以是PNG、JPEG等格式,需要注意的是,签章图片的背景要透明,即签章图案是不带有背景颜色的,这样才能保证签章后的效果更加美观。 2.引入iTextPDF类库 将iTextPDF类库导入到你的Java项目,可以使用Maven等工具进行依赖管理,也可以手动导入jar包。 3.创建签章位置PDF文档指定签章位置,可以通过坐标指定签章位置,也可以通过页码和位置的方式指定签章位置。 4.加载签章图片 使用iTextPDF类库的Image类加载电子签章图片,并设置其位置和大小。 5.签章 使用iTextPDF类库PdfStamper类进行签章操作,将签章图片添加到PDF文档指定位置,并保存PDF文件。 以下是Java代码示例: ```java import com.itextpdf.text.DocumentException; import com.itextpdf.text.Image; import com.itextpdf.text.Rectangle; import com.itextpdf.text.pdf.*; import java.io.FileOutputStream; import java.io.IOException; public class PdfSign { public static void main(String[] args) throws IOException, DocumentException { // 1.准备电子签章图片 String imagePath = "path/to/signature.png"; Image image = Image.getInstance(imagePath); // 2.引入iTextPDF类库 // 3.创建签章位置 Rectangle rect = new Rectangle(300, 100, 400, 200); // 4.加载签章图片 image.setAlignment(Image.LEFT | Image.TOP); image.scaleToFit(rect.getWidth(), rect.getHeight()); // 5.签章 String inputFilePath = "path/to/input.pdf"; String outputFilePath = "path/to/output.pdf"; PdfReader reader = new PdfReader(inputFilePath); PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(outputFilePath)); PdfContentByte over = stamper.getOverContent(1); image.setAbsolutePosition(rect.getLeft(), rect.getBottom()); over.addImage(image); stamper.close(); reader.close(); } } ``` 注意,这里的签章图片是不带有背景的PNG格式,如果签章图片带有背景,则需要进行去除背景操作。
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ysjydss

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值