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
标签:Java,String,form,表单,itext,PDF,import,templateImageMap From: https://www.cnblogs.com/zt007/p/18034153