轉載:https://blog.csdn.net/qq_34190023/article/details/82999702
html轉換為pdf的關鍵技術是如何處理網頁中復雜的css樣式、以及中文亂碼處理。
各實現對比表
於Windows平台進行測試:
|
|
基於IText |
基於FlyingSaucer |
基於WKHtmlToPdf |
基於pd4ml |
|
| 跨平台性 |
跨平台 |
跨平台 |
跨平台 |
跨平台 |
|
| 是否安裝軟件 |
否 |
否 |
需安裝WKHtmlToPdf |
否 |
|
| 是否收費 |
免費 |
免費 |
免費 |
收費 |
|
| 轉換Html |
效率 |
速度快 |
未測 |
速度慢。相比URL來說,效率較慢。能忽略一些html語法或資源是否存在問題。 |
速度快。部分CSS樣式不支持。 |
| 效果 |
存在樣式失真問題。 對html語法有一定要求 |
存在樣式失真問題。對html語法有較高要求。 |
失真情況較小 大部分網頁能按Chome瀏覽器顯示的頁面轉 |
部分CSS樣式有問題。 |
|
| 轉換URL |
效率 |
未測 |
未測 |
效率不是特別高 |
未測 |
| 效果 |
未測 |
未測 |
部分網頁由於其限制,或將出現html網頁不完整。 |
未測 |
|
| 優點 |
不需安裝軟件、轉換速度快 |
不需安裝軟件、轉換速度快 |
生成PDF質量高 |
不需要安裝軟件、轉換速度快 |
|
| 缺點 |
對html標簽嚴格,少一個結束標簽就會報錯; 服務器需要安裝字體 |
對html標簽嚴格,少一個結束標簽就會報錯; 服務器需要安裝字體
|
需要安裝軟件、時間效率不高 |
對部分CSS樣式不支持。 |
|
| 評價 |
|
|
|
|
|
綜合:使用WKHtmlToPdf效果(樣式)最好。但速度較慢(對於文件來說)。其余均有大大小小的失真問題。
|
|
分頁 |
圖片 |
表格 |
鏈接 |
中文 |
特殊字符 |
整體樣式 |
速度 |
| IText |
支持 |
支持 |
支持 |
支持 |
支持 |
支持 |
失真問題 |
快 |
| FlyingSaucer |
未知 |
未知 |
未知 |
未知 |
未知 |
未知 |
未知 |
快 |
| WKHtmlToPdf |
支持 |
支持 |
支持 |
支持 |
支持 |
支持 |
很好 |
慢 |
| pd4ml |
支持 |
支持 |
支持 |
支持 |
支持 |
支持 |
失真問題 |
快 |
html網頁完整轉換為pdf,所有的方案均有不足。
itext有時並不能滿足需求,不能兼容html的樣式,且從html頁面導出的圖片到pdf中也並不好處理。
Flying Sauser實現html2pdf,糾錯能力差,支持多種中文字體(部分樣式不能識別),且對html的格式也是十分的嚴格,如果用一種模版的話用Flying Sauser技術倒是不錯的選擇,但對於不規則的html導出pdf就並不是那么的適用。
PD4ML實現html2pdf,速度快,糾錯能力強可以過濾不規則的html標記,支持多種中文字體,支持css。
WKHtmlToPdf效果最好,但轉換速度慢。
1. wkhtmltopdf(速度慢、需要安裝軟件)
wkhtmltopdf是一個用webkit網頁渲染引擎開發的用來將html轉成 pdf的工具,可跟多種腳本語言進行集成來轉換文檔,有windows、linux等平台版本。官網地址 http://wkhtmltopdf.org/
技術特點:
Wkhtmltopdf可直接把瀏覽器中瀏覽的網頁轉換成一個pdf,他是一個把html頁面轉換成pdf的軟件(需要安裝在服務器上)。使用時可通過java代碼調用cmd指令完成網頁轉換為pdf的功能。
功能測試:
直接在cmd里輸入測試指令,可查看處理進度。

