1、导入需要的jar包:itext-asian-5.2.0.jar itextpdf-5.5.11.jar。
2、新建word文档,创建模板,将文件另存为pdf,并用Adobe Acrobat DC打开编辑,点击右侧【准备表单】后点击【开始】
3、在需要插入数据的空白处,右击,点击【文本域】,将文本域拖放到你想要的位置,更改域名称为你传入的变量名。
4、保存文件,将文件放到项目中。生成pdf代码如下:
1 public static void creatPdf(Map<String, Object> map,String filePath) {
2 try {
3 BaseFont bf = BaseFont.createFont("c://windows//fonts//simsun.ttc,1", BaseFont.IDENTITY_H,
4 BaseFont.EMBEDDED);
5 FileOutputStream out = new FileOutputStream(filePath);// 输出流
6 PdfReader reader = new PdfReader(TemplateToWord.class.getResource("/com/cn/business/templates/report.pdf"));// 读取pdf模板
7 ByteArrayOutputStream bos = new ByteArrayOutputStream();
8 PdfStamper stamper = new PdfStamper(reader, bos);
9 stamper.setFormFlattening(true);
10 AcroFields form = stamper.getAcroFields();
11 // 文字类的内容处理
12 Map<String, String> datemap = (Map<String, String>) map.get("datemap");
13 form.addSubstitutionFont(bf);
14 for (String key : datemap.keySet()) {
15 String value = datemap.get(key);
16 form.setField(key, value);
17 }
18 // 图片类的内容处理
19 Map<String, String> imgmap = (Map<String, String>) map.get("imgmap");
20 for (String key : imgmap.keySet()) {
21 String value = imgmap.get(key);
22 String imgpath = value;
23 int pageNo = form.getFieldPositions(key).get(0).page;
24 Rectangle signRect = form.getFieldPositions(key).get(0).position;
25 float x = signRect.getLeft();
26 float y = signRect.getBottom();
27 // 根据路径读取图片
28 Image image = Image.getInstance(imgpath);
29 // 获取图片页面
30 PdfContentByte under = stamper.getOverContent(pageNo);
31 // 图片大小自适应
32 image.scaleToFit(signRect.getWidth(), signRect.getHeight());
33 // 添加图片
34 image.setAbsolutePosition(x, y);
35 under.addImage(image);
36 }
37 // 表格类
38 Map<String, List<List<String>>> listMap = (Map<String, List<List<String>>>) map.get("list");
39 for (String key : listMap.keySet()) {
40 List<List<String>> lists = listMap.get(key);
41 int pageNo = form.getFieldPositions(key).get(0).page;
42 PdfContentByte pcb = stamper.getOverContent(pageNo);
43 Rectangle signRect = form.getFieldPositions(key).get(0).position;
44 //表格位置
45 int column = lists.get(0).size();
46 int row = lists.size();
47 PdfPTable table = new PdfPTable(column);
48 float tatalWidth = signRect.getRight() - signRect.getLeft() - 1;
49 int size = lists.get(0).size();
50 float width[] = new float[size];
51 for(int i=0;i<size;i++){
52 if(i==0){
53 width[i]=60f;
54 }else{
55 width[i]=(tatalWidth-60)/(size-1);
56 }
57 }
58 table.setTotalWidth(width);
59 table.setLockedWidth(true);
60 table.setKeepTogether(true);
61 table.setSplitLate(false);
62 table.setSplitRows(true);
63 Font FontProve = new Font(bf, 10, 0);
64 //表格数据填写
65 for(int i=0;i<row;i++){
66 List<String> list = lists.get(i);
67 for(int j=0;j<column;j++){
68 Paragraph paragraph = new Paragraph(String.valueOf(list.get(j)), FontProve);
69 PdfPCell cell = new PdfPCell(paragraph);
70 cell.setBorderWidth(1);
71 cell.setVerticalAlignment(Element.ALIGN_CENTER);
72 cell.setHorizontalAlignment(Element.ALIGN_CENTER);
73 cell.setLeading(0, (float) 1.4);
74 table.addCell(cell);
75 }
76 }
77 table.writeSelectedRows(0, -1, signRect.getLeft(), signRect.getTop(), pcb);
78 }
79 stamper.setFormFlattening(true);// 如果为false,生成的PDF文件可以编辑,如果为true,生成的PDF文件不可以编辑
80 stamper.close();
81 Document doc = new Document();
82 PdfCopy copy = new PdfCopy(doc, out);
83 doc.open();
84 int pageNum = reader.getNumberOfPages();
85 for(int i = 1;i <= pageNum;i++){
86 PdfImportedPage importPage = copy.getImportedPage(new PdfReader(bos.toByteArray()), i);
87 copy.addPage(importPage);
88 }
89 doc.close();
90 } catch (IOException e) {
91 System.out.println(e);
92 } catch (DocumentException e) {
93 System.out.println(e);
94 }
95
96 }
参数:
1 //文字类
2 Map<String, String> dataMap = new HashMap<String, String>();
3 dataMap.put("title", title+time);
4
5 //图片
6 String knowImgPath = "D:\\upload\\report\\knowImg.png";
7 Map<String, String> imgMap = new HashMap<String, String>();
8 imgMap.put("knowImg", knowImgPath);
9
10 //表格 一行数据是一个list
11 List<String> list = new ArrayList<String>();
12 list.add("日期");
13 list.add("金额");
14
15 List<String> list2 = new ArrayList<String>();
16 list2.add("2018-01-01");
17 list2.add("100");
18
19 List<List<String>> List = new ArrayList<List<String>>();
20 List.add(list);
21 List.add(list2);
22
23 Map<String, List<List<String>>> listMap = new HashMap<String, List<List<String>>>();
24 listMap.put("eventList", List);
25
26 Map<String, Object> o = new HashMap<String, Object>();
27 o.put("datemap", dataMap);
28 o.put("imgmap", imgMap);
29 o.put("list", listMap);
30
31 String knowImgPath = "D:\\upload\\report\\report.pdf";
32 creatPdf(o,filePath);
来源:oschina
链接:https://my.oschina.net/u/4387680/blog/4259107