java调用wkhtmltopdf生成pdf文件

大家好,我是傻明蚕豆,在我上一篇文章[HTML转PDF]中,写到了用itextpdf把html转为pdf文件,但itextpdf存在很多缺点,对多种样式不支持,所以这次使用wkhtmltopdf工具,可以90%还原html,我觉得大家应该都会喜欢。(https://www.jianshu.com/p/2819fa1e8d72)

wkhtmltopdf

wkhtmltopdf是什么东东?各位还是自行百度吧,或者可以看官网哦。
在这里插入图片描述
在这里插入图片描述
在这里选择合适的下载,我下载了win和centos的,
在这里插入图片描述
双击wkhtmltox.exe安装,安装完后进入bin目录,如下所示:
在这里插入图片描述
在该目录下cmd,运行命令:

wkhtmltopdf.exe https://wkhtmltopdf.org C:/wkhtmltopdf.pdf

上面的命令就是把wkhtmltopdf首页生成wkhtmltopdf.pdf文件,保存在C盘。

如果是centos系统,那就安装wkhtmltox-0.12.6-1.centos7.x86_64.rpm。
安装命令:

rpm -ivh wkhtmltox-0.12.6-1.centos7.x86_64.rpm

查看安装路径:

rpm -ql wkhtmltox-0.12.6-1.centos7.x86_64

我这里找到路劲是:/usr/local/bin/wkhtmltopdf
cd到该路径下,把简书首页生成pdf命令:

wkhtmltopdf https://www.jianshu.com /home/test/jianshu.pdf

使用方法和win系统一样,wkhtmltopdf就介绍到这里,下面是使用java调用wkhtmltopdf。

java调用wkhtmltopdf

首先创建一个springboot项目,然后创建一个html页面,运行项目,访问url能看到页面,下面是我的html页面:
在这里插入图片描述
java调用wkhtmltopdf不需要maven依赖,下面直接上代码。

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;
    }

    @Override
    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();
        }
    }

}
import java.io.File;

/**
 * 使用wkhtmltopdf工具把html转为pdf
 */
public class HtmlToPdfUtil {

    //wkhtmltopdf在系统中的路径
    private static final String toPdfTool = "C:\\Program Files\\wkhtmltopdf\\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(" ");
        //centos系统下,拼接html页面不需要用双引号
        //正确: /usr/local/bin/wkhtmltopdf 192.168.1.1:8080/test /test/test.pdf
        //错误: /usr/local/bin/wkhtmltopdf "192.168.1.1:8080/test" /test/test.pdf
        //cmd.append(" \"");
        cmd.append(srcPath);
        //cmd.append("\" ");
        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;
    }
    
    public static void main(String[] args) {
        HtmlToPdfUtil.convert("http://localhost:18888/wechat/index", "H:/wechat.pdf");
    }

}

直接运行main方法即可生成pdf,如果是centos系统,直接修改toPdfTool 变量即可,下面是生成的pdf,还原度相当高哦。
在这里插入图片描述
哈哈,就是这么简单,大家都学会了吗?
谢谢观看!


版权声明:本文为weixin_44668634原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。