在网上找了一段时间,发现有两个版本的
1,使用aspose.pdf,这篇文章写得很清楚https://blog.csdn.net/da_keng/article/details/65633498,我稍微改了一下,可以替换多个字符
public static void main(String[] args) {
String srcPath = "E:\\CA\\入职合同模版样例.pdf";
String targetPath = "E:\\CA\\out.pdf";
Map<String, String> map = new HashMap<String, String>();
map.put("[$合同编号$]", "ZR-20181009-00000164");
map.put("[$乙方姓名$]", "TroubleA");
map.put("[$签字日期$]", "2018/10/10 11:24:30");
test(srcPath, targetPath, map);
}
public static void test(String srcPath, String targetPath, Map<String, String> map){
InputStream license = Main.class.getClassLoader().getResourceAsStream("\\license.xml");
try {
new License().setLicense(license);
} catch (Exception e) {
e.printStackTrace();
}
Document pdfDoc = new Document(srcPath);
for (Map.Entry<String, String> entry : map.entrySet()) {
System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
TextFragmentAbsorber textFragmentAbsorber = new TextFragmentAbsorber(entry.getKey());
PageCollection pages = pdfDoc.getPages();
System.out.println("文档总页码数:"+pages.size());
pages.accept(textFragmentAbsorber);
int i = 0;
for (TextFragment textFragment :(Iterable<TextFragment>) textFragmentAbsorber.getTextFragments()) {
textFragment.setText(entry.getValue());
textFragment.getTextState().setBackgroundColor(com.aspose.pdf.Color.getRed()); //添加红色背景
System.out.println(++i);
}
}
pdfDoc.save(targetPath);
}
2,像这位链接中的大佬一样,https://blog.csdn.net/sishenkankan/article/details/53107195,使用具体的java代码去寻找x,y的位置然后画一个白板覆盖再重新写上需要替换的文字,有以下两个缺点,
a)当需要替换的文字不在一个TextRenderInfo里面,无法找到比较长的需要替换的
b)当pdf包含有多页的时候,不方便具体的控制替换到哪一页
所以我又百度了一个能够定位pdf中需要替换的文字位置的方法,https://blog.csdn.net/sdizoea/article/details/75105798,像文中大佬一样直接定位然后解决了文字不在一个块中时查找的麻烦,贴一下所有的代码,一共有6个类,
package com.sinosoft.lis.utils;
import com.itextpdf.text.BaseColor;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Font;
import com.itextpdf.text.log.Logger;
import com.itextpdf.text.log.LoggerFactory;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;
import java.io.*;
import java.net.URLDecoder;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
/**
-
替换PDF文件某个区域内的文本
*/
public class PdfReplacer {
private static final Logger logger = LoggerFactory.getLogger(PdfReplacer.class);private int fontSize;
private Map<String, ReplaceRegion> replaceRegionMap = new HashMap<String, ReplaceRegion>();
private Map<String, String> replaceTextMap =new HashMap<String, String>();
private ByteArrayOutputStream output;
private PdfReader reader;
private PdfStamper stamper;
private PdfContentByte canvas;
private Font font;public PdfReplacer(byte[] pdfBytes) throws DocumentException, IOException{
init(pdfBytes);
}public PdfReplacer(String fileName) throws IOException, DocumentException{
FileInputStream in = null;
try{
in =new FileInputStream(fileName);
byte[] pdfBytes = new byte[in.available()];
in.read(pdfBytes);
init(pdfBytes);
}finally{
in.close();
}
}private void init(byte[] pdfBytes) throws DocumentException, IOException{
logger.info(“初始化开始”);
reader = new PdfReader(pdfBytes);
output = new ByteArrayOutputStream();
stamper = new PdfStamper(reader, output);
canvas = stamper.getOverContent(1);
setFont(10);
logger.info(“初始化成功”);
}private void close() throws DocumentException, IOException{
if(reader != null){
reader.close();
}
if(output != null){
output.close();
}output=null; replaceRegionMap=null; replaceTextMap=null;
}
public void replaceText(float x, float y, float w,float h, String text){
ReplaceRegion region = new ReplaceRegion(text); //用文本作为别名
region.setH(h);
region.setW(w);
region.setX(x);
region.setY(y);
addReplaceRegion(region);
this.replaceText(text, text);
}public void replaceText(String name, String text){
this.replaceTextMap.put(name, text);
}/**
- 替换文本
- @throws IOException
- @throws DocumentException
*/
private void process() throws DocumentException, IOException{
try{
parseReplaceText();
canvas.saveState();
Set<Entry<String, ReplaceRegion>> entrys = replaceRegionMap.entrySet();
for (Entry<String, ReplaceRegion> entry : entrys) {
ReplaceRegion value = entry.getValue();
canvas.setColorFill(BaseColor.RED);
canvas.rectangle(value.getX(),value.getY(),value.getW(),value.getH());
}
canva