首发于 技术分享
itext7 : html转PDF

itext7 : html转PDF

需求分析 :将html模板,在填充数据后转换为pdf

itext7进行html转换使用类:com.itextpdf.html2pdf.HtmlConverter。它主要有三类操作:convertToPdf直接转换为pdf文件。convertToDocument转为document文档,这样有利于进行pdf页面调整。convertToElements拆解pdf标签。我这里因为html转换后会有多页,这里通过convertToDocument调整页面大小,在一页上显示所有内容;同时我使用ByteArrayOutputStream类,这个的好处是不在本地生成文件,减少磁盘操作,但是这种方式也有人说效率不高,使用者可以斟酌后使用.

开发步骤

1.添加pom.xml

<!-- pdfHTML -->
<dependency>
 <groupId>com.itextpdf</groupId>
 <artifactId>html2pdf</artifactId>
 <version>1.0.2</version>
</dependency>
<!-- add all iText 7 Community modules --,如果需要中文,需要引人语言包>
<dependency>
 <groupId>com.itextpdf</groupId>
 <artifactId>itext7-core</artifactId>
 <version>7.0.5</version>
 <type>pom</type>
</dependency>

2.html转pdf

public class Html2PdfUtil {
    public static void main(String[] args) throws Exception {
        String html = "<p><span style=\"font-family: Microsoft YaHei;\">微软雅黑: 粗体前A<strong>A粗体A</strong>A粗体后</span></p>\n" +
                "<p><span style=\"font-family: SimSun;\">宋体: 粗体前A<strong>A粗体A</strong>A粗体后</span></p>\n" +
                "<p><span style=\"font-family: STHeiti;\">黑体: 粗体前A<strong>A粗体A</strong>A粗体后</span></p>" +
                "<p><span style=\"font-family: Times New Roman;\">Times New Roman: pre bdA<strong>AbdA</strong>Aaft bd</span></p>\n";
        FileOutputStream fileOutputStream = new FileOutputStream("D:/Test/a.pdf");
        fileOutputStream.write(convert(html));
        fileOutputStream.close();
    public static byte[] convert(String html) throws IOException {
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        ConverterProperties props = new ConverterProperties();
        FontProvider fp = new FontProvider(); // 提供解析用的字体
        fp.addStandardPdfFonts(); // 添加标准字体库、无中文
        ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
        fp.addDirectory(classLoader.getResource("fonts").getPath()); // 自定义字体路径、解决中文,可先用绝对路径测试。
        props.setFontProvider(fp);
        // props.setBaseUri(baseResource); // 设置html资源的相对路径