wkhtmltopdf工具

一、介绍

1.wkhtmltopdf是一个独立安装、通过命令行交互、开源免费的将html内容转为pdf或图片的工具,命令行交互意味着只要能够调用本地命令(cmd或shell等)的开发语言均可使用,比如Java。其本质是使用内置浏览器内核渲染目标网页,然后再将网页渲染结果转换为PDF文档或图片。wkhtmltopdf官网地址:wkhtmltopdf,选择合适的系统版本安装即可。

二、使用

使用前:

wkhtmltopdf官网,选择合适的系统版本安装即可。

1.1命令格式

wkhtmltopdf [GLOBAL OPTION]... [OBJECT]... <output file>

wkhtmltopdf:是安装目录下bin文件夹中的wkhtmltopdf.exe

GLOBAL OPTION: 全局选项,html转pdf过程中一些参数配置,详细参数见文章底部或执行 wkhtmltopdf -h 命令查询。

OBJECT:需要转pdf的html,可以是文件本地路径或URL地址

output file:生成pdf的文件路径

1.2java使用

    //wkhtmltopdf在系统中的路径
    private static final String toPdfTool = "D:\\wkhtmltopdf\\bin\\wkhtmltopdf.exe";


    public static void main(String[] args) {
        htmlToPdf("D:\\wkhtmltopdf\\baidu.html","D:\\wkhtmltopdf\\baidu1.pdf");
//        htmlToPdf("www.baidu.com","D:\\wkhtmltopdf\\baidu2.pdf");
    }

    /**
     * html转PDF
     *
     * @param htmlPath html路径
     * @param pdfPath  pdf路径
     */
    public static void htmlToPdf(String htmlPath, String pdfPath) {
        File file = new File(pdfPath);
        File parent = file.getParentFile();
        //如果pdf保存路径不存在,则创建路径
        if (!parent.exists()) {
            parent.mkdirs();
        }
        StringBuilder cmd = new StringBuilder();
        if (System.getProperty("os.name").indexOf("Windows") == -1) {
            //非windows 系统
            //toPdfTool = FileUtil.convertSystemFilePath("/home/ubuntu/wkhtmltox/bin/wkhtmltopdf");
        }
        cmd.append(toPdfTool);
        cmd.append(" ");
        //开启本地文件访问
//        cmd.append("--enable-local-file-access ");
        //cmd.append(" --header-line");//页眉下面的线
        //cmd.append(" --header-center 这里是页眉这里是页眉这里是页眉这里是页眉 ");//页眉中间内容
        //cmd.append(" --margin-top 3cm ");//设置页面上边距 (default 10mm)
        //cmd.append(" --header-html file:///" + WebUtil.getServletContext().getRealPath("") + FileUtil.convertSystemFilePath("\\style\\pdf\\head.html"));// (添加一个HTML页眉,后面是网址)
        //cmd.append(" --header-spacing 5 ");// (设置页眉和内容的距离,默认0)
        //cmd.append(" --footer-center (设置在中心位置的页脚内容)");//设置在中心位置的页脚内容
        //cmd.append(" --footer-html file:///" + WebUtil.getServletContext().getRealPath("") + FileUtil.convertSystemFilePath("\\style\\pdf\\foter.html"));// (添加一个HTML页脚,后面是网址)
        //cmd.append(" --footer-line");//* 显示一条线在页脚内容上)
        //cmd.append(" --footer-spacing 5 ");// (设置页脚和内容的距离)
        cmd.append(htmlPath);
        cmd.append(" ");
        cmd.append(pdfPath);
        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) {
            e.printStackTrace();
        }
    }

HtmlToPdfInterceptor文件 wkhtmltopdf 执行信息拦截

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

/**
 * wkhtmltopdf.exe执行信息拦截
 */
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.out.println(line.toString()); //输出内容
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

转换结果

pdf内容

三、扩展

wkhtmltopdf官网下载安装的路径bin文件下wkhtmltoimage工具,我们也可以通过他将html转成图片。

1.1命令格式

wkhtmltoimage [GLOBAL OPTION]... [OBJECT]... <output file>

wkhtmltoimage:工具文件

GLOBAL OPTION:参数配置与上面部分不同

OBJECT:html地址或链接

output file:输出文件地址,文件是图片格式后缀

参数:

--crop-h  <integer>  页面截取高
--crop-w  <integer>  页面截取宽度
--crop-x  <integer>  页面横坐标
--crop-y  <integer>  页面纵坐标
--quality <integer>  设置生成图片的质量,默认是 94,取值范围是 0~100.
--height  <integer>  生成图片高
--width   <integer>  生成图片宽度

1.2java使用

private static final String toImgTool = "D:\\wkhtmltopdf\\bin\\wkhtmltoimage.exe";

    public static void htmlToImg(String srcPath, String destPath) {
        try {
            File file = new File(destPath);
            File parent = file.getParentFile();
            //如果pdf保存路径不存在,则创建路径
            if (!parent.exists()) {
                parent.mkdirs();
            }
            StringBuilder cmd = new StringBuilder();
            if (System.getProperty("os.name").indexOf("Windows") == -1) {
                //非windows 系统
                //toPdfTool = "/home/ubuntu/wkhtmltox/bin/wkhtmltopdf";
            }
            cmd.append(toImgTool);
            cmd.append(" ");
            //cmd.append("--crop-w 400 --width 1680 --quality 50 ");
            cmd.append(srcPath);
            cmd.append(" ");
            cmd.append(destPath);

            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) {
            e.printStackTrace();
        }
    }

