溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

java中怎么利用wkhtmltopdf將HTML轉(zhuǎn)換為PDF

發(fā)布時間:2021-07-01 14:49:45 來源:億速云 閱讀:246 作者:Leah 欄目:大數(shù)據(jù)

本篇文章為大家展示了java中怎么利用wkhtmltopdf將HTML轉(zhuǎn)換為PDF ,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

第一步 下載安裝

java中怎么利用wkhtmltopdf將HTML轉(zhuǎn)換為PDF

根據(jù)自己的系統(tǒng)來選擇安裝包。

第二步 配置環(huán)境變量

java中怎么利用wkhtmltopdf將HTML轉(zhuǎn)換為PDF

安裝完成之后找到安裝路徑,將其配置到環(huán)境變量中,方便使用。

配置完成環(huán)境變量之后就可以測試一下了。

java中怎么利用wkhtmltopdf將HTML轉(zhuǎn)換為PDF

看看轉(zhuǎn)換效果。

java中怎么利用wkhtmltopdf將HTML轉(zhuǎn)換為PDF

可以看到轉(zhuǎn)換效果是非常不錯的。

第三步 代碼調(diào)用wkhtmltopdf進行轉(zhuǎn)換

輔助代碼

package fangrong.com.cn.common.utils;

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

    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()); //輸出轉(zhuǎn)換進度等內(nèi)容
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

轉(zhuǎn)換代碼

package fangrong.com.cn.common.utils;


import java.io.File;

