Java 实现 HTML 转 PDF 文件

目录

一、概述

二、wkhtmltopdf 下载

三、Java 实现 HTML 转 PDF


如果发现本文有错误的地方,请大家毫不吝啬,多多指教,欢迎大家评论,谢谢!

一、概述

       我们在实际开发中会遇到各种不同的需求,接到一个需求把页面报告图表生成 PDF 格式。刚开始我的初步想法是用 IText 生成 PDF,但是 CSS 和 JS 样式,有的不兼容!最后还是基于WKHtmlToPdf 生成 PDF ,解决样式兼容和图表格式。

二、wkhtmltopdf 下载

wkhtmltopdf是一个用webkit网页渲染引擎开发的用来将html转成 pdf的工具,可跟多种脚本语言进行集成来转换文档,有windows、linux等平台版本。官网地址  http://wkhtmltopdf.org/

技术特点

Wkhtmltopdf可直接把浏览器中浏览的网页转换成一个pdf,他是一个把html页面转换成pdf的软件(需要安装在服务器上)。使用时可通过java代码调用cmd指令完成网页转换为pdf的功能。

安装:

点击 wkhtmltox.exe 安装

功能测试:

直接在cmd里输入测试指令,可查看处理进度。

在安装目录 bin 执行如下命令生成 PDF 

wkhtmltopdf.exe https://www.baidu.com/ C:\Users\user.DESKTOP-8A9L631\Desktop\遂人\test\baidu.pdf

三、Java 实现 HTML 转 PDF


@Slf4j(topic = "HtmlToPdfUtil")
public class HtmlToPdfUtil {

    /**
     * wkhtmltopdf在系统中的路径
     */
    private static String toPdfTool = Consts.CONVERSION_PLUGSTOOL_PATH_WINDOW;

    /**
     * html转pdf
     *
     * @param srcPath  html路径,可以是硬盘上的路径,也可以是网络路径
     * @param destPath pdf保存路径
     * @return 转换成功返回true
     */
    public static boolean convert(String srcPath, String destPath) {

        log.info("convert.req srcPath={} ,destPath={}",srcPath,destPath);
        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 = Consts.CONVERSION_PLUGSTOOL_PATH_LINUX;
        }
        cmd.append(toPdfTool);
        cmd.append(" ");
        cmd.append(" \"");
        cmd.append(srcPath);
        cmd.append("\" ");
        cmd.append(" ");
        cmd.append(destPath);

        System.out.println(cmd.toString());
        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) {

        long startTime = System.currentTimeMillis();
        log.info("generate pdf start ... ");
//        HtmlToPdfUtil.convert("http://baijiahao.baidu.com/s?id=1701222360380918660&wfr=spider&for=pc", "D:\\file\\test\\pdf" + StrUtil.SLASH + IdUtil.simpleUUID() + ".pdf");
        HtmlToPdfUtil.convert("https://blog.csdn.net/Hug_rj/article/details/89643290", "D:\\file\\test\\pdf" + StrUtil.SLASH + IdUtil.simpleUUID() + ".pdf");
//        HtmlToPdfUtil.convert("https://www.aliyun.com/jiaocheng/285649.html", "F:/pdf/baidu.pdf");
        log.info("Time-consuming to generate pdf time(ms)={}",System.currentTimeMillis()-startTime);
    }
}

利用线程处理

public class HtmlToPdfInterceptor extends Thread {

    private InputStream is;
 
    protected HtmlToPdfInterceptor(InputStream is){
        this.is = is;
    }
 
    @Override
    public void run(){
        try{
            InputStreamReader isr = new InputStreamReader(is, StandardCharsets.UTF_8);
            BufferedReader br = new BufferedReader(isr);
            String line ;
            while ((line = br.readLine()) != null) {
                System.out.println(line); //输出内容
            }
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}

生成 PDF 

参考链接

1. PDF技术(四)-Java实现Html转PDF文件


如果这篇文章对你有帮助,请一键三连

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值