wkhtmltopdf是一个使用webkit网页渲染引擎开发的用来将 html转成 pdf的工具,可以跟多种脚本语言进行集成来转换文档。
官网地址 http://wkhtmltopdf.org/
github地址 https://github.com/wkhtmltopdf/wkhtmltopdf
首先下载文件:html转为pdf文件(wkhtmltox)(包括windows下exe安装文件和Linux下可执行文件),官方下载地址
一、windows下操作步骤
-
安装:wkhtmltox-0.12.3.2_msvc2013-win64.exe,cmd命令进入安装目录
-
运行:wkhtmltopdf.exe [参数,可选,可多个;wkhtmltopdf中文参数详解] <需要转的html路径,必填,可多个> <转成功后的pdf文件存放地址,必填>
a.例子: wkhtmltopdf.exe –page-size A4 www.baidu.com pdf.pdf
二、Linux下操作步骤
-
解压:命令:tar -xvf wkhtmltox-0.12.3_linux-generic-amd64.tar.xz
-
解决中文不显示或乱码问题:需要字体文件cjkuni-uming、smc、stix放入/usr/share/fonts目录下
-
运行:进入wkhtmltox/bin目录 ./wkhtmltopdf [参数,可选,可多个;wkhtmltopdf中文参数详解] <需要转的html路径,必填,可多个> <转成功后的pdf文件存放地址,必填>
a.例子: ./wkhtmltopdf –page-size A4 www.baidu.com pdf.pdf
三、通过Java调用wkhtmltox的可执行文件实现批量html转pdf
public class HtmlToPdf {
private static final Logger LOG = LoggerFactory.getLogger(HtmlToPdf.class);
private static final String TOPDFTOOL = "/root/wkhtmltox/bin/wkhtmltopdf";
/**
* 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();
if (!parent.exists()) {
parent.mkdirs();
}
StringBuilder cmd = new StringBuilder();
cmd.append(TOPDFTOOL);
cmd.append(" ");
cmd.append("--page-size A2");
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();
LOG.info("HTML2PDF成功,参数---html路径:{},pdf保存路径 :{}", new Object[] {srcPath, destPath });
} catch (Exception e) {
LOG.error("HTML2PDF失败,srcPath地址:{},错误信息:{}", new Object[]{srcPath, e.getMessage()});
result = false;
}
return result;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
/**
* 当java调用wkhtmltopdf时,用于获取wkhtmltopdf返回的内容
*/
public class HtmlToPdfInterceptor extends Thread {
private static final Logger LOG = LoggerFactory
.getLogger(HtmlToPdfInterceptor.class);
private InputStream is;
public HtmlToPdfInterceptor(InputStream is) {
this.is = is;
}
public void run() {
try {
InputStreamReader isr = new InputStreamReader(is, "utf-8");
BufferedReader br = new BufferedReader(isr);
br.readLine();
} catch (IOException e) {
LOG.error(e.getMessage());
e.printStackTrace();
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
/**
* 测试
*/
public class Test {
public static void main(String[] args) {
String htmlPath = "www.baidu.com";
String pdfPath = "/root/pdfFile/testpdf.pdf";
HtmlToPdf.convert(htmlPath, pdfPath );
}
}
另一篇不错的文章:
项目上的客户提出一个需求,把政务流程中的表单数据导出成pdf或者图片格式,用来作电子档案材料。表单基于公司的电子政务构建平台实现,在数据库保存的都是html格式,因此打算直接把表单html转成pdf或者图片。由于表单是已经写好了html页面,那我要做的就是能完美解析html+css的pdf生成工具。在百度上搜索html转pdf的结果,大部分都是用itext,itext的确是Java开源组件的第一选择。不过itext也有局限,就是要自己写模版,系统中的表单数量有好几百个,为每个表单做一个导出模版不现实。
最后,wkhtmltopdf进入了我的选择范围。wkhtmltopdf是一个使用webkit网页渲染引擎开发的用来将 html转成 pdf的工具,可以跟多种脚本语言进行集成来转换文档。
官网地址 http://wkhtmltopdf.org/
github地址 https://github.com/wkhtmltopdf/wkhtmltopdf
wkhtmltopdf把html转成pdf很简单,只要在windows命令行中输入
c:\wkhtmltopdf.exe http://www.csdn.NET c:\csdn.pdf
就可以把csdn网页转成pdf,并保存到C盘根目录。
在java中调用wkhtmltopdf的命令Runtime.getRuntime().exec("c:\wkhtmltopdf.exe http://www.csdn.Net c:\csdn.pdf")就可以实现转换。
下面把命令封装成java工具类,方便调用。
- import java.io.File;
-
- public class HtmlToPdf {
-
- private static final String toPdfTool = "c:\\wkhtmltopdf.exe";
-
-
-
-
-
-
-
- public static boolean convert(String srcPath, String destPath){
- File file = new File(destPath);
- File parent = file.getParentFile();
-
- 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中有这种现象)。
- import java.io.BufferedReader;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.InputStreamReader;
-
-
-
-
- public class HtmlToPdfInterceptor extends Thread {
- private InputStream is;
-
- public HtmlToPdfInterceptor(InputStream is){
- this.is = is;
- }
-
- public void run(){
- try{
- InputStreamReader isr = new InputStreamReader(is, "utf-8");
- BufferedReader br = new BufferedReader(isr);
- String line = null;
- while ((line = br.readLine()) != null) {
- System.outlprintln(line.toString());
- }
- }catch (IOException e){
- e.printStackTrace();
- }
- }
- }
在Servlet中调用
-
-
-
- @WebServlet("/htmltopdf/servlet")
- public class HtmlToPdfServlet extends HttpServlet {
- private static final long serialVersionUID = 1L;
-
-
-
-
- protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- String path = request.getParameter("path");
- if(path == null || path.equals("")){
- return;
- }
-
-
-
-
- String pdfPath = request.getSession().getServletContext().getRealPath("/tmp");
- String pdfName = UUID.randomUUID().toString() + ".pdf";
-
- if(HtmlToPdf.convert(path, pdfPath + "/" + pdfName)){
- response.sendRedirect(request.getContextPath() + "/tmp/" + pdfName);
- }
- }
- }
在浏览器中输入http://<网站路径>/htmltopdf/servlet?path=http://blog.csdn.net