一、问题
实现线下电子签章功能,每经过一次签证,都需要保留签证 的pdf文件(带有实际电子签章), 点击电子签章有相关签章信息
难点:需要pdf文件,根据表单域进行k-v填充
二、生成pdf文件模板
需要生成pdf文件模板工具adobe_Acrobat_DC
链接:https://pan.baidu.com/s/1Z4wH5ObfaTGFkPS7HpI7yw
提取码:eg21
安装包是把注册破解都涵盖了,不需要手动破解,进行安装-------------------------------------
双击Setup.exe后可以默认安装(或者自定义安装,主要是改掉安装路径)
安装完软件后进行模板的制作,先用word制作出模板,留好空位,然后word转pdf文件
后用上面安装的pdf编辑工具打开pdf文件
打开pdf模板后,选择工具--》表单和签名--》准备表单
双击表单域。或者在右侧对表单域名称进行更改,这个是对pdf文件编辑的关键点,会根据这个名称进行填充
可以右键表单域--》属性进行一些属性更改
三、代码填充pdf文件
模板生成后通过代码进行编辑
public static void interviewReportPDF(Map<String, String> map) {
// 模板路径
String templatePath = "E:/1001-4.pdf";
// 新文件路径
String newPDFPath ="E:/new.pdf";
PdfReader reader;
FileOutputStream out;
ByteArrayOutputStream bos;
PdfStamper stamper;
try {
out = new FileOutputStream(newPDFPath);// 输出流
reader = new PdfReader(templatePath);// 读取pdf模板
bos = new ByteArrayOutputStream();
stamper = new PdfStamper(reader, bos);
AcroFields form = stamper.getAcroFields();
// 给表单添加中文字体 这里采用系统字体。不设置的话,中文可能无法显示
BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
ArrayList<BaseFont> fontList = new ArrayList<BaseFont>();
fontList.add(bf);
form.setSubstitutionFonts(fontList);
//遍历map装入数据
for (Map.Entry<String, String> entry : map.entrySet()) {
form.setField(entry.getKey(), entry.getValue());
//System.out.println("PDF----> key= " + entry.getKey() + " and value= " + entry.getValue());
}
stamper.setFormFlattening(true);// 如果为false那么生成的PDF文件还能编辑,一定要设为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) {
e.printStackTrace();
} catch (DocumentException e) {
e.printStackTrace();
}
}
//main方法测试
public static void main(String[] args) {
Map<String,String> map=new HashMap<>();
map.put("sectionName", "胡");
map.put("sectionCode", "22");
map.put("departName", "jn");
map.put("sign", "张三");
System.out.println(map);
interviewReportPDF(map);
}
生成文件 效果
要对表单域的范围,属性要次尝试才能和文件内容融合的好,不然会出现填充内容显示不全(是因为表单域太小),字体大(表单域文字大小不适合)等问题