SpringBoot动态加载PDF
1、万兴pdf
[官网]万兴PDF编辑器 - 秒会的全能PDF编辑神器 (wondershare.cn)
直接下载即可
2、准备数据
双击新添加的文本字段
这里是自己定义的属性名
3、iText 7介绍
iText 7 是 iText 软件的一个主要版本,它是一个用于处理 PDF 文档的强大 Java 库。iText 7 提供了一系列的功能,使得开发者能够创建、修改、合并、分割、保护和转换 PDF 文件。与之前的版本相比,iText 7 在架构上进行了重大改进,并且增加了许多新特性。
3.1、模块化架构:
-
iText 7 采用了模块化的架构,这意味着您可以只选择需要的功能模块,从而减少应用程序的大小和提高性能。
-
常见的模块包括
core
、kernel
、layout
、forms
、io
和pdfa
等。
3.2、API 改进:
-
iText 7 的 API 设计更加面向对象,易于理解和使用。
-
支持流式 API,使得文档构建过程更加流畅和直观。
3.3、PDF/A 支持:
-
提供了对 PDF/A 标准的支持,这对于需要长期存档的应用来说非常重要。
3.4、PDF 表单处理:
-
提供了创建和处理 PDF 表单的功能,包括填写表单字段、导出表单数据等。
3.5、图像和字体支持:
-
支持多种图像格式和字体嵌入,方便在 PDF 中使用自定义资源。
3.6、安全性:
-
支持 PDF 加密和数字签名,增强了文档的安全性。
3.7、HTML 到 PDF 转换:
-
iText 7 提供了 HTML 到 PDF 的转换功能,可以通过 HTML 内容生成 PDF 文件。
3.8、多平台支持:
-
支持 Java SE 和 Java EE 平台,同时也可以在 Android 平台上运行。
4、实战
4.1、引入依赖
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext7-core</artifactId>
<version>7.2.4</version>
<type>pom</type>
</dependency>
4.2、管理静态资源
将自己创建好的带有表单域的pdf放到templates文件夹下。如图
4.3、代码
@RestController
public class PdfController {
@GetMapping("/dowmload")
public ResponseEntity<byte[]> download(HttpServletResponse response) throws IOException {
//设置响应头,告诉浏览器以附件形式下载
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
String downloadFileName = System.currentTimeMillis() + ".pdf";
response.setHeader("Content-Disposition", "attachment;filename=" + downloadFileName);
//准备需要填充的数据
DateTime date = DateUtil.date();
Map<String, String> data = new HashMap<>();
data.put("name", "向往的飞龙");
data.put("startDate", DateUtil.format(date, "yyyy-MM-dd"));
data.put("stopDate", DateUtil.format(DateUtil.offsetMonth(date, 12), "yyyy-MM-dd"));
data.put("year",DateUtil.year(date)+"");
data.put("month",DateUtil.month(date)+1+"");
data.put("day",DateUtil.dayOfMonth(date)+"");
//生成pdf文件,返回pdf文件字节数组
byte[] bytes = getPdf(data);
return new ResponseEntity<>(bytes, headers, HttpStatus.CREATED);
}
private byte[] getPdf(Map<String, String> data) throws IOException {
//获取pdf模板文件路径
String sourcePdf = ResourceUtils.getURL("classpath:").getPath() + "/templates/1.pdf";
//使用pdf阅读器加载模板文件
PdfReader pdfReader = new PdfReader(new FileInputStream(sourcePdf));
//创建一个内存输出流,用于存储生成的pdf文件
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
//创建一个pdf文档对象,连接读取器和输出流
PdfDocument pdfDocument = new PdfDocument(pdfReader, new PdfWriter(outputStream));
//设置默认页面大小为A4
pdfDocument.setDefaultPageSize(PageSize.A4);
//获取表单域对象
PdfAcroForm form = PdfAcroForm.getAcroForm(pdfDocument, true);
Map<String, PdfFormField> fields = form.getFormFields();
//设置字体
PdfFont currentFont = PdfFontFactory.createFont("STSong-Light",
"UniGB-UCS2-H",
PdfFontFactory.EmbeddingStrategy.FORCE_EMBEDDED);
//填充表单域数据
data.forEach((key, value) -> {
Optional<PdfFormField> formFildOptional = Optional.ofNullable(fields.get(key));
formFildOptional.ifPresent(formField -> {
//设置字体并替换表单域的值
formField.setFont(currentFont).setValue( value);
});
});
//锁定并合并所有表单域,使其无法在编辑
form.flattenFields();
//关闭pdf文档对象,生成pdf文件
pdfDocument.close();
return outputStream.toByteArray();
}
}
注意,这里Map中的key的名字一定要和表单域中的保持一致