itextpdf (8.0.3) 中文、html2pdf、和 SpringBoot 中的最佳实践

in 工作记录 with 0 comment

废话一堆

如此简单的需求, 中文社区 和 AI 却没有给我答案。

Why?

其实 itextpdf 本身已经做的很好了,或许英文文档也很好,只是我阅读困难,英语还是不得不练啊! 唉 ~

快速实战

依赖的导入

itext-core 为核心依赖,注意 Type 为 pom,也就意味的导入了多个 Jar。

html2pdf 就是字面意思,用代码写 PDF,实在是太痛苦了,HTML 对于大家来说会轻松不少,并且 itextpdf 对 HTML5 也有支持,相信能满足你不小的需求。

   <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itext-core</artifactId>
            <version>8.0.3</version>
            <type>pom</type>
        </dependency>
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>html2pdf</artifactId>
            <version>5.0.4</version>
        </dependency>

核心逻辑

    public void convertHtmlToPdf(String htmlContent, String pdfFileName) {
        try {
            ConverterProperties properties = new ConverterProperties();
            FontProvider fontProvider = new FontProvider();
            // 常用字体程序及对应编码
            fontProvider.addFont("STSongStd-Light", "UniGB-UCS2-H");
            properties.setFontProvider(fontProvider);
            // 将HTML字符串转换为PDF
            try (var pdfStream = new FileOutputStream(pdfFileName);) {
                HtmlConverter.convertToPdf(htmlContent, pdfStream, properties);
            }
            System.out.println("PDF created successfully.");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

这段代码并不复杂, 就是 HTML to PDF。

核心只有一行

HtmlConverter.convertToPdf(htmlContent, pdfStream, properties);

重点关注的只有 properties 中的 fontProvider, 为什么是 "STSongStd-Light", "UniGB-UCS2-H" ?

答案在这里:

image.png

可以看到 itextpdf(8.0.3)的依赖中,已经支持了中文字体。

你并不需要手动导入字体,或者去弄其他的 Jar 依赖。

HTML 模板、对象填充、文件下载

我认为直接见码更容易理解。

完整的例子写在了这里:

https://github.com/qq418745/itextpdf-example

这是生成的 PDF 的效果:

image.png