傳統 iText 需手寫模板,面對數百張表單導出極不靈活。wkhtmltopdf 基於 WebKit 渲染引擎,可直接將生成的 HTML 頁面高保真轉為 PDF,支援複雜 CSS/JS,是動態報表導出的理想選擇。
命令行調用:
wkhtmltopdf.exe https://www.cnblogs.com c:\cnblogs.pdf
Java 中通過 Runtime.getRuntime().exec() 執行命令實現轉換。
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;
while ((line = br.readLine()) != null) {
System.out.println(line); // 或寫入日誌
}
} catch (IOException e) { e.printStackTrace(); }
}
}
public class HtmlToPdf {
private static final String TO_PDF_TOOL = "D:\\wkhtmltopdf\\bin\\wkhtmltopdf.exe";
public static boolean convert(String srcPath, String destPath) {
File file = new File(destPath);
File parent = file.getParentFile();
if (!parent.exists()) parent.mkdirs();
StringBuilder cmd = new StringBuilder();
cmd.append(TO_PDF_TOOL).append(" ");
cmd.append("--header-line "); // 頁眉分隔線
cmd.append("--header-center \"頁眉內容\" "); // 頁眉居中
cmd.append("--header-spacing 10 "); // 頁眉與內容間距
// cmd.append("--margin-top 30mm "); // 可選:上邊距
cmd.append(srcPath).append(" ").append(destPath);
try {
Process proc = Runtime.getRuntime().exec(cmd.toString());
new HtmlToPdfInterceptor(proc.getErrorStream()).start();
new HtmlToPdfInterceptor(proc.getInputStream()).start();
proc.waitFor();
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
public static void main(String[] args) {
convert("https://www.cnblogs.com/xionggeclub/p/6144241.html", "d:/wkhtmltopdf.pdf");
}
}
| 分類 | 參數 | 說明 |
|---|---|---|
| 頁面設置 | --page-size | 紙張大小:A4, Letter 等 |
--orientation | 方向:Portrait/Landscape | |
--margin-top/bottom/left/right | 邊距(默認 10mm) | |
--dpi | 顯式 DPI 設置 | |
--zoom | 縮放因子(默認 1) | |
--page-width/height | 自定義頁面尺寸 | |
--page-offset | 起始頁碼(默認 1) | |
| 頁眉頁腳 | --header-center/left/right | 頁眉內容(支援變量) |
--header-line | 頁眉下分隔線 | |
--header-spacing | 頁眉與正文間距 | |
--footer-center/left/right | 頁腳內容 | |
--footer-line | 頁腳上分隔線 | |
--footer-spacing | 頁腳與正文間距 | |
| 目錄(TOC) | --toc | 生成目錄 |
--toc-depth | 目錄深度(默認 3) | |
--toc-header-text | 目錄標題 | |
--toc-l1-font-size | 一級標題字體大小 | |
| 其他常用 | --disable-javascript | 禁用 JS 執行 |
--enable-plugins | 啟用插件 | |
--encoding | 默認文本編碼 |
[page] 當前頁碼[topage] 總頁數[section] 當前章節標題[date]/[time] 日期/時間[webpage] 頁面 URLProcessBuilder 替代 Runtime.exec(),更靈活控制環境變量、工作目錄proc.waitFor(timeout, TimeUnit) 防止掛死libxrender、fontconfig 等)wkhtmltopdf-java、pdfcrowd)減少維護成本