UDN-企业互联网技术人气社区

板块导航

浏览  : 2656
回复  : 0

[讨论交流] Java操作wkhtmltopdf实现Html转PDF

[复制链接]
芭芭拉的头像 楼主
发表于 2016-12-31 16:09:32 | 显示全部楼层 |阅读模式
本帖最后由 芭芭拉 于 2016-12-31 16:13 编辑

  做java开发的都知道,java生成pdf大部分都是用itext,itext的确是java开源组件的第一选择。不过itext也有局限,就是要自己写模版,系统中的表单数量有好几百个,为每个表单做一个导出模版不现实。 所以找了个直接可以调用的工具wkhtmltopdf,将生成好的html直接转换成pdf。功能很强大。

  wkhtmltopdf是一个使用webkit网页渲染引擎开发的用来将 html转成 pdf的工具,可以跟多种脚本语言进行集成来转换文档。

  官网地址 http://wkhtmltopdf.org/

  github地址 https://github.com/wkhtmltopdf/wkhtmltopdf

  wkhtmltopdf把html转成pdf很简单,只要在windows命令行中输入c:\wkhtmltopdf.exe http://www.cnblogs.com c:\cnblogs.pdf

  就可以把博客园网页转成pdf,并保存到C盘根目录。

  在java中调用wkhtmltopdf的命令Runtime.getRuntime().exec("c:\wkhtmltopdf.exe http://www.cnblogs.com c:\cnblogs.pdf")就可以实现转换。

  下面把命令封装成java工具类,方便调用。
  1. /**
  2. * 版权所有(C) 2016 www.xiongge.club
  3. * @author xsw
  4. * @date 2016-12-8 上午10:17:33
  5. */
  6. package wkhtmltopdf;
  7. import java.io.BufferedReader;
  8. import java.io.IOException;
  9. import java.io.InputStream;
  10. import java.io.InputStreamReader;
  11. /**
  12. * @ClassName: HtmlToPdfInterceptor
  13. * @Description: TODO()
  14. * @author xsw
  15. * @date 2016-12-8 上午10:17:33
  16. *  
  17. */

  18. public class HtmlToPdfInterceptor extends Thread {
  19.     private InputStream is;
  20.    
  21.     public HtmlToPdfInterceptor(InputStream is){
  22.         this.is = is;
  23.     }
  24.    
  25.     public void run(){
  26.         try{
  27.             InputStreamReader isr = new InputStreamReader(is, "utf-8");
  28.             BufferedReader br = new BufferedReader(isr);
  29.             String line = null;
  30.             while ((line = br.readLine()) != null) {
  31.                 System.out.println(line.toString()); //输出内容
  32.             }
  33.         }catch (IOException e){
  34.             e.printStackTrace();
  35.         }
  36.     }
  37. }
  38. /**
  39. * 版权所有(C) 2016 www.xiongge.club
  40. * @author xsw
  41. * @date 2016-12-8 上午10:14:54
  42. */
  43. package wkhtmltopdf;

  44. import java.io.File;

  45. /**
  46. * @ClassName: HtmlToPdf
  47. * @Description: TODO()
  48. * @author xsw
  49. * @date 2016-12-8 上午10:14:54
  50. *  
  51. */

  52. public class HtmlToPdf {
  53.     //wkhtmltopdf在系统中的路径
  54.     private static final String toPdfTool = "D:\\wkhtmltopdf\\bin\\wkhtmltopdf.exe";
  55.    
  56.     /**
  57.      * html转pdf
  58.      * @param srcPath html路径,可以是硬盘上的路径,也可以是网络路径
  59.      * @param destPath pdf保存路径
  60.      * @return 转换成功返回true
  61.      */
  62.     public static boolean convert(String srcPath, String destPath){
  63.         File file = new File(destPath);
  64.         File parent = file.getParentFile();
  65.         //如果pdf保存路径不存在,则创建路径
  66.         if(!parent.exists()){
  67.             parent.mkdirs();
  68.         }
  69.         
  70.         StringBuilder cmd = new StringBuilder();
  71.         cmd.append(toPdfTool);
  72.         cmd.append(" ");
  73.         cmd.append("  --header-line");//页眉下面的线
  74.         cmd.append("  --header-center 这里是页眉这里是页眉这里是页眉这里是页眉 ");//页眉中间内容
  75.         //cmd.append("  --margin-top 30mm ");//设置页面上边距 (default 10mm)
  76.         cmd.append(" --header-spacing 10 ");//    (设置页眉和内容的距离,默认0)
  77.         cmd.append(srcPath);
  78.         cmd.append(" ");
  79.         cmd.append(destPath);
  80.         
  81.         boolean result = true;
  82.         try{
  83.             Process proc = Runtime.getRuntime().exec(cmd.toString());
  84.             HtmlToPdfInterceptor error = new HtmlToPdfInterceptor(proc.getErrorStream());
  85.             HtmlToPdfInterceptor output = new HtmlToPdfInterceptor(proc.getInputStream());
  86.             error.start();
  87.             output.start();
  88.             proc.waitFor();
  89.         }catch(Exception e){
  90.             result = false;
  91.             e.printStackTrace();
  92.         }
  93.         
  94.         return result;
  95.     }
  96.     public static void main(String[] args) {
  97.         HtmlToPdf.convert("http://www.cnblogs.com/xionggeclub/p/6144241.html", "d:/wkhtmltopdf.pdf");
  98.     }
  99. }
复制代码

  附上wkhtmltopdf 参数详解  
复制代码

  常规选项

  •  --allow <path>  允许加载从指定的文件夹中的文件或文件(可重复)
  •     --book*  设置一会打印一本书的时候,通常设置的选项
  •      --collate  打印多份副本时整理
  •      --cookie <name> <value>  设置一个额外的cookie(可重复)
  •      --cookie-jar <path>  读取和写入的Cookie,并在提供的cookie jar文件
  •      --copies <number>  复印打印成pdf文件数(默认为1)
  •      --cover* <url>  使用HTML文件作为封面。它会带页眉和页脚的TOC之前插入
  •      --custom-header <name> <value>  设置一个附加的HTTP头(可重复)
  •      --debug-JavaScript  显示的JavaScript调试输出
  •     --default-header*  添加一个缺省的头部,与页面的左边的名称,页面数到右边,例如: --header-left '[webpage]' --header-right '

相关帖子

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于我们
联系我们
  • 电话:010-86393388
  • 邮件:udn@yonyou.com
  • 地址:北京市海淀区北清路68号
移动客户端下载
关注我们
  • 微信公众号:yonyouudn
  • 扫描右侧二维码关注我们
  • 专注企业互联网的技术社区
版权所有:用友网络科技股份有限公司82041 京ICP备05007539号-11 京公网网备安1101080209224 Powered by Discuz!
快速回复 返回列表 返回顶部