四、注意事项

  1. Linux系统环境下转换成pdf需要参数配置字体信息,不然会出现中文字体展示异常情况;

  1. Linux系统环境下转换成图片无法通过参数配置字体信息解决中文乱码问题,需要服务器做字体的挂载;

  1. html使用url链接时最好是同步页面(数据展示同步渲染出来结果),调用后台方法的时候,后台是执行了命令,直接把当前网页路径转成pdf或者图片,如果是异步请求,数据没有渲染完成,生成的pdf或者图片不完整;

  1. 转成pdf或者网页的时候,不支持css3部分样式;不支持新的自定义html标签,例如定义的组件,template等;

五、参数

下面命令行,摘自官网

      --no-collat​​e打印多个时不进行整理副本
                                      
      --cookie-jar <path>读取和写入cookie,提供的cookie jar文件
                                      
      --copies <number>要打印到pdf中的份数,文件(默认1)
                                      
  -d, -  dpi <dpi>显式更改dpi(这没有对基于X11的系统的影响)(默认为96)
                                      
  -H, -  extended-help显示更广泛的帮助,详细说明不太常见的命令开关
                                      
  -g, -  grayscale PDF将以灰度生成
  -h, -  help显示帮助
      --htmldoc输出程序html帮助
      --image-dpi <integer>当嵌入图像时将它们缩小到
                                      这个dpi(默认为600)
      --image-quality <integer>当jpeg压缩图像时使用它
                                      质量(默认94)
      --license输出许可证信息并退出
      --log-level <level>将日志级别设置为:none,error,warn或
                                      信息(默认信息)
  -l, -  lowquality生成较低质量的pdf / ps。有用的
                                      缩小结果文档空间
      --manpage输出程序手册页
  -B, -  margin-bottom <unitreal>设置页面底部边距
  -L, -  margin-left <unitreal>设置页面左边距(默认为10mm)
  -R, -  margin-right <unitreal>设置页面右边距(默认为10mm)
  -T, -  margin-top <unitreal>设置页面上边距
  -O, - 方向<orientation>将方向设置为横向或纵向
                                      (默认人像)
      --page-height <unitreal>页面高度
  -s, -  page-size <尺寸>将纸张尺寸设置为:A4,Letter等
                                      (默认A4)
      --page-width <unitreal>页面宽度
      --no-pdf-compression不要在pdf上使用无损压缩
                                      对象
  -q, -  quiet更加冗长,为倒退而维护
                                      兼容性; 与使用--log-level相同
                                      没有
      --read-args-from-stdin从stdin读取命令行参数
      --readme输出程序自述文件
      --title <text>生成的pdf文件的标题(如果没有,则使用第一个文档的标题指定)
                                      
                                      
      --use-xserver使用X服务器(一些插件和其他插件)没有X11可能无法正常工作
                                      
  -V, -  version输出版本信息并退出
 
大纲选项:
      --dump-default-toc-xsl将默认的TOC xsl样式表转储到标准输出
                                      
      --dump-outline <file>将大纲转储到文件中
      --outline将大纲放入pdf(默认)
      --no-outline不要在pdf中加入大纲
      --outline-depth <level>设置轮廓的深度(默认为4)
 
