PDF不像EXCEL那樣靈活,要想處理動態(tài)數據,基本有2種方法
1、純程序畫
風險較大,可行性低
2、把模板里的動態(tài)部分單獨做成模板
使用Foxit PDF Editor編輯PDF模板元素,把動態(tài)數據部分的模板按一條(一行)提取出來單獨做一頁,使用時動態(tài)引入。
以下為示例程序
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、重復執(zhí)行2&3以填充動態(tài)數據
51
52 // 5、繼續(xù)做其他處理
53
54 document.close();
55 opsTemp.close();
56 ops.close();
57
58 } catch (Exception e) {
59 e.printStackTrace();
60 }
61
62 }
63 }