PDF不像EXCEL那样灵活,要想处理动态数据,基本有2种方法
1、纯程序画
风险较大,可行性低
2、把模板里的动态部分单独做成模板
使用Foxit PDF Editor编辑PDF模板元素,把动态数据部分的模板按一条(一行)提取出来单独做一页,使用时动态引入。
以下为示例程序
1 package itext.my;
2
3 import java.io.ByteArrayOutputStream;
4 import java.io.FileOutputStream;
5 import java.io.OutputStream;
6
7 import org.junit.Test;
8
9 import com.lowagie.text.Document;
10 import com.lowagie.text.Image;
11 import com.lowagie.text.PageSize;
12 import com.lowagie.text.pdf.AcroFields;
13 import com.lowagie.text.pdf.PdfImportedPage;
14 import com.lowagie.text.pdf.PdfReader;
15 import com.lowagie.text.pdf.PdfStamper;
16 import com.lowagie.text.pdf.PdfWriter;
17
18 public class ImportedPages {
19
20 @Test
21 public void hello() {
22
23 try {
24 Document document = new Document(PageSize.LETTER, 0, 0, 0, 0);
25
26 // 1、读取模板
27 PdfReader template = new PdfReader("pdf/template/t.pdf");
28 OutputStream ops = new FileOutputStream("output/t.pdf");
29 PdfWriter writer = PdfWriter.getInstance(document, ops);
30 document.open();
31
32 // 2、填模板数据
33 ByteArrayOutputStream opsTemp = new ByteArrayOutputStream();
34 PdfStamper stamp = new PdfStamper(template, opsTemp);
35 AcroFields form = stamp.getAcroFields();
36 form.setField("XXX", "XXX"); // PDF模板上预先设置好的控件
37 stamp.setFormFlattening(true);
38 stamp.close();
39 PdfReader data = new PdfReader(opsTemp.toByteArray());
40
41 // 3、把处理好数据的模板导入当前Document
42 PdfImportedPage page = writer.getImportedPage(data, 1);
43 Image image = Image.getInstance(page);
44 document.add(image);
45
46 // 计算分页时机
47 // 有时候需要写,要不然接下来的内容显示不出来(比如在一个page里Percent和大于100)
48 // document.newPage();
49
50 // 4、重复执行2&3以填充动态数据
51
52 // 5、继续做其他处理
53
54 document.close();
55 opsTemp.close();
56 ops.close();
57
58 } catch (Exception e) {
59 e.printStackTrace();
60 }
61
62 }
63 }