使用iText库创建PDF文件(含中文解决方案)

所涉及到的JAR包地址: 下载地址
文档记录了生成PDF的4种场景:
第一部分:直接生成PDF文件;
第二部分:将HTML文件转成PDF文件;
第三部分:将字节流转成PDF文件,并放入servletResponse(本地不生成文件);
第四部分:将字节流转成PDF文件并打包成压缩包,并放入servletResponse(本地不生成文件);
第五部分:html转pdf,中文解决方案

第一部分,先记录下直接生成PDF文件:


        Document document = new Document();
        PdfWriter writer = null;
        try {
            writer = PdfWriter.getInstance(document, new FileOutputStream("C:\\Users\\cdp\\Desktop\\HelloWorld.pdf"));
            document.open();

            // 使用iTextAsian.jar中的字体
            BaseFont baseFont = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
            Font font = new Font(baseFont);
            document.add(new Paragraph("this is A Hello World PDF document"));
            document.add(new Paragraph("this is b Hello World PDF document"));
            document.add(new Paragraph("这里是中文段落", font));// 注意这里要设置paragaph的字体

        } catch (DocumentException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } finally {
            document.close();
            writer.close();
        }

第二部分,记录下将html文件内容,转成pdf文件

    Document document = new Document();
        PdfWriter writer = null;
        try {
            writer = PdfWriter.getInstance(document, new FileOutputStream("C:\\Users\\cdp\\Desktop\\HelloWorld.pdf"));
            document.open();

            XMLWorkerHelper.getInstance().parseXHtml(writer, document,
                    new FileInputStream("C:\\Users\\cdp\\Desktop\\用户电子协议测试文档.html"), Charset.forName("UTF-8"));

        } catch (DocumentException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } finally {
            document.close();
            writer.close();
        }

第三部分,将字节流转成PDF并放入servletResponse

    // 组装完的最新文件内容
            byte tag_bytes[] = templateContent.getBytes();

            // 往输出流写入内容
            Document document = new Document();
            PdfWriter writer = null;
            try {
                out = response.getOutputStream();
                writer = PdfWriter.getInstance(document, out);
                document.open();

                XMLWorkerHelper.getInstance().parseXHtml(writer, document, new ByteArrayInputStream(tag_bytes),
                        Charset.forName("UTF-8"));

                document.close();
                writer.close();
            } catch (DocumentException e) {
                e.printStackTrace();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } finally {
                document.close();
                writer.close();
            }

第四部分,生成PDF压缩包,放入servletResponse

zipOutputStream = new ZipOutputStream(response.getOutputStream());
for(Object object: lisst){
        byte tag_bytes[] = templateContent.getBytes();

                String fileame = customerInfo.getName() + "_" + customerInfo.getTrueName() + "_"
                        + customerGoodsAccountFlow.getId() + ".pdf";
                ZipEntry entry = new ZipEntry(fileame);
                zipOutputStream.putNextEntry(entry);

                // 往输出流写入内容
                Document document = new Document();
                PdfWriter writer = PdfWriter.getInstance(document, zipOutputStream);
                writer.setCloseStream(false);//这一步很重要,是为了让writer不主动document的流
                document.open();
                XMLWorkerHelper.getInstance().parseXHtml(writer, document, new ByteArrayInputStream(tag_bytes),
                        Charset.forName("UTF-8"));
                document.close();
                zipOutputStream.closeEntry();
}
记得关闭流

第五部分,HTML转PDF时,如果HTML文件含中文内容,则需要在html文件中设置字体:

  <style type="text/css">
        /*解决html转pdf文件中文不显示的问题*/
        body {
            font-family: SimSun;/*宋体*/
        }

        /*设定纸张大小*/
        /* A4纸 */
        /* @page{size:210mm*297mm} */
        @page{size:a4}

        p {
            color: red;
        }
   </style>

其中, font-family: SimSun;/宋体/需要服务器本身含有该字体,若没有该字体,则通过给服务器加入字体文件来实现支持,(可以谷歌一波,给linux安装中文字体),当然这里也有一份帖子来介绍如果安装: 安装中文字体,友情链接

猜你喜欢

转载自blog.csdn.net/qq_33144861/article/details/79202587