根据PDF模板单个PDF导出到浏览器和多个PDF打包ZIP导出到浏览器

一、单个PDF导出到浏览器

java 复制代码
    /**
     * 
     * @param templatePath 模板路径
     * @param fileName 文件名称
     * @param data 填充文本
     * @param images 填充图片
     * @param response
     * @throws IOException
     */
    public static void generateTempPDF(String templatePath, String fileName, Map<String, String> data , Map<String, String> images, HttpServletResponse response) throws IOException {
        fileName = URLEncoder.encode(fileName, "UTF-8");
        // 设置响应头
        response.setContentType("application/force-download");
        response.setHeader("Content-Disposition",
                "attachment;fileName=" + fileName);
        PdfReader reader = null;
        PdfStamper ps = null;
        OutputStream fos = null;
        ByteArrayOutputStream bos = null;
        try {
            //模板路径templatePath
            reader = new PdfReader(templatePath);
            bos = new ByteArrayOutputStream();
            ps = new PdfStamper(reader, bos);
            // 使用中文字体
            BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
            ArrayList<BaseFont> fontList = new ArrayList<>();
            fontList.add(bf);
            AcroFields fields = ps.getAcroFields();
            fields.setSubstitutionFonts(fontList);
            fillData(fields, data);//渲染
            //插入图片
            if (EmptyUtils.isNotEmpty(images)) {
                fillImage(fields, ps,images);
            }
            //必须要调用这个,否则文档不会生成的
            ps.setFormFlattening(true);
            if(ps != null){
                ps.close();
            }
            // 保存到本地
            // fos = new FileOutputStream(exportPath);
            // 输出到浏览器端
            fos = response.getOutputStream();
            fos.write(bos.toByteArray());
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            if(fos!=null){
                fos.flush();
                fos.close();
            }
            if (bos != null){
                bos.close();
            }
            if(reader != null){
                reader.close();
            }
        }
    }

二、多个PDF文件压缩ZIP输出浏览器

java 复制代码
 @Override
    public void exportZip(List<Long> ids, HttpServletResponse response) throws IOException {
      
        response.setContentType("application/zip");
        response.setHeader("Content-Disposition", "attachment; filename=weighbridge_records.zip");
        try (ZipOutputStream zos = new ZipOutputStream(response.getOutputStream())) {
            for (Long id: ids) {

                // 业务代码

                String fileName = aaa.pdf;
                 Map<String, String> data = new HashMap<>();
                // 生成 PDF 文件到 ByteArrayOutputStream
                ByteArrayOutputStream bos = new ByteArrayOutputStream();
                //模板路径
                String templatePath = templateProperties.getPath() + "\\weighbridge_record.pdf";
                generateTempPDF(templatePath, fileName, data, null, bos);

                // 将生成的 PDF 文件写入 ZIP
                ZipEntry zipEntry = new ZipEntry(fileName);
                zos.putNextEntry(zipEntry);
                zos.write(bos.toByteArray());
                zos.closeEntry();
                bos.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (DocumentException e) {
            throw new RuntimeException(e);
        }
    }
java 复制代码
public static void generateTempPDF(String templatePath, String fileName, Map<String, String> data, Map<String, String> images, ByteArrayOutputStream bos) throws IOException, DocumentException {
        PdfReader reader = null;
        PdfStamper ps = null;
        try {
            reader = new PdfReader(templatePath);
            ps = new PdfStamper(reader, bos);
            BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
            ArrayList<BaseFont> fontList = new ArrayList<>();
            fontList.add(bf);
            AcroFields fields = ps.getAcroFields();
            fields.setSubstitutionFonts(fontList);
            fillData(fields, data); // 渲染

            // 插入图片
            if (EmptyUtils.isNotEmpty(images)) {
                fillImage(fields, ps, images);
            }

            ps.setFormFlattening(true);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (ps != null) {
                ps.close();
            }
            if (reader != null) {
                reader.close();
            }
        }
    }
相关推荐
考虑考虑14 小时前
Java实现hmacsha1加密算法
java·后端·java ee
掉鱼的猫14 小时前
Spring Boot → Solon 注解迁移实战指南:一张对照表说清楚
java·spring boot
plainGeekDev14 小时前
广播接收器 → Flow + Lifecycle
android·java·kotlin
plainGeekDev14 小时前
EventBus → SharedFlow
android·java·kotlin
带刺的坐椅15 小时前
Spring Boot → Solon 注解迁移实战指南:一张对照表说清楚
java·springboot·web·solon
weedsfly15 小时前
还在用 Axios?你可能需要重新理解 XHR 与 Fetch
前端·javascript·面试
CoderWeen15 小时前
从零实现一个 Vue3 流程图编辑器:节点拖拽、贝塞尔连线与框选
前端·javascript
用户37215742613515 小时前
Java 将一个 PPT 文档拆分为多个文件
java
To_OC1 天前
LC 128 最长连续序列:别上来就排序,O (n) 解法才是这题的灵魂
javascript·算法·leetcode
kyriewen1 天前
我用 50 行代码重写了 React Router 核心,终于搞懂了前端路由原理
前端·javascript·react.js