Java HTML转换为PDF文件
1.场景描述
公司业务中需要将富文本编辑器保存的HTML格式文件转换成PDF文件供前端预览、下载及打印,因为富文本编辑器中,HTML的格式不太规范,并且样式比较多,Java基于IText对HTML文件进行转换对格式要求较为严格,并且转换样式可能出现问题,所以选用了基于WKHtmlToPdf的方式进行文档的转换。
WKHtmlToPdf是一个使用 WebKit 网页渲染引擎开发的用来将 HTML 文档转成 PDF 文档的工具,可以跟多种脚本语言进行集成来转换文档。官方网站:https://wkhtmltopdf.org/
2.使用准备
安装WKHtmlToPdf
下载网站:https://wkhtmltopdf.org/downloads.html
选择适合的版本安装(win11版本可能不兼容)
Linux安装
下载对应系统的rpm包到Linux环境中,到rpm包的目录下
rpm -ivh wkhtmltox-0.12.6-1.centos7.x86_64.rpm
可能出现安装失败,此时需要安装依赖的字体文件
执行安装依赖字体后再安装wkhtmltopdf
yum install xorg-x11-fonts-75dpi.noarch
安装后程序默认目录在 /usr/local/bin/wkhtmltopdf
3.测试转换
/usr/local/bin/wkhtmltopdf /test.html /test.pdf
软件安装目录 源html目录 目标pdf目录
转换成功!
4.整合Java
/**
*
* @param html 要转换的html字符串
* @param fileName 输出的pdf路径 如C://test.pdf
* @return
* @throws IOException
*/
public File html2PDF(String html,String fileName) throws IOException {
//指定转换的html文件目录
File target = new File("C:\\test.html");
//指定WKHTMLTOPDF安装目录
String wkhtmlToPdfPath = "D:\\Program Files\\wkhtmltopdf\\bin\\wkhtmltopdf";
//父目录不存在则创建
if(!target.getParentFile().exists()){
target.getParentFile().mkdir();
}
//读取html字符串 将html字符串转换为html文件
PrintWriter printWriter = new PrintWriter(new FileWriter(target));
printWriter.println(html);
printWriter.close();
//转换后的PDF文件路径
File transferPDF = new File(fileName);
//编写转换cmd命令
StringBuilder cmd = new StringBuilder();
cmd.append(wkhtmlToPdfPath);
//添加页眉 页码 页眉下的线
cmd.append(" --header-right 'TERMS & CONDITIONS' --header-line ");
//设置页眉和内容的距离,默认0
cmd.append(" --header-spacing 5 ");
//在页脚右边放置页码
cmd.append(" --footer-right [page]/[toPage] --footer-line ");
//拼接要转换的html文件路径
cmd.append(target.getAbsolutePath());
cmd.append(" ");
cmd.append(fileName);
System.out.println(cmd.toString());
boolean result = true;
Process proc = null;
try {
//执行cmd命令
proc = Runtime.getRuntime().exec(cmd.toString());
proc.waitFor();
} catch (Exception e) {
result = false;
log.error("转换失败!",e);
} finally {
proc.destroy();
}
return transferPDF;
}