天天看點

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 安裝

Java 實作 HTML 轉 PDF 檔案

功能測試:

直接在cmd裡輸入測試指令,可檢視處理進度。

在安裝目錄 bin 執行如下指令生成 PDF 

wkhtmltopdf.exe https://www.baidu.com/ C:\Users\user.DESKTOP-8A9L631\Desktop\遂人\test\baidu.pdf
           
Java 實作 HTML 轉 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 

Java 實作 HTML 轉 PDF 檔案

參考連結

1. PDF技術(四)-Java實作Html轉PDF檔案

如果這篇文章對你有幫助,請一鍵三連