页面选项:
      --allow <path>允许指定的文件要加载的文件夹(可重复)
                                      
      --background打印背景(默认)
      --no-background不打印背景
      --bypass-proxy-for <value>绕过主机代理(可重复)
      --cache-dir <path> Web缓存目录
      --checkbox-checked-svg <path>选中渲染时使用此SVG文件
                                      复选框
      --checkbox-svg <path>在未选中呈现时使用此SVG文件复选框
                                      
      --cookie <name> <value>设置一个额外的cookie(可重复),值应该是url编码的。
                                      
      --custom-header <name> <value>设置一个额外的HTTP头(可重复)
      --custom-header-propagation添加指定的HTTP头- 每个资源请求的自定义标头。
                                      
      --no-custom-header-propagation不添加指定的HTTP头- 每个资源请求的自定义标头。
                                      
      --debug -javascript显示javascript调试输出
      --no-debug-javascript不显示javascript调试输出(默认)
                                      
      --default-header添加一个默认标题,其名称为页面左侧,页码到右边,这是:
                                      --header左= '[网页]'
                                      --header-right ='[page] / [toPage]' -  top 2cm
                                      --header线
      --encoding <encoding>设置输入的默认文本编码
      --disable-external-links不要链接到远程网页
      --enable-external-links建立到远程网页的链接(默认)
      --disable-forms不要将HTML表单字段转换为pdf格式字段(默认)
      --enable-forms将HTML表单字段转换为pdf表单字段
      --images加载或打印图像(默认)
      --no-images不加载或打印图像
      --disable-internal-links不要建立本地链接
      --enable-internal-links制作本地链接(默认)
  -n, -  disable-javascript不允许网页运行javascript
      --enable-javascript允许网页运行javascript
                                      (默认)
      --javascript-delay <msec>等待几毫秒的javascript
                                      完成(默认200)
      --keep-relative-links将相对外部链接保持为相对
                                      外部链接
      --load-error-handling <handler>指定如何处理失败的页面
                                      load:abort,ignore或skip(默认值
                                      中止)
      --load-media-error-handling <handler>指定如何处理媒体文件
                                      无法加载:中止,忽略或跳过
                                      (默认忽略)
      --disable-local-file-access不允许转换本地文件
                                      读取其他本地文件,除非
                                      明确允许使用--allow
      --enable-local-file-access允许将本地文件转换为read
                                      在其他本地文件中。(默认)
      --minimum-font-size <int>最小字体大小
      --exclude-from-outline不要在表格中包含该页面
                                      内容和大纲
      --include-in-outline在目录中包含该页面
                                      和轮廓(默认)
      --page-offset <offset>设置起始页码(默认为0)
      --password <密码> HTTP验证密码
      --disable-plugins禁用已安装的插件(默认)
      --enable-plugins启用已安装的插件(插件将
                                      可能不起作用)
      --post <name> <value>添加额外的帖子字段(可重复)
      --post-file <name> <path>发布一个附加文件(可重复)
      --print-media-type使用print media-type而不是screen
      --no-print-media-type不要使用打印介质类型而不是
                                      屏幕(默认)
  -p, -  proxy <proxy>使用代理
      --proxy-hostname-lookup使用代理解析主机名
      --radiobutton-checked-svg <path>选中渲染时使用此SVG文件
                                      单选按钮
      --radiobutton-svg <path>在未选中渲染时使用此SVG文件
                                      单选按钮
      --resolve-relative-links将相对外部链接解析为
                                      绝对链接(默认)
      --run-script <js>运行此附加的javascript后
                                      页面加载完成(可重复)
      --disable-smart-shrinking禁用智能收缩策略
                                      由WebKit用来制作像素/ dpi
                                      比率无常数
      --enable-smart-shrinking启用智能收缩策略
                                      由WebKit用来制作像素/ dpi
                                      比率无常数(默认)
      --ssl-crt-path <path> ssl客户端证书公钥的路径
                                      OpenSSL PEM格式,可选择后跟
                                      中级ca和可信证书
      --ssl-key-password <密码> ssl客户端证书私钥的密码
      --ssl-key-path <path> ssl客户端证书私钥的路径
                                      OpenSSL PEM格式
      --stop-slow-scripts停止慢速运行javascripts(默认)
      --no-stop-slow-scripts不要停止慢速运行javascripts
      --disable-toc-back-links不要从节头到toc链接
                                      (默认)
      --enable-toc-back-links从节头到toc的链接
      --user-style-sheet <url>指定要加载的用户样式表
                                      每一页
      --username <username> HTTP身份验证用户名
      --viewport-size <>如果您有自定义,则设置视口大小
                                      滚动条或css属性溢出到
                                      模拟窗口大小
      --window-status <windowStatus>等到window.status等于this
                                      渲染页面前的字符串
      --zoom <float>使用此缩放系数(默认值为1)
 
页眉和页脚选项:
      --footer-center <text>居中的页脚文字
      --footer-font-name <name>设置页脚字体名称(默认Arial)
      --footer-font-size <size>设置页脚字体大小(默认为12)
      --footer -html <url>添加一个html页脚
      --footer-left <text>左对齐的页脚文本
      -  footer-line页脚上方的显示行
      --no-footer-line不要在页脚上方显示行
                                      (默认)
      --footer-right <text>右对齐的页脚文本
      --footer-spacing <real>页脚和内容之间的间距,单位为mm
                                      (默认为0)
      --header-center <text>居中的标题文本
      --header-font-name <name>设置标题字体名称(默认Arial)
      --header-font-size <size>设置标题字体大小(默认为12)
      --header-html <url>添加一个html标题
      --header-left <text>左对齐标题文本
      --header-line标题下方的显示行
      --no-header-line不在标题下方显示行
                                      (默认)
      --header-right <text>右对齐标题文本
      --header-spacing <real>标题和内容之间的间距,单位为mm
                                      (默认为0)
      --replace <name> <value>将[name]替换为header和中的值
                                      页脚(可重复)
 
TOC选项:
      --disable-dotted-lines不要在toc中使用虚线
      --toc-header-text <text> toc的标题文本(默认表
                                      内容)
      --toc-level-indentation <width>对于toc中的每个标题级别
                                      按此长度缩进(默认为1em)
      --disable-toc-links不要从toc链接到部分
      --toc-text-size-shrink <real>对于toc中每个级别的标题
                                      字体按此因子缩放(默认值
                                      0.8)
      --xsl-style-sheet <file>使用提供的xsl样式表
                                      打印目录

版权声明:本文为The_dream_is_a_verb原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
THE END
< <上一篇
下一篇>>