主要步骤流程:
1、设计word模板
2、将模板转为PDF
3、使用Adobe Acrobat 设计表单
4、pdf内容填写输出
一、使用word设计模板
二、将模板转为PDF(跳过)
三、使用Adobe Acrobat 设计表单
1、使用打开pdf
2、选择工具的准备表单
3、填写文本域名称
4、如果有需要插入图片选择图片,并将外框和颜色选为无颜色
三、内容填写输出
<dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.13</version></dependency><dependency><groupId>com.itextpdf</groupId><artifactId>itext-asian</artifactId><version>5.2.0</version></dependency><dependency><groupId>com.itextpdf.tool</groupId><artifactId>xmlworker</artifactId><version>5.5.13</version></dependency><dependency><groupId>fr.opensagres.xdocreport</groupId><artifactId>fr.opensagres.poi.xwpf.converter.pdf-gae</artifactId><version>2.0.1</version></dependency>
/*** 输出pdf* @param templatePath 模板* @param exportPath 新文件* @param data 文本* @param images 图片* @throws IOException */public static void generateTempPDF(String templatePath,String exportPath,Map<String, String> data ,Map<String, String> images) throws IOException {PdfReader reader = null;PdfStamper ps = null;OutputStream fos = null;ByteArrayOutputStream bos = null;try {//模板路径templatePathreader = new PdfReader(templatePath);bos = new ByteArrayOutputStream();ps = new PdfStamper(reader, bos);// 使用中文字体BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);ArrayList<BaseFont> fontList = new ArrayList<>();fontList.add(bf);AcroFields fields = ps.getAcroFields();fields.setSubstitutionFonts(fontList);fillData(fields, data);//渲染//插入图片if (EmptyUtils.isNotEmpty(images)) {fillImage(fields, ps,images);}//必须要调用这个,否则文档不会生成的ps.setFormFlattening(true);if(ps != null){ps.close();}//生成pdf路径存放的路径fos = new FileOutputStream(exportPath);fos.write(bos.toByteArray());}catch (Exception e){e.printStackTrace();}finally {if(fos!=null){fos.flush();fos.close();}if (bos != null){bos.close();}if(reader != null){reader.close();}}}private static void fillImage(AcroFields fields, PdfStamper ps, Map<String, String> images) {try {for (String key : images.keySet()) {String value = images.get(key);// 为字段赋值,注意字段名称是区分大小写的insertImage(fields, ps, key, value);}} catch (Exception e) {e.printStackTrace();}}/*** 填充模板中的数据*/public static void fillData(AcroFields fields, Map<String, String> data) {try {for (String key : data.keySet()) {String value = data.get(key);// 为字段赋值,注意字段名称是区分大小写的fields.setField(key, value);}} catch (Exception e) {e.printStackTrace();}}/*** pdf模板插入图片* @param form* @param stamper* @param filedName* @param url* @return*/public static boolean insertImage(AcroFields form, PdfStamper stamper, String filedName, String url) {try {int pageNo = form.getFieldPositions(filedName).get(0).page;Rectangle signRect = form.getFieldPositions(filedName).get(0).position;float x = signRect.getLeft();float y = signRect.getBottom();Image image = Image.getInstance(url);// 获取操作的页面PdfContentByte under = stamper.getOverContent(pageNo);// 根据域的大小缩放图片image.scaleToFit(signRect.getWidth(), signRect.getHeight());// 添加图片image.setAbsolutePosition(x, y);under.addImage(image);}catch (Exception e){return false;}return true;}