编辑PDF模板
1.使用Adobe Acrobat Pro pdf文件。
2.点击创建–>PDF表单–>使用当前文档–>使用当前文档,一直点下一步完成。(有的版本Adobe Acrobat Pro软件右边有准备表单,直接点击准备表单是同样的效果)
3.在需要插入表单的位置插入文本域(注意:黑框里面的名称,是后面程序要用到的,程序根据名称给对应的位置赋值的。不管你取什么名字,只要保证和程序里面的名字一直即可。)
4.例
所需依赖
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.4.3</version>
</dependency>
</dependencies>
测试代码
package pdf;
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.itextpdf.text.*;
import com.itextpdf.text.pdf.*;
/**
* @ClassName PdfUtils
* @Deacription TODO 根据pdf模板生成pdf文件
* @Author LiuDaGang
* @Date 2022/9/22 11:55
* @Version 1.0
**/
public class PdfUtils {
// 利用模板生成pdf
public static void pdfout(Map<String,Object> o) {
// 模板路径
String templatePath = "D:/Users/sz/Desktop/2.pdf";
// 生成的新文件路径
String newPDFPath = "D:/Users/sz/Desktop/test2.pdf";
PdfReader reader;
FileOutputStream out;
ByteArrayOutputStream bos;
PdfStamper stamper;
try {
//字体设置
BaseFont baseFont = BaseFont.createFont("D:/Users/sz/Desktop/2.ttf" , BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
BaseFont baseFont1 = BaseFont.createFont("D:/Users/sz/Desktop/1.ttf" , BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
// 输出流
out = new FileOutputStream(newPDFPath);
// 读取pdf模板
reader = new PdfReader(templatePath);
bos = new ByteArrayOutputStream();
//PDF压模
stamper = new PdfStamper(reader, bos);
//获取可填写的表单域
AcroFields form = stamper.getAcroFields();
//文字类的内容处理
Map<String,String> datemap = (Map<String,String>)o.get("datemap");
//设置默认字体
form.addSubstitutionFont(baseFont);
//设置字体颜色
BaseColor baseColor=BaseColor.GREEN;
for(String key : datemap.keySet()){
//设置不同的表单域不同的效果
if(key.equals("name")){
//设置表单样式
//字体
form.setFieldProperty(key,"textfont",baseFont,null);
//颜色
form.setFieldProperty(key,"textcolor",baseColor,null);
String value = datemap.get(key);
form.setField(key,value);
}else {
form.setFieldProperty(key,"textfont",baseFont1,null);
form.setFieldProperty(key, "textsize", 6f, null);
String value = datemap.get(key);
form.setField(key, value);
}
}
//图片类的内容处理
Map<String,String> imgmap = (Map<String,String>)o.get("imgmap");
for(String key : imgmap.keySet()) {
String value = imgmap.get(key);
String imgpath = value;
int pageNo = form.getFieldPositions(key).get(0).page;
Rectangle signRect = form.getFieldPositions(key).get(0).position;
float x = signRect.getLeft();
float y = signRect.getBottom();
//根据路径读取图片
Image image = Image.getInstance(imgpath);
//获取图片页面
PdfContentByte under = stamper.getOverContent(pageNo);
//图片大小自适应
image.scaleToFit(signRect.getWidth(), signRect.getHeight());
//添加图片
image.setAbsolutePosition(x, y);
under.addImage(image);
}
// 如果为false,生成的PDF文件可以编辑,如果为true,生成的PDF文件不可以编辑
stamper.setFormFlattening(true);
stamper.close();
Document doc = new Document();
PdfCopy copy = new PdfCopy(doc, out);
doc.open();
PdfImportedPage importPage = copy.getImportedPage(new PdfReader(bos.toByteArray()), 1);
copy.addPage(importPage);
doc.close();
} catch (IOException e) {
System.out.println(e);
} catch (DocumentException e) {
System.out.println(e);
}
}
public static void main(String[] args) {
Map<String,String> map = new HashMap();
map.put("name","张三11111111");
map.put("card","440305202111110236");
map.put("expire","2020.9-2020.9");
map.put("encode","CSCTVA-CPRSG2022000001");
Map<String,String> map2 = new HashMap();
map2.put("image","D:/Users/sz/Desktop//微信图片_20220712151655.jpg");
Map<String,Object> o=new HashMap();
o.put("datemap",map);
o.put("imgmap",map2);
pdfout(o);
}
}