通过模板生成pdf文件(一页或多页)-java
程序员文章站
2024-03-08 14:40:46
...
流程
1.使用Adobe acrobat pro(pdf编辑工具)创建pdf表单模板文件。
2.Java(使用itext的jar包)获取并填充表单。
创建表单
1.使用Adobe acrobat pro打开需要作为模板的pdf文件,空的有内容的都可以,具体看自己需求吧,我这里打开的是一个空的pdf。
2.点击右上角工具-表单-编辑,进入表单编辑页面。
3.点击添加新域,有很多组件可以选择。
4.在页面需要填充数据的地方选择相应的组件,文本域的名称就是一会需要填充的表单的键值,也就是标识。我写的例子是一个发票的pdf,用的都是文本域(这些表单的域用pdf正常打开是看不到的,只有在这个表单编辑页面才可以看到,所以现在模板看起来还是空的)。
5.完事保存。
填充数据
1.导包,需要用到itext包
(1)自己导入,这是我使用的jar包,0积分下载即可,itext-4.2.0
(2)pom方式,这个版本是比较新的
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.4.3</version>
</dependency>
2.开始代码部分
public class Main {
public static void main(String[] args) throws IOException, DocumentException {
//pdf模板路径
String TemplatePDF = "src/com/company/peinvoice.pdf";
//生成pdf路径
String temp = "src/com/company/peinvoice_temp.pdf";
FileOutputStream fos = new FileOutputStream (temp);
//用于存储每页生成pdf流
ByteArrayOutputStream baos[] = new ByteArrayOutputStream[2];
//3页pdf所以直接循环3次,填充各个表单数据
for (int i=0;i<2;i++){
//获取表单
baos[i] = new ByteArrayOutputStream();
PdfReader reader = new PdfReader(TemplatePDF);
PdfStamper stamp = new PdfStamper(reader,baos[i]);
AcroFields form = stamp.getAcroFields();
//填充表单
form.setField("trueName", "姓名"+i);
form.setField("year", "2020"); //开票时间
form.setField("month", "09");
form.setField("day", "16");
form.setField("studyNo", "学号"+i);
form.setField("className", "班级:"+"") ;
for(int j=0;j<4;j++){
form.setField("feeType"+j, "费用项"+j);
form.setField("amount"+j, "金额"+j);
}
form.setField("totalAmountCh","合计人民币(大写):"+"壹万");
form.setField("totalAmount", "4");
form.setField("school", "xx大学");
form.setField("jibanren", "林海帆");
stamp.setFormFlattening(true);
stamp.close();
}
//创建并打开一个pdf对象
Document doc = new Document();
PdfCopy pdfCopy = new PdfCopy(doc,fos);
doc.open();
//2页拼到一个文档里
for (int i=0;i<2;i++){
PdfImportedPage impage = pdfCopy.getImportedPage(new PdfReader(baos[i].toByteArray()), 1);
pdfCopy.addPage(impage);
}
//关闭
doc.close();
}
}
3.生成文件的效果