一、第三方库文件 Java本身是没有能够自动生成PDF文件的API的,因此我们需要导入第三方的库文件。
这里要介绍的第三方jar包是itext
,这里提供两个文件的下载:
二、导入到Maven 由于Maven仓库中没有提供两个文件的依赖导入方式,因此需要我们将其作为自定义的jar包导入到本地的maven仓库中。当然,如果你并没有使用依赖管理工具
来管理你的依赖包,那可以直接导入到你的项目中。
我们需要执行指令 mvn install
。当然,这个命令有几个参数需要介绍一下
-Dfile=【文件路径】
-DgroupId=【包的分组ID】
-DartifactId=【包名】
-Dversion=【包的版本号】
-Dpackaging=【打包方式】
因此上面的参数加起来,我们需要执行
1 mvn install:install-file -Dfile=【文件路径】 -DgroupId=【包的分组ID】 -DartifactId=【包名】 -Dversion=【包的版本号】 -Dpackaging=【打包方式】
所以我们可以直接执行以下两条命令分别将两个包导入到本地的maven仓库:
1 $ mvn install:install-file -Dfile=./itextpdf-5.5.10.jar -DgroupId=com.itext -DartifactId=itext -Dversion=5.5.10 -Dpackaging=jar
1 $ mvn install:install-file -Dfile=./itext-asian-5.2.0.jar -DgroupId=com.itext -DartifactId=itext-asian -Dversion=5.2.0 -Dpackaging=jar
两条命令的执行结果:
之后我们就可以通过添加maven依赖的方式来引入这两个文件了:
1 2 3 4 5 6 7 8 9 10 11 12 13 <dependencies > <dependency > <groupId > com.itext</groupId > <artifactId > itext</artifactId > <version > 5.5.10</version > </dependency > <dependency > <groupId > com.itext</groupId > <artifactId > itext-asian</artifactId > <version > 5.2.0</version > </dependency > </dependencies >
三、准备工具
我们得先准备一个具有制作表单
功能的PDF阅读工具(作者这里使用的工具是Adobe Acrobat Pro DC
)
制作模板
PDF模板的制作:
先点击准备表单
,然后选择需要扫描的文件后点击开始
表单的每个位置都可以自定义其控件,比如命名控件名为fill_76
之类的,鼠标右键可打开属性
进行进一步的编辑,这些文本框控件就是为了之后能让程序自动导入数据,然后生成pdf用的。
这里就什么也不更改了,直接另存为一个新的文件。
另存完这个文件之后,我们的PDF模板文件就搞定了 。
四、Java自动根据模板生成pdf文件 不多说了,直接入主题:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 package top.bingcu.common.utils.file;import java.io.ByteArrayOutputStream;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.util.HashMap;import java.util.Map;import com.itextpdf.text.Document;import com.itextpdf.text.DocumentException;import com.itextpdf.text.pdf.*;public class PdfUtil { public void fillTemplate (Map<String,Object> datasMap,File outFilePath,File templatePath) throws IOException, DocumentException { this .fillTemplate(datasMap, outFilePath.getAbsolutePath(), templatePath.getAbsolutePath()); } public void fillTemplate (Map<String,Object> datasMap,String templatePath,String outFilePath) throws IOException, DocumentException { PdfReader reader = new PdfReader(templatePath); ByteArrayOutputStream bos = new ByteArrayOutputStream(); PdfStamper stamper = new PdfStamper(reader, bos); FileOutputStream out = new FileOutputStream(outFilePath); AcroFields form = stamper.getAcroFields(); PdfContentByte underContent = stamper.getUnderContent(2 ); File fontPath = new File(new File("" ).getAbsoluteFile() + "/" + "pdfs/font/msyh.ttf" ); BaseFont baseFont = BaseFont.createFont(fontPath.getAbsolutePath(), BaseFont.IDENTITY_H, BaseFont.EMBEDDED); form.addSubstitutionFont(baseFont); java.util.Iterator<String> it = form.getFields().keySet().iterator(); while (it.hasNext()) { String name = it.next().toString(); String value = datasMap.get(name)!=null ?datasMap.get(name).toString():null ; System.out.println("[PDF] 已填充内容:" +"\t\t\t类型:" +form.getFieldType(name)+"\t\t\t" +name+"\t\t\t" +"文本值:" +value); switch (form.getFieldType(name)){ case 2 : form.setField(name, value, true ); break ; case 4 : form.setField(name,value); break ; case 7 : Image signature = (Image) datasMap.get(name); signature.scaleToFit(100 ,120 ); if (name.equals("signature1" )){ signature.setAbsolutePosition(200 , 170 ); } else if (name.equals("signature2" )) { signature.setAbsolutePosition(460 , 170 ); } else { break ; } underContent.addImage(signature); break ; } } stamper.setFormFlattening(true ); stamper.close(); Document doc = new Document(); PdfCopy copy = new PdfCopy(doc, out); doc.open(); PdfImportedPage importPage1 = copy.getImportedPage(new PdfReader(bos.toByteArray()), 1 ); PdfImportedPage importPage2 = copy.getImportedPage(new PdfReader(bos.toByteArray()), 2 ); copy.addPage(importPage1); copy.addPage(importPage2); doc.close(); } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 public static void main (String[] args) throws Exception { PdfUtil pdfUtil = new PdfUtil(); Map<String, Object> datasMap = new HashMap<>(); datasMap.put("fill_1" , "TestData01" ); datasMap.put("fill_2" , "测试数据02" ); datasMap.put("fill_3" , "测试数据03" ); datasMap.put("fill_4" , "测试数据04" ); datasMap.put("toggle_1" , "On" ); File prePath = new File("" ); File templatePath = new File(prePath.getAbsolutePath() + "/pdfs/template/pdfTemplate.pdf" ); File outFile = new File(prePath.getAbsolutePath()+"/pdfs/generate/new.pdf" ); if (outFile.exists()){ System.out.println("[PDF] 文件已存在!" +"(" + outFile.getAbsoluteFile()+")" ); outFile.delete(); } pdfUtil.fillTemplate(datasMap, outFile.getAbsolutePath(), templatePath.getAbsolutePath()); }
全部OK!看一下运行结果吧