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