使用 IText 将 HTML 转化为 PDF

前篇

使用 Thymeleaf 动态渲染 HTML

1、添加依赖

        
        
            com.itextpdf
            itextpdf
            5.4.2
        

        
            org.xhtmlrenderer
            core-renderer
            R8
        

2、编码工具类


import com.itextpdf.text.pdf.BaseFont;
import com.lowagie.text.DocumentException;
import org.springframework.stereotype.Component;
import org.xhtmlrenderer.pdf.ITextFontResolver;
import org.xhtmlrenderer.pdf.ITextRenderer;

import java.io.IOException;
import java.io.OutputStream;

/**
 * 导出PDF文件转换工具
 */
public class PDFUtil{

    /**
     * 生成 PDF 文件
     * @param out 输出流
     * @param html HTML字符串
     * @throws IOException IO异常
     * @throws DocumentException Document异常
     */
    public static void createPDF(OutputStream out, String html) throws IOException, DocumentException {
        ITextRenderer renderer = new ITextRenderer();
        renderer.setDocumentFromString(html);
        // 解决中文支持问题
        ITextFontResolver fontResolver = renderer.getFontResolver();
        fontResolver.addFont("pdf/font/fangsong.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
        fontResolver.addFont("pdf/font/PingFangSC.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
        renderer.layout();
        renderer.createPDF(out);
    }

}

字体文件自行下载,并添加到 resouces 路径下,上述路径对应修改

3、效果演示

遇到的问题与解决方法

1、Maven 打包源码后,导致 HTML 文件内容被篡改

  • 原因:Maven 插件使用的占位符 ${} 与 Thymeleaf冲突
  • 解决方法:在 pom.xml 中配置资源文件,打包时不对html文件的占位符进行处理

    ...
    
        
            src/main/resources
            true
            
                **/*.html
            
        
        
            src/main/resources
            false
            
                **/*.html
            
        
    

2、使用 Docker 制作镜像时,下载文件时报错,缺少字体处理类

  • 使用镜像源 java:8 而不是 openjdk:8-jre-alpine

你可能感兴趣的:(使用 IText 将 HTML 转化为 PDF)