項目需將 HTML 內容歸檔為 PDF 或圖片。初期採用 Flying Saucer(iText 渲染),雖解決中文與圖片路徑問題,但 CSS3 支持極弱(如無法渲染斜線)。嘗試 CSSBOX 生成圖片,同樣不支持 CSS3 進階特性。最終選擇 wkhtmltox(含 wkhtmltopdf、wkhtmltoimage),基於 WebKit 內核,對 HTML5/CSS3 支持優異,通過命令行調用,雖需安裝本地程序但效果最佳。
下載 wkhtmltox-0.12.2_msvc2013-win64.exe(32 位選對應版本),雙擊安裝。安裝目錄下將包含 wkhtmltopdf.exe、wkhtmltoimage.exe 兩個可執行文件,供後續調用。
wget https://download.gna.org/wkhtmltopdf/0.12/0.12.2/wkhtmltox-0.12.2_linux-centos6-i386.rpmrz -be 上傳(大文件需 -be 參數,無 rz 先 yum -y install lrzsz)rpm -ivh wkhtmltox-0.12.2_linux-centos6-i386.rpmxorg-x11-fonts-Type1、xorg-x11-fonts-75dpi 依賴yum -y install xorg-x11-fonts-Type1yum -y install xorg-x11-fonts-75dpiwkhtmltoimage https://www.baidu.com 1.jpg 或 wkhtmltopdf https://www.baidu.com 1.pdf 生成文件即安裝成功。
無需額外 Jar 包,直接通用 Runtime.exec() 調用命令行:
public class CustomWKHtmlToPdfUtil {
public String getCommand(String sourceFilePath, String targetFilePath) {
String os = System.getProperty("os.name");
if (os.contains("Windows")) {
return "D:\\Program Files\\wkhtmltopdf\\wkhtmltoimage.exe " + sourceFilePath + " " + targetFilePath;
} else if (os.contains("Linux")) {
return "wkhtmltoimage " + sourceFilePath + " " + targetFilePath;
}
return "";
}
public static void main(String[] args) throws Exception {
CustomWKHtmlToPdfUtil util = new CustomWKHtmlToPdfUtil();
String cmd = util.getCommand("e:/html/result.html", "e:/html/result.jpg");
Process process = Runtime.getRuntime().exec(cmd);
process.waitFor(); // 關鍵:等待命令執行完成
System.out.println("執行完成");
}
}
process.waitFor() 必須調用,否則主線程繼續執行導致輸出文件不全或為空。wkhtmltoimage),PDF 生成偶發排版異常;file:// 協議,避免相對路徑解析失敗;wkhtmltox 憑藉 WebKit 內核完美支持現代 HTML/CSS,是 Java 端 HTML 轉 PDF/圖片的最佳選擇。跨平台部署只需處理好依賴與路徑差異,調用方式簡單直接,生產環境穩定可靠。