前面的文章,有介绍如何利用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(); }
文章评论