SpringBoot动态加载pdf

SpringBoot动态加载PDF

1、万兴pdf

[官网]万兴PDF编辑器 - 秒会的全能PDF编辑神器 (wondershare.cn)

[官网]万兴PDF编辑器 - 秒会的全能PDF编辑神器

直接下载即可

2、准备数据

双击新添加的文本字段

这里是自己定义的属性名

3、iText 7介绍

iText 7 是 iText 软件的一个主要版本,它是一个用于处理 PDF 文档的强大 Java 库。iText 7 提供了一系列的功能,使得开发者能够创建、修改、合并、分割、保护和转换 PDF 文件。与之前的版本相比,iText 7 在架构上进行了重大改进,并且增加了许多新特性。

3.1、模块化架构

  • iText 7 采用了模块化的架构,这意味着您可以只选择需要的功能模块,从而减少应用程序的大小和提高性能。

  • 常见的模块包括 corekernellayoutformsiopdfa 等。

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的名字一定要和表单域中的保持一致

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

这孩子叫逆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值