/**
 * Input表單或JavaScript腳本支持:--enable-forms,下面這些是網(wǎng)友整理的參數(shù)說明
 * wkhtmltopdf [OPTIONS]... <input file> [More input files] <output file>
 * 常規(guī)選項
 * --allow <path>                  允許加載從指定的文件夾中的文件或文件(可重復(fù))
 * --book*                         設(shè)置一會打印一本書的時候,通常設(shè)置的選項
 * --collate                       打印多份副本時整理
 * --cookie <name> <value>         設(shè)置一個額外的cookie(可重復(fù))
 * --cookie-jar <path>             讀取和寫入的Cookie,并在提供的cookie jar文件
 * --copies <number>               復(fù)印打印成pdf文件數(shù)(默認為1)
 * --cover* <url>                  使用HTML文件作為封面。它會帶頁眉和頁腳的TOC之前插入
 * --custom-header <name> <value>  設(shè)置一個附加的HTTP頭(可重復(fù))
 * --debug-javascript              顯示的javascript調(diào)試輸出
 * --default-header*               添加一個缺省的頭部,與頁面的左邊的名稱,頁面數(shù)到右邊,例如: --header-left '[webpage]' --header-right '[page]/[toPage]'  --header-line
 * --disable-external-links*       禁止生成鏈接到遠程網(wǎng)頁
 * --disable-internal-links*       禁止使用本地鏈接
 * --disable-javascript            禁止讓網(wǎng)頁執(zhí)行JavaScript
 * --disable-pdf-compression*      禁止在PDF對象使用無損壓縮
 * --disable-smart-shrinking*      禁止使用WebKit的智能戰(zhàn)略收縮,使像素/ DPI比沒有不變
 * --disallow-local-file-access    禁止允許轉(zhuǎn)換的本地文件讀取其他本地文件,除非explecitily允許用 --allow
 * --dpi <dpi>                     顯式更改DPI(這對基于X11的系統(tǒng)沒有任何影響)
 * --enable-plugins                啟用已安裝的插件(如Flash
 * --encoding <encoding>           設(shè)置默認的文字編碼
 * --extended-help                 顯示更廣泛的幫助,詳細介紹了不常見的命令開關(guān)
 * --forms*                        打開HTML表單字段轉(zhuǎn)換為PDF表單域
 * --grayscale                     PDF格式將在灰階產(chǎn)生
 * --help                          Display help
 * --htmldoc                       輸出程序HTML幫助
 * --ignore-load-errors            忽略claimes加載過程中已經(jīng)遇到了一個錯誤頁面
 * --lowquality                    產(chǎn)生低品質(zhì)的PDF/ PS。有用縮小結(jié)果文檔的空間
 * --manpage                       輸出程序手冊頁
 * --margin-bottom <unitreal>      設(shè)置頁面下邊距 (default 10mm)
 * --margin-left <unitreal>        將左邊頁邊距 (default 10mm)
 * --margin-right <unitreal>       設(shè)置頁面右邊距 (default 10mm)
 * --margin-top <unitreal>         設(shè)置頁面上邊距 (default 10mm)
 * --minimum-font-size             <)
 * --no-background                 不打印背景
 * --orientation <orientation>     設(shè)置方向為橫向或縱向
 * --page-height <unitreal>        頁面高度 (default unit millimeter)
 * --page-offset* <offset>         設(shè)置起始頁碼 (default )
 * --page-size <size>              設(shè)置紙張大小: A4, Letter, etc.
 * --page-width <unitreal>         頁面寬度 (default unit millimeter)
 * --password <password>           HTTP驗證密碼
 * --post <name> <value>           Add an additional post field (repeatable)
 * --post-file <name> <path>       Post an aditional file (repeatable)
 * --print-media-type*             使用的打印介質(zhì)類型,而不是屏幕
 * --proxy <proxy>                 使用代理
 * --quiet                         Be less verbose
 * --read-args-from-stdin          讀取標(biāo)準(zhǔn)輸入的命令行參數(shù)
 * --readme                        輸出程序自述
 * --redirect-delay <msec>         等待幾毫秒為JS-重定向(default )
 * --replace* <name> <value>       替換名稱,值的頁眉和頁腳(可重復(fù))
 * --stop-slow-scripts             停止運行緩慢的JavaScripts
 * --title <text>                  生成的PDF文件的標(biāo)題(第一個文檔的標(biāo)題使用,如果沒有指定)
 * --toc*                          插入的內(nèi)容的表中的文件的開頭
 * --use-xserver*                  使用X服務(wù)器(一些插件和其他的東西沒有X11可能無法正常工作)
 * --user-style-sheet <url>        指定用戶的樣式表,加載在每一頁中
 * --username <username>           HTTP認證的用戶名
 * --version                       輸出版本信息退出
 * --zoom                          <)
 * <p>
 * 頁眉和頁腳選項
 * --header-center*    <text>  (設(shè)置在中心位置的頁眉內(nèi)容)
 * --header-font-name* <name>  (default Arial)(設(shè)置頁眉的字體名稱)
 * --header-font-size* <size>  (設(shè)置頁眉的字體大小)
 * --header-html*      <url>   (添加一個HTML頁眉,后面是網(wǎng)址)
 * --header-left*      <text>  (左對齊的頁眉文本)
 * --header-line*              (顯示一條線在頁眉下)
 * --header-right*     <text>  (右對齊頁眉文本)
 * --header-spacing*   <real>  (設(shè)置頁眉和內(nèi)容的距離,默認0)
 * --footer-center*    <text>  (設(shè)置在中心位置的頁腳內(nèi)容)
 * --footer-font-name* <name>  (設(shè)置頁腳的字體名稱)
 * --footer-font-size* <size>  (設(shè)置頁腳的字體大小default )
 * --footer-html*      <url>   (添加一個HTML頁腳,后面是網(wǎng)址)
 * --footer-left*      <text>  (左對齊的頁腳文本)
 * --footer-line*              顯示一條線在頁腳內(nèi)容上)
 * --footer-right*     <text>  (右對齊頁腳文本)
 * --footer-spacing*   <real>  (設(shè)置頁腳和內(nèi)容的距離)
 * <p>
 * 頁腳和頁眉
 * [page]       由當(dāng)前正在打印的頁的數(shù)目代替
 * [frompage]   由要打印的第一頁的數(shù)量取代
 * [topage]     由最后一頁要打印的數(shù)量取代
 * [webpage]    通過正在打印的頁面的URL替換
 * [section]    由當(dāng)前節(jié)的名稱替換
 * [subsection] 由當(dāng)前小節(jié)的名稱替換
 * [date]       由當(dāng)前日期系統(tǒng)的本地格式取代
 * [time]       由當(dāng)前時間,系統(tǒng)的本地格式取代
 * <p>
 * 輪廓選項
 * --dump-outline  <file>  轉(zhuǎn)儲目錄到一個文件
 * --outline               顯示目錄(文章中h2,h3來定)
 * --outline-depth <level> 設(shè)置目錄的深度(默認為4)
 * <p>
 * 表內(nèi)容選項中
 * --toc-depth*              <level>  Set the depth of the toc (default)
 * --toc-disable-back-links*          Do not link from section header to toc
 * --toc-disable-links*               Do not link from toc to sections
 * --toc-font-name*          <name>   Set the font used for the toc (default Arial)
 * --toc-header-font-name*   <name>   The font of the toc header (if unset use --toc-font-name)
 * --toc-header-font-size*   <size>   The font size of the toc header (default)
 * --toc-header-text*        <text>   The header text of the toc (default Table Of Contents)
 * --toc-l1-font-size*       <size>   Set the font size on level of the toc (default)
 * --toc-l1-indentation*     <num>    Set indentation on level of the toc (default)
 * --toc-l2-font-size*       <size>   Set the font size on level of the toc (default)
 * --toc-l2-indentation*     <num>    Set indentation on level of the toc (default)
 * --toc-l3-font-size*       <size>   Set the font size on level of the toc (default)
 * --toc-l3-indentation*     <num>    Set indentation on level of the toc (default)
 * --toc-l4-font-size*       <size>   Set the font size on level of the toc (default)
 * --toc-l4-indentation*     <num>    Set indentation on level of the toc (default)
 * --toc-l5-font-size*       <size>   Set the font size on level of the toc (default)
 * --toc-l5-indentation*     <num>    Set indentation on level of the toc (default)
 * --toc-l6-font-size*       <size>   Set the font size on level of the toc (default)
 * --toc-l6-indentation*     <num>    Set indentation on level of the toc (default)
 * --toc-l7-font-size*       <size>   Set the font size on level of the toc (default)
 * --toc-l7-indentation*     <num>    Set indentation on level of the toc (default)
 * --toc-no-dots*                     Do not use dots, in the toc
 * ------------------------------------------------------------------------------------------------------------
 */
