首先需要安装AdobeAcrobatDC来制作模板
打开dc工具——》准备表单,然后打开你需要制作的pdf源文件
将文本域拖到你需要代码替换的位置
你可以双击文本域修改当前文本域的key值,便于代码中替换
也可以修改文本域的字体大小以及颜色等,在外观这一栏下
设置好文本域之后保存,如果发现保存之后一直卡住,可以按如下操作,打开编辑——》首选项
点击一般,将红框内的在线存储取消掉即可
程序实现
<dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.13</version></dependency><dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.10</version></dependency><dependency><groupId>com.itextpdf</groupId><artifactId>itext-asian</artifactId><version>5.2.0</version></dependency>
依赖包
将制作好的模板文件放在resources目录下
/***根据模板生成pdf**@paramcontract*@return*/@SneakyThrowspublicvoidcreatePDF(ContractDatacontract,HttpServletResponseresponse){PdfReaderreader=null;AcroFieldss=null;PdfStamperps=null;ByteArrayOutputStreambos=null;try{ClassPathResourceresource=newClassPathResource("contractTemplate.pdf");InputStreamis=resource.getInputStream();reader=newPdfReader(is);bos=newByteArrayOutputStream();ps=newPdfStamper(reader,bos);s=ps.getAcroFields();Classclazz=ContractData.class;Field[]fields=clazz.getDeclaredFields();try{for(Fieldf:fields){f.setAccessible(true);if(f.get(contract)!=null){s.setField(f.getName(),f.get(contract).toString());}}}catch(IllegalAccessExceptione){thrownewCommonException();}//如果为false那么生成的PDF文件还能编辑,一定要设为trueps.setFormFlattening(true);ps.close();response.reset();response.setContentType("application/pdf");ServletOutputStreamfos=response.getOutputStream();fos.write(bos.toByteArray());fos.flush();fos.close();}catch(IOException|DocumentExceptione){e.printStackTrace();}finally{try{bos.close();reader.close();}catch(IOExceptione){e.printStackTrace();}}}
核心代码
@DataclassContractData{privateStringcontractNo;privateStringpartyAName;privateStringpartyBName;}
实体类
这样就可以了
下面是生成的最终pdf文件
最后生成的效果
大功告成~