1、需要的jar包:org.xhtmlrenderer.flying-saucer-pdf-itext5,Maven依赖如下:
<dependency>
<groupId>org.xhtmlrenderer</groupId>
<artifactId>flying-saucer-pdf-itext5</artifactId>
<version>9.0.7</version>
</dependency>
2、中文支持
由于HTML代码中存在中文,需要添加中文支持,需要把需要的字体文件添加到项目中
3、转换PDF主代码
/**
* HTML代码转PDF文档
*
* @param content 待转换的HTML代码
* @param storagePath 保存为PDF文件的路径
*/
@Override
public void parsePdf(String content, String storagePath) {
FileOutputStream os = null;
try {
File file = new File(storagePath);
if(!file.exists()) {
file.createNewFile();
}
os = new FileOutputStream(file); ITextRenderer renderer = new ITextRenderer();
//解决中文支持问题
ITextFontResolver resolver = renderer.getFontResolver();
resolver.addFont("/static/font/ARIALUNI.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
renderer.setDocumentFromString(content);
// 解决图片的相对路径问题,图片路径必须以file开头
// renderer.getSharedContext().setBaseURL("file:/");
renderer.layout();
renderer.createPDF(os); } catch (DocumentException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
if(null != os) {
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
4、如果从文件中读取HTML代码,需要使用InputStream进行读取,不要使用FileReader读取,不知道为什么,使用FileReader读取的内容解析会错误
StringBuilder content = new StringBuilder();
byte[] bys = new byte[1024];
int len;
in = new BufferedInputStream(new FileInputStream(htmlFilePath));
while ((len = in.read(bys)) != -1) {
content.append(new String(bys, 0, len));
}
5、如果想把生成PDF内容返回为byte数组,可以在调用renderer.createPDF(os)方法时,传入的是ByteArrayOutputStream,然后调用输出流的toByteArray即可。