Java 使用 itext 向PDF插入数据和图片

Java 使用 itext 向PDF插入数据和图片

一、下载Adobe Acrobat DC

二、制作模板

1、准备一个word模板,并转换成PDF格式

2、使用Adobe Acrobat DC打开PDF文档,并在右侧搜索框搜索表单,点击准备表单

 

3、点击开始,制作PDF表单

 

4、扫描完成后如下图,蓝白色框就是可编辑表单
 

 

5、点击表单编辑表单名称以及插入时的字体大小样式等,如果没有设置字体大小,数据写入时会将字体会根据表单的高度自适应大小
 

 

 

6、编辑完成后保存PDF模板
 

三、在Java中使用

 1 import com.itextpdf.text.DocumentException;
 2 import com.itextpdf.text.Image;
 3 import com.itextpdf.text.Rectangle;
 4 import com.itextpdf.text.pdf.*;
 5 
 6 import java.io.*;
 7 
 8 import java.nio.file.Files;
 9 import java.util.Calendar;
10 import java.util.HashMap;
11 import java.util.Map;
12 
13 public class PDFUtil {
14 
15     private static void insertImage(AcroFields form, PdfStamper stamper, String filedName, String url) throws IOException, DocumentException {
16         int pageNo = form.getFieldPositions(filedName).get(0).page;
17         Rectangle signRect = form.getFieldPositions(filedName).get(0).position;
18         float x = signRect.getLeft();
19         float y = signRect.getBottom();
20 
21         Image image = Image.getInstance(url);
22         // 获取操作的页面
23         PdfContentByte under = stamper.getOverContent(pageNo);
24         // 根据域的大小缩放图片
25         image.scaleToFit(signRect.getWidth(), signRect.getHeight());
26         // 添加图片
27         image.setAbsolutePosition(x, y);
28         under.addImage(image);
29     }
30 
31     public static Boolean pdfTemplateInsert(String templateUrl, String outputFileUrl, Map<String, Object> templateValueMap, Map<String, String> templateImageMap) {
32         boolean success = true;
33 
34         OutputStream os = null;
35         PdfStamper ps = null;
36         PdfReader reader = null;
37         try {
38             os = Files.newOutputStream(new File(outputFileUrl).toPath());
39             //读取pdf表单
40             reader = new PdfReader(templateUrl);
41             //根据表单生成一个新的pdf文件
42             ps = new PdfStamper(reader, os);
43             //获取pdf表单
44             AcroFields form = ps.getAcroFields();
45             //给表单中添加中文字体
46             BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
47             form.addSubstitutionFont(bf);
48             if (null != templateValueMap && !templateValueMap.isEmpty()) {
49                 for (String key : templateValueMap.keySet()) {
50                     form.setField(key, String.valueOf(templateValueMap.get(key)));
51                 }
52             }
53 
54             if (null != templateImageMap && !templateImageMap.isEmpty()) {
55                 for (String key : templateImageMap.keySet()) {
56                     insertImage(form, ps, key, templateImageMap.get(key));
57                 }
58             }
59             ps.setFormFlattening(true);
60         } catch (Exception e) {
61             success = false;
62         } finally {
63             try {
64                 ps.close();
65                 reader.close();
66                 os.close();
67             } catch (Exception e) {
68                 e.printStackTrace();
69             }
70         }
71         return success;
72     }
73 
74 
75     public static void main(String[] args) {
76         //模板路径
77         String inputUrl = "E:/Desktop/test/demo/itext-demo.pdf";
78         //生成的文件路径
79         String outputUrl = "E:/Desktop/test/demo/itext-demo-output.pdf";
80         Map<String, Object> data = new HashMap<>();
81         data.put("name", "张山");
82         data.put("year", "2000年10月");
83         data.put("phone", "13032451234");
84         data.put("gangwei", "Java开发");
85         data.put("introduceOneself", "熟练使用Java常用框架:Spring 、mybatis等");
86         //图片地址
87         String imageUrl = "E:/Desktop/test/demo/1.jpeg";
88         Map<String, String> templateImageMap = new HashMap<>();
89         templateImageMap.put("image", imageUrl);
90 
91         PDFUtil.pdfTemplateInsert(inputUrl, outputUrl, data, templateImageMap);
92     }
93 }
PDFUtil
执行结果 

 

 

转自:https://blog.csdn.net/HP1004/article/details/131912387

 

 

 

 

 

posted on 2024-02-26 13:32  腾逸  阅读(448)  评论(0编辑  收藏  举报