Java实现pdf的生成及数据动态插入与导出

2,580 阅读1分钟

1.使用word及PDF工具生成模板

1.1 编辑word模板

word测试模板.png

1.2 另存为PDF文件

1.3 使用Adobe Acrobat编辑PDF文件,编辑表单域

PDF编辑表单域.png

1.4 编辑完成后,将其保存

2. 编写代码

2.1 在pom.xml文件中导入itextpdf依赖

<!-- PDF导出-->
<!-- https://mvnrepository.com/artifact/com.itextpdf/itextpdf -->
<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itextpdf</artifactId>
    <version>5.5.13</version>
</dependency>

2.2 编写代码 实现生成 PDF、数据插入、导出

2.2.1 ExportParams.java 数据实体类
package com.shexianyu.param;

import lombok.Data;

/**
 * @author sxy
 * @version 1.0
 * @date 2021/6/24 15:28
 */
@Data
public class ExportParams {
    private String name;
    private String desc;
    private String time;
}
2.2.2 ExportPdf.java 导出功能控制器
package com.shexianyu.export;

import com.itextpdf.text.pdf.AcroFields;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;
import com.shexianyu.param.ExportParams;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletResponse;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;

/**
 * @author sxy
 * @version 1.0
 * @date 2021/6/24 15:24
 */
@RestController
@RequestMapping("/export")
public class ExportPdf {

    @RequestMapping("/pdf")
    public String export(@RequestBody ExportParams params, HttpServletResponse response) throws UnsupportedEncodingException {
        // 1.指定解析器
        System.setProperty("javax.xml.parsers.DocumentBuilderFactory",
                "com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl");
        String filename = "文件导出模板测试.pdf";
        String path = "e:/";
        response.setContentType("application/pdf");
        response.setHeader("Content-Disposition", "attachment;fileName="
                + URLEncoder.encode(filename, "UTF-8"));
        OutputStream os = null;
        PdfStamper ps = null;
        PdfReader reader = null;
        try {
            os = response.getOutputStream();
            // 2 读入pdf表单
            reader = new PdfReader(path + "/" + filename);
            // 3 根据表单生成一个新的pdf
            ps = new PdfStamper(reader, os);
            // 4 获取pdf表单
            AcroFields form = ps.getAcroFields();
            // 5 给表单添加中文字体 这里采用系统字体。不设置的话,中文可能无法显示
            BaseFont bf = BaseFont.createFont("C:/WINDOWS/Fonts/SIMSUN.TTC,1", BaseFont.IDENTITY_H,
                    BaseFont.EMBEDDED);
            form.addSubstitutionFont(bf);
            // 6 查询数据
            Map<String, String> data = new HashMap<>();
            data.put("name", params.getName());
            data.put("desc", params.getDesc());
            data.put("time", params.getTime());
            // 7 遍历data 给pdf表单表格赋值
            for (String key : data.keySet()) {
                form.setField(key, data.get(key).toString());
            }
            ps.setFormFlattening(true);
            System.out.println("PDF导出成功");
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("PDF导出失败");
        } finally {
            //8 关闭资源
            try {
                ps.close();
                reader.close();
                os.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return null;
    }
}

3. 使用postman进行测试

postman发送请求.png

4. 导出的PDF文档效果

导出PDF测试结果.png