目錄
一、概述
二、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 安裝
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2cs0TPn5UMRpXT5VkeaVHbHNGc4dFZ2B3MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL5UDNwAzMxATMxAjNwEjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
功能測試:
直接在cmd裡輸入測試指令,可檢視處理進度。
在安裝目錄 bin 執行如下指令生成 PDF
wkhtmltopdf.exe https://www.baidu.com/ C:\Users\user.DESKTOP-8A9L631\Desktop\遂人\test\baidu.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
參考連結
1. PDF技術(四)-Java實作Html轉PDF檔案
如果這篇文章對你有幫助,請一鍵三連