需求
比如我们需要将一张单据输出为PDF
并打印,那么我们需要制作这张单据的模板并将数据填入表格中对应的位置中。本文主要讲制作PDF
模板并简单将数据写入PDF
中。
开始
安装maven依赖
我们使用一个很好的PDF
第三方工具itext
1 2 3 4 5 6 7 8 9 10 11
| <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>
|
基础操作
itext
有很多功能,这里先说基本的操作。其他更多高级的操作,可以继续看下面的。
基本处理步骤如下伪代码
1 2 3 4 5 6 7 8 9 10
| Document document = new Document();
PdfWriter.getInstance(document, new FileOutputStream(FILE_DIR + "createSamplePDF.pdf"));
document.open();
document.add(new Paragraph("Hello World"));
document.close();
|
根据模板生成PDF
文件并导出
- 使用word制作模板界面
- 导出或另存为
pdf
文件
- 通过
Adobe Acrobat pro
软件打开刚刚用word转换成的pdf
文件(嫌麻烦直接走这个链接下载,有安装包和破解文件,密码:Acrobat2021
)
- 点击右边的
准备表单
按钮,选择这个PDF
文件,然后它会自动侦测并命名表单域,一般情况下可以不修改
- 做完这些功能,直接
另存为
即可
代码写入数据
后端采用Java
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
| public class Snippet { public static void fillTemplate() { String templatePath = "D:/Files/Temp/test1.pdf"; String newPDFPath = "D:/Files/Temp/result.pdf"; PdfReader reader; FileOutputStream out; ByteArrayOutputStream bos; PdfStamper stamper; try { out = new FileOutputStream(newPDFPath); reader = new PdfReader(templatePath); bos = new ByteArrayOutputStream(); stamper = new PdfStamper(reader, bos); AcroFields form = stamper.getAcroFields(); String[] str = {"123456789", "TOP__ONE", "男", "1991-01-01", "130222111133338888", "西安市"}; int i = 0; java.util.Iterator<String> it = form.getFields().keySet().iterator(); while (it.hasNext()) { String name = it.next().toString(); System.out.println(name); form.setField(name, str[i++]); } stamper.setFormFlattening(true); stamper.close(); Document doc = new Document(); PdfCopy copy = new PdfCopy(doc, out); doc.open(); PdfImportedPage importPage = copy.getImportedPage(new PdfReader(bos.toByteArray()), 1); copy.addPage(importPage); doc.close(); } catch (IOException e) { System.out.println(1); } catch (DocumentException e) { System.out.println(2); } }
public static void main(String[] args) { fillTemplate(); } }
|
结果如下: