使用itext7在PDF文件中的指定文字位置添加电子签名图片
文章目录 使用itext7在PDF文件中的指定文字位置添加电子签名图片一、技术使用背景二、使用步骤1.引入依赖2.具体代码2.控制台输出2.生成结果展示 总结
一、技术使用背景
在一些PDF文件会有负责人签名、董事签名等签名处需要插入电子签章或者签名,所以将此技术点记录下来,其中也不乏有对其他博主技术的借用,请勿喷。
二、使用步骤 1.引入依赖
此次使用的是itext7,pom文件中引入依赖:
<dependency> <groupId>com.itextpdf</groupId> <artifactId>itext7-core</artifactId> <version>7.1.12</version> <type>pom</type> </dependency> 2.具体代码
代码如下:
package cn.basicproject.basics8.imginPDF;import com.itextpdf.io.image.ImageData;import com.itextpdf.io.image.ImageDataFactory;import com.itextpdf.kernel.geom.Rectangle;import com.itextpdf.kernel.pdf.PdfDocument;import com.itextpdf.kernel.pdf.PdfReader;import com.itextpdf.kernel.pdf.PdfWriter;import com.itextpdf.kernel.pdf.canvas.parser.PdfDocumentContentParser;import com.itextpdf.kernel.pdf.canvas.parser.listener.IPdfTextLocation;import com.itextpdf.kernel.pdf.canvas.parser.listener.RegexBasedLocationExtractionStrategy;import com.itextpdf.layout.Document;import com.itextpdf.layout.element.Image;import java.util.Collection;public class ImageInPDF { public static void mainString args[]) { String input = “D:\\Java.pdf”; //通过指定pdf文件名,指定关键字,和指定的pdf文件的待处理页数做参数 getKeyWordsLocationinput, “负责人签名:”, 1); } /** * 得到关键字位置 * @param input 源文件 * @param KEY_WORD 关键字 * @param pageNum 文档页数 */ public static void getKeyWordsLocationString input, String KEY_WORD, int pageNum) { RegexBasedLocationExtractionStrategy strategy = new RegexBasedLocationExtractionStrategyKEY_WORD); try { //得到需要插入的图片 ImageData imageData = ImageDataFactory.create”D:\\test.jpg”); //核心思路为对PdfDocument对象采用某种Strategy,这里使用RegexBasedLocationExtractionStrategy PdfReader pr = new PdfReaderinput); //生成新的PDF文件 PdfDocument pd = new PdfDocumentpr, new PdfWriter”D:\\test.pdf”)); //int pageNum = pd.getNumberOfPages);获取新pdf的总页数 Document document = new Documentpd); PdfDocumentContentParser pdcp = new PdfDocumentContentParserpd); //文本内容具体解析借助使用PdfDocumentContentParser类实质使用PdfCanvasProcessor进行处理), 对待处理页面装配合适策略 RegexBasedLocationExtractionStrategy regexStrategy = pdcp.processContentpageNum, strategy); //获取处理结果 Collection<IPdfTextLocation> resultantLocations = strategy.getResultantLocations); //自定义结果处理 if !resultantLocations.isEmpty)) { for IPdfTextLocation item : resultantLocations) { Rectangle boundRectangle = item.getRectangle); System.out.printlnitem.getText)); System.out.println”关键字“” + KEY_WORD + “” 的坐标为 x: ” + boundRectangle.getX) + ” ,y: ” + boundRectangle.getY)); Image image = new ImageimageData).scaleAbsolute70, 40).setFixedPositionpageNum, boundRectangle.getRight) + 5f, boundRectangle.getBottom)); document.addimage); } document.close); } else { System.out.println”结果为空”); } pr.close); pd.close); } catch Exception e) { System.err.println”读取文件失败!”); e.printStackTrace); } }} 2.控制台输出
代码如下:
“C:\Program Files\Java\jdk1.8.0_151\bin\java.exe” “-负责人签名:关键字“负责人签名:” 的坐标为 x: 321.31 ,y: 378.48105Process finished with exit code 0
补充:为了方便就做这些展示,有兴趣的可以多打点展示一下自己跑出来的信息。
2.生成结果展示
PDF生成后效果截图如下:
注意:仅做展示用
总结
此次纪录就是为了收集开发过程中遇到的技术点,如果对你有帮助,拿走不谢。如有更好的方法请在评论区写上链接,谢谢!