项目中有个需求要把病人的报告转成pdf打印,刚开始在网上找了很多资料各种方法都有最后选择了wkhtmltopdf。wkhtmltopdf是一个使用webkit网页渲染引擎开发的用来将 html转成 pdf的工具,可以跟多种脚本语言进行集成来转换文档。
因为需要下载插件:
wkhtmltopdf把html转成pdf很简单,只要在windows命令行中输入
D:\wkhtmltox\bin\wkhtmltopdf.exe https://www.jianshu.com c:\test.pdf
这样就可以把简书网页保存到C盘根目录下了。
在java中调用wkhtmltopdf的命令Runtime.getRuntime().exec("D:\wkhtmltox\bin\wkhtmltopdf.exe https://www.jianshu.com c:\test.pdf")就可以实现转换。
下面是封装的工具类
public class HtmlToPdf {
//wkhtmltopdf在系统中的路径
private static final StringtoPdfTool ="D:\\wkhtmltox\\bin\\wkhtmltopdf.exe";
/**
* html转pdf
*
* @param srcPath html路径,可以是硬盘上的路径,也可以是网络路径
* @param destPath pdf保存路径
* @return 转换成功返回true
*/
public static boolean convert(String srcPath, String destPath) {
File file =new File(destPath);
File parent = file.getParentFile();
//如果pdf保存路径不存在,则创建路径
if (!parent.exists()) {
parent.mkdirs();
}
StringBuilder cmd =new StringBuilder();
cmd.append(toPdfTool);
cmd.append(" ");
cmd.append(srcPath);
cmd.append(" ");
cmd.append(destPath);
boolean result =true;
try {
Process proc = Runtime.getRuntime().exec(cmd.toString());
HtmlToPdfInterceptor error =new HtmlToPdfInterceptor(proc.getErrorStream());
HtmlToPdfInterceptor output =new HtmlToPdfInterceptor(proc.getInputStream());
error.start();
output.start();
proc.waitFor();
}catch (Exception e) {
result =false;
e.printStackTrace();
}
return result;
}
}
接收Process的输入和错误信息时,需要创建另外的线程,否则当前线程会一直等待(在Tomcat中有这种现象)。
最后在项目中调用即可生成自己想要的pdf