iTexPDF整合flying saucer将复杂的Html/Css的页面输出成PDF,支持中文

2021-09-26 2364点热度 0人点赞 0条评论

前面的文章,有介绍如何利用iTextPDF将html转成PDF,详见:https://blog.terrynow.com/2021/08/10/itextpdf-5-x-convert-html-to-pdf-support-css-and-chinese/

不过发现一个问题,就是比较复杂的Html或者CSS样式的Html,输出生PDF后,并没有预期的效果,例如CSS里的居中,背景色等等。

实现

利用flying-saucer将很好的解决这个css问题,它可以用css2.1来渲染xhtml

引入pom

<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itextpdf</artifactId>
    <version>5.5.13.2</version>
</dependency>

<!-- HTML转PDF需要-->
<dependency>
    <groupId>com.itextpdf.tool</groupId>
    <artifactId>xmlworker</artifactId>
    <version>5.5.13.2</version>
</dependency>
<!-- 解决中文字体乱码问题-->
<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itext-asian</artifactId>
    <version>5.2.0</version>
</dependency>

<!-- 引入flying-saucer 支持css样式渲染 -->
<dependency>
    <groupId>org.xhtmlrenderer</groupId>
    <artifactId>flying-saucer-pdf-itext5</artifactId>
    <version>9.1.21</version>
</dependency>

利用Html转PDF的Java代码

public static void main(String[] args) throws Exception {
    String htmlStr = "";//从文件读取Html,或者怎么样其他的方式
    byte[] pdfBytes = html2Pdf("/path/tp/songti.ttf", strictFormatHtml(htmlStr));
}

/**
 * 利用jsoup,将html转成严格的xhtml格式
 * 详见: https://blog.terrynow.com/2021/08/29/jsoup-convert-html-to-xhtml/
 * @param html
 * @return
 */
public static String strictFormatHtml(String html) {
    org.jsoup.nodes.Document doc = Jsoup.parse(html);
    // jsoup生成闭合标签
    doc.outputSettings().syntax(org.jsoup.nodes.Document.OutputSettings.Syntax.xml);
    doc.outputSettings().escapeMode(Entities.EscapeMode.xhtml);
    return doc.html();
}

/**
 * 使用flying saucer转PDF,支持的css更加丰富一些
 * @param pdfFontBasic 为了支持中文,需要传入中文字体的路径
 * @param htmlStr 严格的xhtml格式的
 * @return 输出的PDF是bytes,也可以把ByteArrayOutputStream换成FileOutputStream就可以直接存成文件了,这里就省略了
 */
public static byte[] html2Pdf(String pdfFontBasic, String htmlStr) throws Exception {
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    ITextRenderer renderer = new ITextRenderer();
    renderer.setDocumentFromString(htmlStr);
    // 解决中文支持问题
    ITextFontResolver fontResolver = renderer.getFontResolver();
    fontResolver.addFont(pdfFontBasic, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);

    renderer.layout();
    renderer.createPDF(bos);
    return bos.toByteArray();
}

 

admin

这个人很懒,什么都没留下

文章评论

您需要 登录 之后才可以评论