使用itext7在PDF文件中的指定文字位置添加电子签名图片
一、技术使用背景
在一些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 main(String args[]) {
String input = "D:\\Java.pdf";
//通过指定pdf文件名,指定关键字,和指定的pdf文件的待处理页数做参数
getKeyWordsLocation(input, "负责人签名:", 1);
}
/**
* 得到关键字位置
* @param input 源文件
* @param KEY_WORD 关键字
* @param pageNum 文档页数
*/
public static void getKeyWordsLocation(String input, String KEY_WORD, int pageNum) {
RegexBasedLocationExtractionStrategy strategy = new RegexBasedLocationExtractionStrategy(KEY_WORD);
try {
//得到需要插入的图片
ImageData imageData = ImageDataFactory.create("D:\\test.jpg");
//核心思路为对PdfDocument对象采用某种Strategy,这里使用RegexBasedLocationExtractionStrategy
PdfReader pr = new PdfReader(input);
//生成新的PDF文件
PdfDocument pd = new PdfDocument(pr, new PdfWriter("D:\\test.pdf"));
//int pageNum = pd.getNumberOfPages();获取新pdf的总页数
Document document = new Document(pd);
PdfDocumentContentParser pdcp = new PdfDocumentContentParser(pd);
//文本内容具体解析借助使用PdfDocumentContentParser类(实质使用PdfCanvasProcessor进行处理), 对待处理页面装配合适策略
RegexBasedLocationExtractionStrategy regexStrategy = pdcp.processContent(pageNum, strategy);
//获取处理结果
Collection<IPdfTextLocation> resultantLocations = strategy.getResultantLocations();
//自定义结果处理
if (!resultantLocations.isEmpty()) {
for (IPdfTextLocation item : resultantLocations) {
Rectangle boundRectangle = item.getRectangle();
System.out.println(item.getText());
System.out.println("关键字“" + KEY_WORD + "” 的坐标为 x: " + boundRectangle.getX() + " ,y: " + boundRectangle.getY());
Image image = new Image(imageData).scaleAbsolute(70, 40).setFixedPosition(pageNum, boundRectangle.getRight() + 5f, boundRectangle.getBottom());
document.add(image);
}
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.48105
Process finished with exit code 0
补充:为了方便就做这些展示,有兴趣的可以多打点展示一下自己跑出来的信息。
2.生成结果展示
PDF生成后效果截图如下:
注意:仅做展示用
总结
此次纪录就是为了收集开发过程中遇到的技术点,如果对你有帮助,拿走不谢。如有更好的方法请在评论区写上链接,谢谢!