pdf文件动态签章以及生成动态信息
步骤1.conversionItextPdf(将pdf转换成编码软件为Itext的pdf)
代码如下
public void conversionItextPdf() throws Exception {
String newfile = "D:\\生成编码软件为Itext格式的PDF.pdf";
String[] files = {"D:\\其他编码软件类型的PDF.pdf", ""};
Document document = new Document(new PdfReader(files[0]).getPageSize(1));
try {
document = new Document(new PdfReader(files[0]).getPageSize(1));
PdfCopy copy = new PdfCopy(document, new FileOutputStream(newfile));
document.open();
for (int i = 0; i < files.length; i++) {
PdfReader reader = new PdfReader(files[i]);
int n = reader.getNumberOfPages();
for (int j = 1; j <= n; j++) {
document.newPage();
PdfImportedPage page = copy.getImportedPage(reader, j);
copy.addPage(page);
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
document.close();
}
}
步骤2.用adobe软件为pdf添加表单域
步骤3.java代码给表单域赋值
public Map<String, String> convertMap(MakeLoanRequest request) throws Exception {
Map<String, String> map = new HashMap<>();
map.putAll(getDate());
map.put("name", "张三");
map.put("idCardNum", "320345199020562356");
return map;
}
public InputStream generationContract(String templatePath, Map<String, String> map) {
try {
PdfReader reader = new PdfReader(templatePath);// 读取pdf模板
ByteArrayOutputStream bos = new ByteArrayOutputStream();
PdfStamper stamper = new PdfStamper(reader, bos);
// 输出流
AcroFields form = stamper.getAcroFields();
Map<String, AcroFields.Item> fieldMap = form.getFields();
for (Map.Entry<String, AcroFields.Item> entry : fieldMap.entrySet()) {
String name = entry.getKey();
form.setField(name, map.get(name));
}
//如果为false那么生成的PDF文件还能编辑,一定要设为true
stamper.setFormFlattening(true);
stamper.close();
return byte2Input(bos.toByteArray());
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
1.此处是将pdf赋值后以输入流的形式返回,可根据自己需要做修改
2.步骤1中,将pdf设置成编码软件为Itext的格式,标红的PdfStamper PdfStamper(import com.itextpdf.text.pdf.PdfReader;import com.itextpdf.text.pdf.PdfStamper;)才能读取到pdf中的表单域
如果有遇到不理解的,可加QQ:467387096 一起讨论