public class HtmlToPdf {

    /**
     * html轉(zhuǎn)pdf
     *
     * @param srcPath  html路徑,可以是硬盤上的路徑,也可以是網(wǎng)絡(luò)路徑
     * @param file pdf文件
     * @return 轉(zhuǎn)換成功返回true
     */
    public static boolean convert(String srcPath, File file) {

        File parent = file.getParentFile();
        // 如果pdf保存路徑不存在,則創(chuàng)建路徑
        if (!parent.exists()) {
            parent.mkdirs();
        }
        StringBuilder cmd = new StringBuilder();
        String toPdfTool;
        if (System.getProperty("os.name").indexOf("Windows") == -1) { // 根據(jù)系統(tǒng)
            // 非windows 系統(tǒng)
            toPdfTool = "/usr/local/bin/wkhtmltopdf";
        } else {
            toPdfTool = "D:/htmlTopdf/wkhtmltopdf/bin/wkhtmltopdf.exe";
        }
	// 這里可以拼接頁眉頁腳等參數(shù) 參數(shù)詳情在上方
        cmd.append(toPdfTool);
        cmd.append(" ");
        cmd.append(srcPath);
        cmd.append(" ");
        cmd.append(file.getAbsolutePath());

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

到此集成完成。

使用過程中碰到的的一些坑

這些坑主要是出現(xiàn)在Linux環(huán)境下的

  • 亂碼問題

一般亂碼的主要原因就是因為Linux中沒有simsun的字體,將C:\Windows\Fonts中的simsun.ttc拷貝到linux服務(wù)器/usr/share/fonts/目錄下,下次再生成pdf就正常了

  • Docker容器中的java程序無法調(diào)用到Linux本地的wkhtmltopdf腳本

需要將本地的文件掛載映射到dockers容器當(dāng)中

上述內(nèi)容就是java中怎么利用wkhtmltopdf將HTML轉(zhuǎn)換為PDF ,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI