1. 程式人生 > >JAVA使用wkhtmltopdf 將Html 匯出PDF

JAVA使用wkhtmltopdf 將Html 匯出PDF

1.安裝wkhtmltopdf 

根據自己的系統來選擇對應的安裝包

2.下載之後安裝,然後將其配置到環境變數中

3.做個小測試

命令:wkhtmltopdf 需要轉化為pdf的html地址  匯出位置

4.下面附上JAVA程式碼

主要工具類:

public class HtmlToPdf {
	// wkhtmltopdf在系統中的路徑
	private static final String toPdfTool = "D:\\developTool\\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();
		if (System.getProperty("os.name").indexOf("Windows") == -1) {
			// 非windows 系統
			//toPdfTool = FileUtil.convertSystemFilePath("/home/ubuntu/wkhtmltox/bin/wkhtmltopdf");
		}
		cmd.append(toPdfTool);
		cmd.append(" ");
		cmd.append("  --header-line");// 頁首下面的線
		cmd.append(" --header-center 這裡是頁首這裡是頁首這裡是頁首這裡是頁首 ");//頁首中間內容
		cmd.append("  --margin-top 3cm ");// 設定頁面上邊距 (default 10mm)
		//cmd.append(" --header-html  file:///" + "https://blog.csdn.net/x6582026/article/details/53835835");// (新增一個HTML頁首,後面是網址)
		cmd.append(" --header-spacing 5 ");// (設定頁首和內容的距離,預設0)
        cmd.append(" --footer-center 第[page]頁/共[topage]頁");//設定在中心位置的頁尾內容
		//cmd.append(" --footer-html  file:///" + "https://blog.csdn.net/x6582026/article/details/53835835");// (新增一個HTML頁尾,後面是網址)
		cmd.append(" --footer-line");// * 顯示一條線在頁尾內容上)
		cmd.append(" --footer-spacing 5 ");// (設定頁尾和內容的距離)
		cmd.append(srcPath);
		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) {
		HtmlToPdf.convert("http://www.baidu.html", "E:/baidu.pdf");
	}
}

輔助程式碼

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

5. wkhtmltopdf 一些命令

