1、pom依赖
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.11</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext7-core</artifactId>
<version>7.2.0</version>
</dependency>
2、关键字信息查找
package com.example.study.demo.pdfSign;
import cn.hutool.core.collection.CollectionUtil;
import com.itextpdf.kernel.geom.Rectangle;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfPage;
import com.itextpdf.kernel.pdf.PdfReader;
import com.itextpdf.kernel.pdf.canvas.parser.PdfCanvasProcessor;
import com.itextpdf.kernel.pdf.canvas.parser.listener.IPdfTextLocation;
import com.itextpdf.kernel.pdf.canvas.parser.listener.RegexBasedLocationExtractionStrategy;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class FindKey {
/**
* 获取关键字位置信息map
* key为页数,value为当页关键字信息集合
*/
public static Map<Integer, List<KeyWordInfo>> keyWordLocationMap(String input, String keyword) {
Map<Integer, List<KeyWordInfo>> listMap;
try(PdfReader reader = new PdfReader(input);PdfDocument pdfDocument = new PdfDocument(reader)) {
int pageNumbers = pdfDocument.getNumberOfPages();
listMap = new HashMap<>(pageNumbers);
for (int i = 1; i <= pageNumbers; i++) {
PdfPage page = pdfDocument.getPage(i);
RegexBasedLocationExtractionStrategy strategy = new RegexBasedLocationExtractionStrategy(keyword);
PdfCanvasProcessor canvasProcessor = new PdfCanvasProcessor(strategy);
canvasProcessor.processPageContent(page);
Collection<IPdfTextLocation> resultantLocations = strategy.getResultantLocations();
//自定义结果处理
if (!resultantLocations.isEmpty()) {
List<KeyWordInfo> keyWordInfoList = new ArrayList<>();
List<IPdfTextLocation> iPdfTextLocationList = CollectionUtil.newArrayList(resultantLocations);
for (int m = 0; m < iPdfTextLocationList.size(); m++) {
IPdfTextLocation item = iPdfTextLocationList.get(m);
Rectangle boundRectangle = item.getRectangle();
KeyWordInfo keyWordInfo = new KeyWordInfo();
keyWordInfo.setPage(i);
keyWordInfo.setX(boundRectangle.getX());
keyWordInfo.setY(boundRectangle.getY());
keyWordInfo.setWidth(boundRectangle.getWidth());
keyWordInfo.setHeight(boundRectangle.getHeight());
keyWordInfo.setText(item.getText());
keyWordInfo.setNum(m + 1);
System.out.println("关键字“" + keyword + "” 的坐标为 x: " + boundRectangle.getX() + " ,y: " + boundRectangle.getY());
keyWordInfoList.add(keyWordInfo);
}
listMap.put(i, keyWordInfoList);
}
}
} catch (IOException e) {
throw new RuntimeException(e);
}
return listMap;
}
}
package com.example.study.demo.pdfSign;
import lombok.Data;
@Data
public class KeyWordInfo{
private float x;
private float y;
private float width;
private float height;
/**
* pdf的页面
*/
private int page;
/**
* 当前页面中第几个
*/
private int num;
private String text;
}
3、关键字签章、指定位置签章demo
package com.example.study.demo.pdfSign;
import cn.hutool.core.date.DateUtil;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Image;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Date;
import java.util.List;
import java.util.Map;
public class ItextTest {
/**
* 指定位置盖章
*/
public static void main1(String[] args) throws Exception {
String dateStr = DateUtil.format(new Date(),"yyyyMMdd-HHmm");
String inputPdf = "D://test//pdf//test2.pdf";
String outputPdf = "D://test//pdf//指定位置签章-itext-".concat(dateStr).concat(".pdf");
String stampImage ="D://test//pdf//zhang.png";
ByteArrayOutputStream memoryStream = readFileToMemoryStream(inputPdf);
PdfReader reader = new PdfReader(memoryStream.toByteArray());
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(outputPdf));
Image image = Image.getInstance(stampImage);
//设置签字图片宽高
image.scaleToFit(100, 100);
PdfContentByte content;
Rectangle pageSize;
int pageCount = reader.getNumberOfPages();
for(int i=1; i <= pageCount; i++) {
pageSize = reader.getPageSizeWithRotation(i);
content = stamper.getOverContent(i);
//签章图片位置坐标
float absoluteX = 10;
float absoluteY = pageSize.getHeight() - image.getScaledHeight() - 10;
image.setAbsolutePosition( absoluteX, absoluteY );
content.addImage(image);
}
stamper.close();
reader.close();
}
/**
* 关键字盖章
*/
public static void main(String[] args) throws IOException, DocumentException {
String dateStr = DateUtil.format(new Date(),"yyyyMMdd-HHmm");
String inputPdf = "D://test//pdf//test2.pdf";
String outputPdf = "D://test//pdf//关键字签章-itext-".concat(dateStr).concat(".pdf");
String stampImage ="D://test//pdf//zhang.png";
// 要盖章的关键字
String keyword = "张三看看";
// 关键字位置信息map
Map<Integer, List<KeyWordInfo>> map = FindKey.keyWordLocationMap(inputPdf,keyword);
ByteArrayOutputStream memoryStream = readFileToMemoryStream(inputPdf);
PdfReader pdfReader = new PdfReader(memoryStream.toByteArray());
PdfStamper pdfStamper = new PdfStamper(pdfReader, Files.newOutputStream(Paths.get(outputPdf)));
Image image = Image.getInstance(stampImage);
//设置签字图片宽高
image.scaleAbsolute(100, 100);
int pageCount = pdfReader.getNumberOfPages();
for(int i=1; i <= pageCount; i++) {
PdfContentByte content = pdfStamper.getUnderContent(i);
List<KeyWordInfo> list = map.get(i);
for (KeyWordInfo keyWordInfo : list) {
//签章图片位置坐标
float absoluteX = keyWordInfo.getX() + keyWordInfo.getWidth()/2 - image.getScaledWidth()/2 ;
float absoluteY = keyWordInfo.getY() + keyWordInfo.getHeight()/2 - image.getScaledHeight()/2;
image.setAbsolutePosition(absoluteX, absoluteY);
content.addImage(image);
}
}
pdfStamper.close();
pdfReader.close();
}
private static ByteArrayOutputStream readFileToMemoryStream(String filePath) throws IOException {
ByteArrayOutputStream memoryStream = new ByteArrayOutputStream();
// 缓冲区大小
byte[] buffer = new byte[1024];
try (FileInputStream fis = new FileInputStream(filePath)) {
int bytesRead;
while ((bytesRead = fis.read(buffer)) != -1) {
memoryStream.write(buffer, 0, bytesRead);
}
}
return memoryStream;
}
}