用java实现PDF的下载

1.下载PDF模版

2.导入依赖

复制代码
  <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itext7-core</artifactId>
            <version>7.2.5</version>
            <type>pom</type>
        </dependency>

3.完整代码

java 复制代码
package com.by.controller;

import com.itextpdf.forms.PdfAcroForm;
import com.itextpdf.forms.fields.PdfFormField;
import com.itextpdf.kernel.font.PdfFont;
import com.itextpdf.kernel.font.PdfFontFactory;
import com.itextpdf.kernel.geom.PageSize;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfReader;
import com.itextpdf.kernel.pdf.PdfWriter;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.util.ResourceUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;

/**
 * 控制器类,用于处理PDF模板填充及下载请求
 */
@RestController
public class PdfController {

    /**
     * 处理GET请求以下载填充了数据的PDF文件
     *
     * @param response HttpServletResponse对象,用于设置响应头和发送下载文件
     * @return 响应实体,包含填充好数据的PDF字节流
     * @throws IOException 如果读取或写入PDF文件时发生异常
     */
    @GetMapping("/download")
    public ResponseEntity<byte[]> test(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);

        // 准备需要填充到PDF模板中的数据
        Map<String, String> dataMap = new HashMap<>();
        dataMap.put("name", "张三");
        dataMap.put("code", "123456");

        // 填充数据并生成带数据的PDF字节流
        byte[] pdfBytes = getPdf(dataMap);

        // 创建并返回包含填充后PDF字节流的响应实体
        return new ResponseEntity<>(pdfBytes, headers, HttpStatus.CREATED);
    }

    /**
     * 根据提供的数据填充PDF模板并返回填充后的PDF字节流
     *
     * @param dataMap 需要填充到PDF模板中的键值对数据
     * @return 填充好数据的PDF文件字节数组
     * @throws IOException 如果读取或写入PDF文件时发生异常
     */
    private byte[] getPdf(Map<String, String> dataMap) 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 pdf = new PdfDocument(pdfReader, new PdfWriter(outputStream));

        // 设置默认页面大小为A4
        pdf.setDefaultPageSize(PageSize.A4);

        // 获取PDF表单域对象
        PdfAcroForm form = PdfAcroForm.getAcroForm(pdf, true);
        Map<String, PdfFormField> fields = form.getFormFields();

        // 设置字体,这里使用的是"STSong-Light"字体
        PdfFont currentFont = PdfFontFactory.createFont("STSong-Light", "UniGB-UCS2-H", PdfFontFactory.EmbeddingStrategy.PREFER_NOT_EMBEDDED);

        // 遍历待填充的数据,并将其填入对应的表单域
        dataMap.forEach((key, value) -> {
            Optional<PdfFormField> formFieldOptional = Optional.ofNullable(fields.get(key));
            formFieldOptional.ifPresent(formField -> {
                // 设置字体并替换表单域的值
                formField.setFont(currentFont).setValue(value);
            });
        });

        // 锁定并合并所有表单域,使其无法再编辑
        form.flattenFields();

        // 关闭PDF文档,释放资源
        pdf.close();

        // 将填充好的PDF文件转换为字节数组并返回
        return outputStream.toByteArray();
    }
}

4.模版位置

相关推荐
reasonsummer8 小时前
【办公类-53-12】20261016(预测)Python模仿制作2026学年第二学期校历(excel+pdf,上下学期都包含)
pdf·excel
开开心心就好12 小时前
多份文档怎么批量打印?支持多种格式
java·服务器·开发语言·pdf·ocr·散列表·启发式算法
开开心心就好13 小时前
文件被占用删不掉?解锁工具强制删除
java·运维·服务器·开发语言·前端·pdf·ocr
BD_Marathon17 小时前
PyPDFLoader和MinerU加载pdf文件
pdf
ydjs678899-bot2 天前
如何在Java中打印pdf静默打印和打印对话框选择
java·python·pdf
SamChan902 天前
PDF 翻译后 1,250 变成 1.250,是错了吗?用 Python 核对数字格式
python·pdf·ocr·数据校验·文档翻译
开开心心就好2 天前
打印机卡住打不了?一键清理卡死打印队列
服务器·开发语言·算法·pdf·ocr·idea·visual studio code
打工仔折腾 AI3 天前
在线PDF工具隐私焦虑?把BentoPDF部署到极空间NAS本地处理
人工智能·后端·python·pdf·ai agent 实战
霸道流氓气质3 天前
AI 简历制作平台:结构化输出解析、多模板渲染与 PDF 导出的 Vue3 + Spring AI 全栈实战
人工智能·spring·pdf
开开心心_Every3 天前
黄金价格软件国内外价格实时监控超方便
运维·服务器·游戏·智能手机·pdf·lua·perl