/**
 * Input表單或JavaScript指令碼支援:--enable-forms,下面這些是網友整理的引數說明
 * wkhtmltopdf [OPTIONS]... <input file> [More input files] <output file>
 * 常規選項
 * --allow <path>                  允許載入從指定的資料夾中的檔案或檔案(可重複)
 * --book*                         設定一會列印一本書的時候,通常設定的選項
 * --collate                       列印多份副本時整理
 * --cookie <name> <value>         設定一個額外的cookie(可重複)
 * --cookie-jar <path>             讀取和寫入的Cookie,並在提供的cookie jar檔案
 * --copies <number>               影印列印成pdf檔案數(預設為1)
 * --cover* <url>                  使用HTML檔案作為封面。它會帶頁首和頁尾的TOC之前插入
 * --custom-header <name> <value>  設定一個附加的HTTP頭(可重複)
 * --debug-javascript              顯示的javascript除錯輸出
 * --default-header*               新增一個預設的頭部,與頁面的左邊的名稱,頁面數到右邊,例如: --header-left '[webpage]' --header-right '[page]/[toPage]'  --header-line
 * --disable-external-links*       禁止生成連結到遠端網頁
 * --disable-internal-links*       禁止使用本地連結
 * --disable-javascript            禁止讓網頁執行JavaScript
 * --disable-pdf-compression*      禁止在PDF物件使用無失真壓縮
 * --disable-smart-shrinking*      禁止使用WebKit的智慧戰略收縮,使畫素/ DPI比沒有不變
 * --disallow-local-file-access    禁止允許轉換的本地檔案讀取其他本地檔案,除非explecitily允許用 --allow
 * --dpi <dpi>                     顯式更改DPI(這對基於X11的系統沒有任何影響)
 * --enable-plugins                啟用已安裝的外掛(如Flash
 * --encoding <encoding>           設定預設的文字編碼
 * --extended-help                 顯示更廣泛的幫助,詳細介紹了不常見的命令開關
 * --forms*                        開啟HTML表單欄位轉換為PDF表單域
 * --grayscale                     PDF格式將在灰階產生
 * --help                          Display help
 * --htmldoc                       輸出程式HTML幫助
 * --ignore-load-errors            忽略claimes載入過程中已經遇到了一個錯誤頁面
 * --lowquality                    產生低品質的PDF/ PS。有用縮小結果文件的空間
 * --manpage                       輸出程式手冊頁
 * --margin-bottom <unitreal>      設定頁面下邊距 (default 10mm)
 * --margin-left <unitreal>        將左邊頁邊距 (default 10mm)
 * --margin-right <unitreal>       設定頁面右邊距 (default 10mm)
 * --margin-top <unitreal>         設定頁面上邊距 (default 10mm)
 * --minimum-font-size             <)
 * --no-background                 不列印背景
 * --orientation <orientation>     設定方向為橫向或縱向
 * --page-height <unitreal>        頁面高度 (default unit millimeter)
 * --page-offset* <offset>         設定起始頁碼 (default )
 * --page-size <size>              設定紙張大小: 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*             使用的列印介質型別,而不是螢幕
 * --proxy <proxy>                 使用代理
 * --quiet                         Be less verbose
 * --read-args-from-stdin          讀取標準輸入的命令列引數
 * --readme                        輸出程式自述
 * --redirect-delay <msec>         等待幾毫秒為JS-重定向(default )
 * --replace* <name> <value>       替換名稱,值的頁首和頁尾(可重複)
 * --stop-slow-scripts             停止執行緩慢的JavaScripts
 * --title <text>                  生成的PDF檔案的標題(第一個文件的標題使用,如果沒有指定)
 * --toc*                          插入的內容的表中的檔案的開頭
 * --use-xserver*                  使用X伺服器(一些外掛和其他的東西沒有X11可能無法正常工作)
 * --user-style-sheet <url>        指定使用者的樣式表,載入在每一頁中
 * --username <username>           HTTP認證的使用者名稱
 * --version                       輸出版本資訊退出
 * --zoom                          <)
 *
 * 頁首和頁尾選項
 * --header-center*    <text>  (設定在中心位置的頁首內容)
 * --header-font-name* <name>  (default Arial)(設定頁首的字型名稱)
 * --header-font-size* <size>  (設定頁首的字型大小)
 * --header-html*      <url>   (新增一個HTML頁首,後面是網址)
 * --header-left*      <text>  (左對齊的頁首文字)
 * --header-line*              (顯示一條線在頁首下)
 * --header-right*     <text>  (右對齊頁首文字)
 * --header-spacing*   <real>  (設定頁首和內容的距離,預設0)
 * --footer-center*    <text>  (設定在中心位置的頁尾內容)
 * --footer-font-name* <name>  (設定頁尾的字型名稱)
 * --footer-font-size* <size>  (設定頁尾的字型大小default )
 * --footer-html*      <url>   (新增一個HTML頁尾,後面是網址)
 * --footer-left*      <text>  (左對齊的頁尾文字)
 * --footer-line*              顯示一條線在頁尾內容上)
 * --footer-right*     <text>  (右對齊頁尾文字)
 * --footer-spacing*   <real>  (設定頁尾和內容的距離)
 *
 * 頁尾和頁首
 * [page]       由當前正在列印的頁的數目代替
 * [frompage]   由要列印的第一頁的數量取代
 * [topage]     由最後一頁要列印的數量取代
 * [webpage]    通過正在列印的頁面的URL替換
 * [section]    由當前節的名稱替換
 * [subsection] 由當前小節的名稱替換
 * [date]       由當前日期系統的本地格式取代
 * [time]       由當前時間,系統的本地格式取代
 *
 * 輪廓選項
 * --dump-outline  <file>  轉儲目錄到一個檔案
 * --outline               顯示目錄(文章中h1,h2來定)
 * --outline-depth <level> 設定目錄的深度(預設為4)
 *
 * 表內容選項中
 *  --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
 * ------------------------------------------------------------------------------------------------------------
 */