Java使用itext生成PDF 然后将多个PDF打包zip下载

先上pom依赖 用于生成pdf文件

        <!--pdf start-->
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>kernel</artifactId>
            <version>7.0.3</version>
        </dependency>
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>io</artifactId>
            <version>7.0.3</version>
        </dependency>
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>layout</artifactId>
            <version>7.0.3</version>
        </dependency>
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>font-asian</artifactId>
            <version>7.0.3</version>
        </dependency>
        <!--pdf end-->

首先构建 Document对象

//字节输出流(包直接是java.io)
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PdfWriter writer = new PdfWriter(baos);
PdfDocument pdf = new PdfDocument(writer);
Document document = new Document(pdf);

然后构建pdf内容

        //添加标题
        Paragraph title = new Paragraph("" + "测试名称").setFont(watermark)
                .setFontSize(22)//设置字体大小
                .setBold()//设置文字为粗体
                .setFontColor(new DeviceRgb(0, 0, 0))//设置字体颜色
                .setTextAlignment(TextAlignment.CENTER)//文字水平居中
                .setFixedLeading(22)//类似于css中的行高
                ;
        //将内容添加到PDF页面上
        document.add(title);

此处watermark为字体   因为我引入的这个itext默认中文字符字体可能不支持 

引入字体代码(我这块是写的绝对路径    建议写相对路径  因为部署到Linux上就没有c盘)

 PdfFont watermark = PdfFontFactory.createFont("c://simsun.ttc,1", PdfEncodings.IDENTITY_H, false);

到这里我们就把pdf制作完成了 

上面构建pdf内容处可根据业务需求制作 

将PDF转换为字节添加到ZIP压缩包中

首先  一定要执行

 document.close();

要执行关闭流操作  不然会拿不到字节数据

 //获取PDF字节数组
 byte[] xmpMetadata = baos.toByteArray();

将数据制作为压缩包


        ZipOutputStream zipOutputStream = new ZipOutputStream(response.getOutputStream());
        zipOutputStream.putNextEntry(new ZipEntry("pdf李四.pdf"));
        zipOutputStream.write(xmpMetadata);
        zipOutputStream.flush();
        zipOutputStream.putNextEntry(new ZipEntry("pdf王五.pdf"));
        zipOutputStream.write(xmpMetadata);
        zipOutputStream.flush();
        zipOutputStream.close();
API信息
* new ZipEntry("压缩包文件名称");
* ZipEntry为压缩包中单个文件   构造参数为单个文件名称
* putNextEntry()  是将文件添加到压缩包中
* 后面紧跟write(字节数组,也就是写入的文件);
* 刷新一下然后就可以添加下一个 以此类推 就可以将批量文件打成压缩包
putNextEntry(new ZipEntry("压缩包文件名称"));
上demo和效果图
@Override
    public Object downloadPaper(HttpServletResponse response) throws IOException {
        String paperId = "";

        log.info("paperId: " + paperId);
        PdfFont watermark = PdfFontFactory.createFont("c://simsun.ttc,1", PdfEncodings.IDENTITY_H, false);
        response.setContentType("application/octet-stream");
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        PdfWriter writer = new PdfWriter(baos);
        PdfDocument pdf = new PdfDocument(writer);
        Document document = new Document(pdf);

        //试卷信息
        List<PaperDownloadVo> paper = null;
        //转码试卷名称
        String fileName = URLEncoder.encode("测试试卷", "utf-8");
        response.setHeader("Content-Disposition", "attachment;fileName=" + fileName + ".zip");
        //添加标题
        Paragraph title = new Paragraph("" + "测试名称").setFont(watermark)
                .setFontSize(22)//设置字体大小
                .setBold()//设置文字为粗体
                .setFontColor(new DeviceRgb(0, 0, 0))//设置字体颜色
                .setTextAlignment(TextAlignment.CENTER)//文字水平居中
                .setFixedLeading(22)//类似于css中的行高
                ;
        //将内容添加到PDF页面上
        document.add(title);

        document.add(new Paragraph("试卷总分 :" + "测试18分" + "  考试时间:" + "测试时长" + "分钟 ").setFont(watermark)
                .setFontSize(14)
                .setBold()
                .setTextAlignment(TextAlignment.CENTER)
                .setFixedLeading(8)
        );
        System.out.println("--"+Arrays.toString(baos.toByteArray()));
//        start

        int pbqContextNum = 0;
        int choiceCount = 0;
        //题目类型
        document.add(new Paragraph("测试模板名称").setFont(watermark)
                .setFontSize(14)
                .setBold()
                .setFixedLeading(14));
//            //根据题目分组 每一个key对应一道小题
//            Map<String, List<PaperDownloadVo>> contexts = papers.stream().collect(Collectors.groupingBy(PaperDownloadVo::getPsqContext));
//
//            int serialNumber = 0;
//            String pbqContext = null == papers.get(0).getPbqContext() ? "" : papers.get(0).getPbqContext();
        int pbqNum = 0;
        System.out.println("测试填空");
        int serialNumber = 0;
        String pbqContext = "测试大题名称";
        log.info("====大题信息====");
        log.info(pbqContext);
        String strPbqContext = pbqContext.trim();
        //添加大题
        log.info("进入 :" + pbqContext);
        document.add(new Paragraph(++pbqNum + "、 " + pbqContext).setFont(watermark)
                .setFontSize(13)
                .setBold()
                .setFixedLeading(14));
        pbqContextNum = 0;
        //根据题目分组 每一个key对应一道小题
        String contextStr = "测试题目名称";
        contextStr += "----分值 :" + "测试分值";
        document.add(new Paragraph(++choiceCount + ".  " + contextStr).setFont(watermark).setBold().setFontSize(12).setFixedLeading(14));
        //添加选项
        char c = 'A';
        String string = String.valueOf(c++);
        String psqOptionValue = "测试选项答案";
        //带选择题答案的
//                            String itemStr = typeStr + " " + string + "." + psqOptionValue;
        //不带选择题答案
        String itemStr = string + "." + psqOptionValue;
        document.add(new Paragraph(itemStr).setFont(watermark)
                .setFontSize(8)
                .setBold()
                .setFixedLeading(8));

        document.add(new Paragraph(++pbqContextNum + ".  " + "测试内容").setFont(watermark).setBold().setFontSize(12).setFixedLeading(14));
        document.add(new Paragraph(++pbqContextNum + ".  " + contextStr).setFont(watermark).setBold().setFontSize(12).setFixedLeading(14));
        document.close();
        baos.flush();
        byte[] xmpMetadata = baos.toByteArray();
//        end
        log.info(Arrays.toString(xmpMetadata));
        log.info(Arrays.toString(pdf.getXmpMetadata()));
        log.info(Arrays.toString(document.getPdfDocument().getXmpMetadata()));
        log.info(Arrays.toString(document.getPdfDocument().getXmpMetadata()));

        ZipOutputStream zipOutputStream = new ZipOutputStream(response.getOutputStream());
        zipOutputStream.putNextEntry(new ZipEntry("pdf李四.pdf"));
        zipOutputStream.write(xmpMetadata);
        zipOutputStream.flush();
        zipOutputStream.putNextEntry(new ZipEntry("pdf王五.pdf"));
        zipOutputStream.write(xmpMetadata);
        zipOutputStream.flush();
        zipOutputStream.close();
//        pdf.close();
//        writer.flush();
//        writer.close();
        return null;
    }


版权声明:本文为qq_45194508原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。