Springboot输出PDF文件

需求

比如我们需要将一张单据输出为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
//Step 1—Create a Document.  
Document document = new Document();
//Step 2—Get a PdfWriter instance.
PdfWriter.getInstance(document, new FileOutputStream(FILE_DIR + "createSamplePDF.pdf"));
//Step 3—Open the Document.
document.open();
//Step 4—Add content.
document.add(new Paragraph("Hello World"));
//Step 5—Close the Document.
document.close();

根据模板生成PDF文件并导出

  1. 使用word制作模板界面

模板

  1. 导出或另存为pdf文件
  2. 通过Adobe Acrobat pro软件打开刚刚用word转换成的pdf文件(嫌麻烦直接走这个链接下载,有安装包和破解文件,密码:Acrobat2021
  3. 点击右边的准备表单按钮,选择这个PDF文件,然后它会自动侦测并命名表单域,一般情况下可以不修改

准备表单

选择

域

  1. 做完这些功能,直接另存为即可

代码写入数据

后端采用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 {
// 利用模板生成pdf
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);// 读取pdf模板
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);// 如果为false那么生成的PDF文件还能编辑,一定要设为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();
}
}

结果如下:

结果