最近项目上需要做一个在线合同的功能,合同有电子版,需要把网页版的合同直接生产pdf,要求样式不能乱,有页码有页眉页脚等等,在网上搜索一段时间后,找到了一个工具叫: wkhtmltopdf ,这应该是国外的一款免费软件,有Windows,mac,linux版,直接在命令行调用,这几天完成了一个demo,顺便总结一下。
这是此工具的官网: http://wkhtmltopdf.org/downloads.html 所需要的工具可以在这里下载,免费。
// 2018年6月22日9:00 好像这个工具无法解析angularjs……
先贴上demo代码:
调用类:
package WkHtmlToPDF;
import java.io.File;
import java.util.Date;
/**
* Created by Jerry on 2017/2/13.
* God Bless Me
*/
public class wkhtmltopdf {
//wkhtmltopdf 在系统中的路径
private static final String toPdfTool = "C:\\Program Files\\wkhtmltopdf\\bin\\wkhtmltopdf.exe";
public static void main(String[] args) {
Date date = new Date();
String fileName = String.valueOf(date.getTime()) + ".pdf";
convert("http://www.jianshu.com/p/74e3a6ee4ae8", "D:\\PDF\\" + fileName);
}
/**
* 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 = getFormal();
//html路径 即目标网页路径
cmd.append(" ");
cmd.append(srcPath);
cmd.append(" ");
//pdf保存路径
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;
}
/**
* 标准格式
*
* @return
*/
public static StringBuilder getFormal() {
StringBuilder cmd = new StringBuilder();
//wkhtmltopdf 在系统中的路径
cmd.append(toPdfTool);
cmd.append(" ");
cmd.append(" --header-line");//页眉下面的线
// cmd.append(" --footer-line");//页脚上面的线
cmd.append(" --footer-center [page]/[topage]"); //在页脚中心放置页码
// cmd.append(" --header-right 这里是我们系统的页眉"); //页眉中间放置文字
cmd.append(" --header-html http://localhost:8090/myheader.html"); //页眉中间放置图片
cmd.append(" --header-spacing 5 ");// (设置页眉和内容的距离,默认0 )
cmd.append(" --margin-top 20mm "); //设置页面上边距 (default 10mm)
cmd.append(" cover http://localhost:8090/firstPage.html ");
return cmd;
}
public static StringBuilder test1() {
StringBuilder cmd = new StringBuilder();
//wkhtmltopdf 在系统中的路径
cmd.append(toPdfTool);
// cmd.append(" --cover http://localhost:8090/firstPage.html");
cmd.append(" -T 15mm");
cmd.append("