原理:
使用wkhtmltopdf工具對url或html進行轉換
使用命令:
Wkhtmltopdf https:baidu.com /usr/local/temp/baidu.pdf
安裝
下載地址:https://wkhtmltopdf.org/downloads.html
wkhtmltopdf安裝方法
1.解壓wkhtmltox.tar到某個文件夾$DIR
2.設置環境變量
vim /etc/profile
在最后一行加 export PATH=$DIR/wkhtmltox/bin:$PATH 保存退出、

source /etc/profile
3.運行 wkhtmltopdf 報wkhtmltopdf: error while loading shared libraries: libXrender.so.1: cannot open shared object file: No such file or directory這個錯,請運行 apt-get/yum install libXrender*
運行 wkhtmltopdf 報wkhtmltopdf: error while loading shared libraries: libfontconfig.so.1: cannot open shared object file: No such file or directory這個錯,請運行apt-get/yum install libfontconfig*
運行 wkhtmltopdf 報wkhtmltopdf: error while loading shared libraries: libXext.so.6: cannot open shared object file: No such file or directory這個錯,請運行 apt-get/yum install libXext*
運行 wkhtmltopdf

yum install xorg-x11-fonts-75dpi.noarch
yum install xorg-x11-fonts-Type1.noarch
yum install icu.x86_64
yum install libjpeg
yum install libpng
優點:
支持中文、圖片、CSS等
缺點:
有時對於html文件的轉化可能比較慢,對於url的轉化速度較快。存在失真情況
具體實現:
Java調用命令。
1 public class HtmlToPdf { 2 3 // wkhtmltopdf在系統中的路徑 4 private static String toPdfTool = Consts.WEB.CONVERSION_PLUGSTOOL_PATH_WINDOW; 5 6 /** 7 * html轉pdf 8 * 9 * @param srcPath 10 * html路徑,可以是硬盤上的路徑,也可以是網絡路徑 11 * @param destPath 12 * pdf保存路徑 13 * @return 轉換成功返回true 14 */ 15 public static boolean convert(String srcPath, String destPath) { 16 File file = new File(destPath); 17 File parent = file.getParentFile(); 18 // 如果pdf保存路徑不存在,則創建路徑 19 if (!parent.exists()) { 20 parent.mkdirs(); 21 } 22 StringBuilder cmd = new StringBuilder(); 23 if (System.getProperty("os.name").indexOf("Windows") == -1) { 24 // 非windows 系統 25 toPdfTool = Consts.WEB.CONVERSION_PLUGSTOOL_PATH_LINUX; 26 } 27 cmd.append(toPdfTool); 28 cmd.append(" "); 29 cmd.append(" \""); 30 cmd.append(srcPath); 31 cmd.append("\" "); 32 cmd.append(" "); 33 cmd.append(destPath); 34 35 System.out.println(cmd.toString()); 36 boolean result = true; 37 try { 38 Process proc = Runtime.getRuntime().exec(cmd.toString()); 39 HtmlToPdfInterceptor error = new HtmlToPdfInterceptor(proc.getErrorStream()); 40 HtmlToPdfInterceptor output = new HtmlToPdfInterceptor(proc.getInputStream()); 41 error.start(); 42 output.start(); 43 proc.waitFor(); 44 } catch (Exception e) { 45 result = false; 46 e.printStackTrace(); 47 } 48 49 return result; 50 } 51 52 public static void main(String[] args) { 53 // HtmlToPdf.convert("http://www.baidu.com", "F:/pdf/baidu.pdf"); 54 String filename = "JAVA將圖片轉換成pdf文件-CSDN博客"; 55 HtmlToPdf.convert("F:/pdf/"+filename+".html", "F:/pdf/"+filename+".pdf"); 56 // HtmlToPdf.convert("http://api.gyingyuan.com/", "F:/pdf/"+ UUID.randomUUID().toString()+".pdf"); 57 // HtmlToPdf.convert("https://www.aliyun.com/jiaocheng/285649.html", "F:/pdf/baidu.pdf"); 58 } 59 }
1 public class HtmlToPdfInterceptor extends Thread { 2 private InputStream is; 3 4 public HtmlToPdfInterceptor(InputStream is){ 5 this.is = is; 6 } 7 8 @Override 9 public void run(){ 10 try{ 11 InputStreamReader isr = new InputStreamReader(is, "utf-8"); 12 BufferedReader br = new BufferedReader(isr); 13 String line = null; 14 while ((line = br.readLine()) != null) { 15 System.out.println(line.toString()); //輸出內容 16 } 17 }catch (IOException e){ 18 e.printStackTrace(); 19 } 20 } 21 }
效果:
URL轉換

對於url轉會遇到一些網站限制的問題。
https://blog.csdn.net/m0_38138387/article/details/79314260

如果轉為html則效率較慢,但能很大程度比較完美地轉換
文件轉換:速度較慢,失真情況比較小
68.225s

2. PhantomJS(樣式有問題,需要安裝軟件)
PhantomJS是一個基於webkit內核的無頭瀏覽器,即沒有UI界面,即它是一個瀏覽器,只是其內的點擊、翻頁等人為相關操作需要程序設計實現。它提供javaScript API接口,即通過編寫JS程序可以直接與webkit內核交互,在此之上可以結合java語言等,通過java調用js等相關操作,從而解決了以前c/c++才能比較好的基於webkit開發優質采集器的限制。它同時提供windows、linux、mac等不同os的安裝使用包,也就是說可以在不同平台上二次開發采集項目或是自動項目測試等工作。官網地址http://phantomjs.org/
PhantomJS可做網頁分析,功能很多,本次僅調用網頁的截圖功能。在cmd中的測試如下:


URL轉

測試效果並沒有wkhtmltopdf好。
html2pdf.js
1 var page = require('webpage').create(); 2 var system = require('system'); 3 4 讀取命令行參數,也就是js文件路徑。 5 if (system.args.length === 1) { 6 console.log('Usage: loadspeed.js <some URL>'); 7 //這行代碼很重要。凡是結束必須調用。否則phantomjs不會停止 8 phantom.exit(); 9 } 10 page.settings.loadImages = true; //加載圖片 11 page.settings.resourceTimeout = 30000;//超過10秒放棄加載 12 //截圖設置, 13 //page.viewportSize = { 14 // width: 1000, 15 // height: 3000 16 //}; 17 var address = system.args[1]; 18 page.open(address, function(status) { 19 20 function checkReadyState() {//等待加載完成將頁面生成pdf 21 setTimeout(function () { 22 var readyState = page.evaluate(function () { 23 return document.readyState; 24 }); 25 26 if ("complete" === readyState) { 27 28 page.paperSize = { width:'297mm',height:'500mm',orientation: 'portrait',border: '1cm' }; 29 var timestamp = Date.parse(new Date()); 30 var pdfname = 'HT_'+timestamp + Math.floor(Math.random()*1000000); 31 var outpathstr = "E:/POMFiles/HTPDF/"+pdfname+".pdf"; 32 page.render(outpathstr); 33 //page.render("c://test.png"); 34 //console.log就是傳輸回去的內容。 35 console.log("生成成功"); 36 console.log("$"+outpathstr+"$"); 37 phantom.exit(); 38 39 } else { 40 checkReadyState(); 41 } 42 },1000); 43 } 44 checkReadyState(); 45 });
PhantomJS對bootstap的樣式支持較好。對css3的新特性如圓形圖片樣式支持行不好。部分頁面樣式會失效。對於echart圖表展示,也可直接導出
3. IText(技術老舊,對樣式不支持)
iText是一個第三方報表java插件,可以在后端利用java隨意生成、轉化pdf文件,提供了很多api,比較靈活
IText實現html2pdf,速度快,糾錯能力差,支持中文(要求HTML使用unicode編碼),但中支持一種中文字體,開源。
原理:
使用IText將HTML文件轉化為PDF文件
優點:
速度快,支持中文(要求HTML使用unicode編碼)、開源
缺點:
糾錯能力差,
對CSS樣式支持不是很好。
失真情況可能比較大
具體實現:
<dependency>
<groupId>org.eclipse.birt.runtime.3_7_1</groupId>
<artifactId>com.lowagie.text</artifactId>
<version>2.1.7</version>
</dependency>
<dependency>
<groupId>org.xhtmlrenderer</groupId>
<artifactId>flying-saucer-pdf</artifactId>
<version>9.0.8</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.4.2</version>
</dependency>
Java代碼
1 ITextRenderer renderer = new ITextRenderer(); 2 ITextFontResolver fontResolver = renderer.getFontResolver(); 3 fontResolver.addFont("/Users/hehe/share/Fonts/simsun.ttc", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED); 4 OutputStream os = new FileOutputStream("/Users/hehe/Desktop/iTextPDF.pdf"); 5 String htmlstr = HttpHandler.sendGet("http://localhost:10086/test/iTextPDF.html");//HttpHandler.sendGet只是單純獲得指定網頁的html字符串內容 6 renderer.setDocumentFromString(htmlstr); 7 renderer.layout(); 8 renderer.createPDF(os);
以上只是簡單利用html字符串來生成pdf,需要注意的是:
1、如果頁面中有中文,服務器端需要下載字體庫simsun.ttc,在后台進行引用,同時在頁面的樣式中加入對應字體的定義,如:body{font-family: SimSun;},否則中文無法渲染(中文處渲染出來的效果是空白);
2、頁面中如果有圖片,如果圖片引用是絕對路徑或者base64則不用考慮,如果是相對路徑,需要在后台用renderer.getSharedContext().setBaseURL("圖片絕對路徑目錄");來指定圖片路徑,否則圖片無法渲染。
3、要轉化的頁面必須是標准的XHTML頁面,有一處不符合規范就會報錯,小編再試的時候就經常報諸如org.xml.sax.SAXParseException;lineNumber: 24; columnNumber: 6;元素類型 "span" 必須由匹配的結束標記 "</span> 終止"之類的錯誤,所以如果要用iText來大量爬取網絡中的頁面的話,還是放棄吧,畢竟網上很多頁面都是不標准的~
1 public class HtmlToPdfUtils { 2 /*** 默認中文字體 */ 3 private static final String FONT = "C:\\Windows\\Fonts\\simhei.ttf"; 4 public static void htmlToPdf(String sourcePath,String tagetPath) throws IOException { 5 htmlToPdf(sourcePath,tagetPath,FONT); 6 } 7 public static void htmlToPdf(String sourcePath,String tagetPath,String fontPath) throws IOException { 8 htmlToPdf(sourcePath,tagetPath,fontPath,PageSize.TABLOID); 9 } 10 public static void htmlToPdf(String sourcePath,String tagetPath,String fontPath,PageSize pageSize) throws IOException { 11 // 默認source路徑下裝載有css、image、以及html等文件的文件夾 12 htmlToPdf(sourcePath,tagetPath,fontPath,pageSize,FileUtils.GetFilePath(sourcePath)); 13 } 14 public static void htmlToPdf(String sourcePath,String tagetPath,String fontPath,PageSize pageSize,String baseuri) throws IOException { 15 PdfWriter writer = new PdfWriter(tagetPath); 16 PdfDocument pdf = new PdfDocument(writer); 17 18 pdf.setTagged(); 19 // 設置pdf頁面大小 20 pdf.setDefaultPageSize(pageSize); 21 ConverterProperties properties = new ConverterProperties(); 22 FontProvider fontProvider = new DefaultFontProvider(); 23 // 字體 24 FontProgram fontProgram = FontProgramFactory.createFont(fontPath); 25 fontProvider.addFont(fontProgram); 26 properties.setFontProvider(fontProvider); 27 //properties.setBaseUri(html); 28 properties.setBaseUri(baseuri); 29 MediaDeviceDescription mediaDeviceDescription = new MediaDeviceDescription(MediaType.SCREEN); 30 mediaDeviceDescription.setWidth(pageSize.getWidth()); 31 properties.setMediaDeviceDescription(mediaDeviceDescription); 32 // 轉化 33 convertToPdf(sourcePath,pdf, properties); 34 } 35 36 private static void convertToPdf(String sourcePath,PdfDocument pdf,ConverterProperties properties ) throws IOException { 37 InputStream inputStream = new FileInputStream(sourcePath); 38 // 轉化 39 // HtmlConverter.convertToPdf(new FileInputStream(sourcePath), pdf, properties); 40 HtmlConverter.convertToPdf(inputStream, pdf, properties); 41 inputStream.close(); 42 } 43 public static void main(String[] args) throws IOException { 44 htmlToPdf("F:\\pdf\\1.html","F:\\pdf\\est-04.pdf"); 45 } 46 }
效果:
Converting HTML to PDF _ iText Developers.html
消耗時間:3660
CSS樣式丟失:

JAVA 將圖片轉換成pdf文件 - CSDN博客.html
消耗時間:7609


樣式同樣丟失問題
itext html轉pdf布局問題_百度搜索.html
消耗時間:5485

4. Flying Sauser(技術老舊,對樣式不支持)
Flying Sauser實現html2pdf,糾錯能力差,支持中文、支持簡單的頁面和樣式,開源
對html代碼要求很嚴格。極易出現中文亂碼問題
優點:
支持多種中文字體(部分樣式不能識別),開源
缺點:
糾錯能力差,對CSS支持不是很好。當頁面內容較長時,處理時間慢
具體實現:
1 public class Html2Pdf { 2 /** 3 * HTML代碼轉PDF文檔 4 * 5 * @param content 待轉換的HTML代碼 6 * @param storagePath 保存為PDF文件的路徑 7 */ 8 public static void parsePdf(String content, String storagePath) { 9 FileOutputStream os = null; 10 try { 11 File file = new File(storagePath); 12 if(!file.exists()) { 13 file.createNewFile(); 14 } 15 os = new FileOutputStream(file); 16 17 ITextRenderer renderer = new ITextRenderer(); 18 //解決中文支持問題 19 // ITextFontResolver resolver = renderer.getFontResolver(); 20 // resolver.addFont("simhei.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED); 21 // resolver.addFont("simhei.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED); 22 renderer.setDocumentFromString(content); 23 // 解決圖片的相對路徑問題,圖片路徑必須以file開頭 24 // renderer.getSharedContext().setBaseURL("file:/"); 25 renderer.layout(); 26 renderer.createPDF(os); 27 28 } catch (DocumentException e) { 29 e.printStackTrace(); 30 } catch (IOException e) { 31 e.printStackTrace(); 32 }finally { 33 if(null != os) { 34 try { 35 os.close(); 36 } catch (IOException e) { 37 e.printStackTrace(); 38 } 39 } 40 } 41 } 42 43 /** 44 * 對Html要求特別嚴格 45 * @param args 46 * @throws IOException 47 */ 48 public static void main(String[] args) throws IOException { 49 String htmlFilePath = ""; 50 htmlFilePath = "F:/pdf/IText實現對PDF文檔屬性的基本設置 - 半畝池光 - 博客園.html"; 51 StringBuilder content = new StringBuilder(); 52 BufferedInputStream in; 53 byte[] bys = new byte[1024]; 54 int len; 55 in = new BufferedInputStream(new FileInputStream(htmlFilePath)); 56 while ((len = in.read(bys)) != -1) { 57 content.append(new String(bys, 0, len)); 58 } 59 String html = closeHTML(content.toString()); 60 html = html.replace(" "," "); 61 62 parsePdf(html,"F:/pdf/wahaha.pdf"); 63 64 } 65 66 public static String closeHTML(String str){ 67 List arrTags = new ArrayList(); 68 arrTags.add("br"); 69 arrTags.add("hr"); 70 arrTags.add("link"); 71 arrTags.add("meta"); 72 arrTags.add("img"); 73 arrTags.add("input"); 74 for(int i=0;i<arrTags.size();i++){ 75 for(int j=0;j<str.length();){ 76 int tagStart = str.indexOf("<"+arrTags.get(i),j); 77 if(tagStart>=0){ 78 int tagEnd = str.indexOf(">",tagStart); 79 j = tagEnd; 80 String preCloseTag = str.substring(tagEnd-1,tagEnd); 81 if(!"/".equals(preCloseTag)){ 82 String preStr = str.substring(0,tagEnd); 83 String afterStr = str.substring(tagEnd); 84 str = preStr + "/" + afterStr; 85 } 86 }else{ 87 break; 88 } 89 } 90 } 91 return str; 92 } 93 94 }
5. PD4ML(樣式有問題)
PD4ML是純Java的類庫,使用HTML、CSS作為頁面布局和內容定義格式來生成PDF文檔的強大工具,可以簡化最終用戶生成PDF的工作。參考網站:http://www.pd4ml.com
優點:
支持中文、對html代碼不嚴格、速度較快
支持的HTML標簽、CSS屬性較全,轉換失真比較小,可以使用HTML+CSS實現精確的布局控制。
對網頁文件標簽、CSS語法錯誤的容錯性比較好。
對不用額外的控制,就支持圖片的轉化輸出。
缺點:
存在樣式失真問題,CSS支持較不好。
不開源,最新的demo版本,下載測試以后,發現不支持中文轉換。必須購買商業版本才可以。(這里很坑,測試亂碼問題通不過,后面發現是本來就不支持)。
破解后的一些舊版本可以解決亂碼問題,但是支持的css樣式沒有新版本的全。
具體實現:
1 public class HtmlToPDFUtil { 2 public static void main(String[] args) throws Exception { 3 //HtmlToPDFUtil htmlToPDFUtil = new HtmlToPDFUtil(); 4 HtmlToPDFUtil.generatePDF_2(new File("F:\\pdf/demo_ch_pd4ml.pdf"), 5 "F:\\pdf/flying saucer 使用中的一些問題 (java導出pdf) - 真的勇士,敢於直面這扯淡的人生 - ITeye博客.htm"); 6 7 //File pdfFile = new File("D:/Test/test3.pdf"); 8 // String pdfPath = "D:/Test1/mmt"; 9 // 10 // File file = new File(pdfPath); 11 // if (!file.exists()) { 12 // file.mkdirs(); 13 // } 14 // String pdfName = "aa.pdf"; 15 // File pdfFile = new File(pdfPath+File.separator+pdfName); 16 // StringBuffer html = new StringBuffer(); 17 // html.append("<html>") 18 // .append("<head>") 19 // .append("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />") 20 // .append("</head>").append("<body>") 21 // //.append("<font face='KaiTi_GB2312'>") 22 // .append("<font face='KaiTi'>") 23 // .append("<font color='red' size=22>顯示中文aaaaaaaaaa</font>") 24 // .append("</font>").append("</body></html>"); 25 // StringReader strReader = new StringReader(html.toString()); 26 // HtmlToPDFUtil.generatePDF_1(pdfFile, strReader); 27 28 } 29 30 // 手動構造HTML代碼 31 public static void generatePDF_1(File outputPDFFile, StringReader strReader) 32 throws Exception { 33 FileOutputStream fos = new FileOutputStream(outputPDFFile); 34 PD4ML pd4ml = new PD4ML(); 35 pd4ml.setPageInsets(new Insets(20, 10, 10, 10)); 36 pd4ml.setHtmlWidth(950); 37 pd4ml.setPageSize(pd4ml.changePageOrientation(PD4Constants.A4)); 38 pd4ml.useTTF("java:fonts", true); 39 //pd4ml.setDefaultTTFs("KaiTi_GB2312", "KaiTi_GB2312", "KaiTi_GB2312"); 40 pd4ml.setDefaultTTFs("KaiTi", "KaiTi", "KaiTi"); 41 pd4ml.enableDebugInfo(); 42 pd4ml.render(strReader, fos); 43 } 44 45 // HTML代碼來自於HTML文件 46 public static void generatePDF_2(File outputPDFFile, String inputHTMLFileName) 47 throws Exception { 48 FileOutputStream fos = new FileOutputStream(outputPDFFile); 49 PD4ML pd4ml = new PD4ML(); 50 pd4ml.setPageInsets(new Insets(20, 10, 10, 10)); 51 pd4ml.setHtmlWidth(950); 52 pd4ml.setPageSize(pd4ml.changePageOrientation(PD4Constants.A4)); 53 54 pd4ml.useTTF("java:fonts", true); 55 pd4ml.setDefaultTTFs("KaiTi", "KaiTi", "KaiTi"); 56 pd4ml.enableDebugInfo(); 57 pd4ml.render("file:" + inputHTMLFileName, fos); 58 } 59 60 }

pd4browser和pd4fonts是生成的
-
亂碼解決方案:
-
測試結果:


對CSS有一定的要求
部分Html能支持:

6. Sferyx:(樣式有問題)
官網:https://www.sferyx.com/pdfgenerator/html-to-pdf-java.htm

支持URL、支持文件。支持中文,對html文件幾乎無要求。樣式不佳,中文字體支持不佳。
具體實現
引入Java包:PDFGenerator.jar
代碼:
1 PDFGenerator pdfGenerator=new PDFGenerator(); 2 pdfGenerator.setMarginsForStandardPageFormat (10,10,10,10); 3 // pdfGenerator.setCharset ("utf-8"); 4 pdfGenerator.setCharset("ISO-10646-UCS-2"); 5 // pdfGenerator.generatePDFFromURL ("https://blog.csdn.net/gisboygogogo/article/details/77601308", 6 pdfGenerator.generatePDFFromURL ("F:\\pdf\\1.html", 7 "F:\\pdf/pdfgenerator-test1.pdf", 8 "A4", "Portrait");
樣式問題:

7. jPDFWriter(樣式有問題、對html文件支持不好)
具體實現:
1 // URL url = new URL("https://www.baidu.com/"); 2 // PageFormat pf = new PageFormat(); 3 // PDFDocument pdfDoc = PDFDocument.loadHTML (url, pf, true); 4 // pdfDoc.saveDocument ("F:\\pdf\\output.pdf"); 5 File f1 = new File ("F:\\pdf\\1.html"); 6 PDFDocument pdfDoc = PDFDocument.loadHTML(f1.toURI().toURL(), new PageFormat (), false); 7 pdfDoc.saveDocument ("F:\\pdf\\output.pdf");
效果:
並不是很好,雖然支持中文

其他未知方案。。。。。。。。。。
在線轉換方案:
僅支持URL,但能很好地轉換,效果較好,速度較快。但收費,且為第三方服務,或有信息安全性問題。
如果不考慮html文件安全性的話,可以考慮。
以轉CSDN及百度搜索網頁為測試例。
1. restpack
能很好保持樣式,且支持中文,速度快。價格相比較優惠。

使用實例:
https://www.cnblogs.com/IT-study/p/13738157.html

2. pdfshift
能很好保持樣式,且支持中文,速度快。價格相比較優惠。

測試效果:

實現方法:
1 String encoding = Base64.getEncoder().encodeToString("YOUR_API_KEY:".getBytes()); 2 HttpPost httppost = new HttpPost("https://api.pdfshift.io/v2/convert/"); 3 httppost.setHeader("Authorization", "Basic " + encoding); 4 httppost.setHeader("Content-type", "application/json"); 5 6 HttpEntity postingString = new StringEntity("{\"source\":\"https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&tn=baidu&wd=PhantomJS%20html%E8%BD%ACpdf&oq=PhantomJS&rsv_pq=c942451400041f65&rsv_t=3566cYExdLkZv6pJRhDXeda3WgHs37R3GASuPvnEGrOmBl9Lur2EMGyfdF8&rqlang=cn&rsv_enter=1&rsv_sug3=15&rsv_sug1=4&rsv_sug7=100&rsv_sug2=0&inputT=6104&rsv_sug4=6105\",\"landscape\":false,\"use_print\":false}"); 7 httppost.setEntity(postingString); 8 9 CloseableHttpClient client = HttpClients.createDefault(); 10 try (CloseableHttpResponse response = client.execute(httppost)) { 11 HttpEntity entity = response.getEntity(); 12 // Use the entity 13 }
3.其他(不考慮的方案)
1. pdfmyurl(網站反應慢)
轉化效率極低,速度極其慢
2. pdflayer(不支持中文)
不支持中文。雖然能很好保持樣式。
個人總結:
到現在未知並為找到完美的方案。各種方案都有缺點,但是在線轉換的方案轉化效率以及對CSS等支持程度比較好。也不知道他們這些內部是如何實現的。
參考鏈接:
http://blog.csdn.net/ouyhong123/article/details/26401967
http://blog.csdn.net/tengdazhang770960436/article/details/41320079
http://www.cnblogs.com/jasondan/p/4108263.html
