pdf:
“
目前開源、成熟、穩定的第三方包只有iText。而用iText生成PDF有三種方式:
- 調用iText API,用代碼“寫”出PDF,依賴包:com.itextpdf:itextpdf:5.5.11
- 結合XmlWorker,從HTML模板生成PDF,依賴包:com.itextpdf.tool:xmlworker:5.5.11
- 結合Flying Saucer,從HTML模板生成PDF,依賴包:org.xhtmlrenderer:flying-saucer-pdf-itext5:9.1.6
”
這一段是復制別人的,我使用的是第二種方法,直接html轉pdf,這種方式只要用對了就特別方便,如果用代碼寫出pdf,那得上千行java代碼了,非常麻煩
開始配置:
網上查找了很久,發現下面這個鏈接幫我避免了很多坑,這些依賴組合好就能正常使用了
http://www.zhimengzhe.com/HTMLjiaocheng/259505.html
所需依賴:
注意:一定要按此版本號引入,不然會出現很多錯誤,包括“中文亂碼、中文不輸出或直接報錯”等異常!
<dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version>5.4.3</version> </dependency> <dependency> <groupId>com.itextpdf</groupId> <artifactId>itext-asian</artifactId> <version>5.2.0</version> </dependency> <dependency> <groupId>com.itextpdf.tool</groupId> <artifactId>xmlworker</artifactId> <version>5.4.1</version> </dependency> <dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> <version>1.10.1</version> </dependency>
依賴好了之后,又搜了很久,找到了支持中文的解決方案:
最簡單 iText 的 PDF 生成方案(含中文解決方案)HTML 轉為 PDF (下面的這個方法的總結參考自此鏈接)
要點:
所有的單標簽必須閉合(所有單標簽必須全部閉合,否則只要有一個沒閉合,都會報錯 RuntimeWorkerException,
例如: com.itextpdf.tool.xml.exceptions.RuntimeWorkerException: Invalid nested tag head found, expected closing tag meta. 注:這里的報錯不會給出源文件中出錯位置的行數,但是它會給出報錯的標簽,這里給出的是meta沒有正確被關閉,事實上,這里給出的報錯已經很詳細了,在head里找到了無效嵌套,預期的結束了meta標簽,也就是說meta沒閉合,如果是成對標簽少了閉合標簽也會拋出異常,或者單標簽未閉合,也會拋出異常,所以其實還是比較好找的,但是寫的時候一開始就得注意好標簽的閉合問題)
另一個要點:如果在文本或者非標簽的地方使用了 < > 這樣的特殊字符,必須寫成實體字符,否則程序在轉pdf的時候會當成正常標簽處理,導致異常關閉標簽,就報錯了
,成對標簽正常寫即可,支持一些基本的html、css,不支持外部link script,不支持js,body以外必須全部按照下面的格式來寫,body以內的,注意每個span都必須配上字體的樣式,否則不能顯示pdf中文文本
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> </head> <body screen_capture_injected="true" ryt11773="1"> <p> <span style="font-size:12.0pt; font-family:MS Mincho">長空</span> <span style="font-size:12.0pt; font-family:Times New Roman,serif">(Broken Sword),</span> <span style="font-size:12.0pt; font-family:MS Mincho">秦王殘劍</span> <span style="font-size:12.0pt; font-family:Times New Roman,serif">(Flying Snow),</span> <span style="font-size:12.0pt; font-family:MS Mincho">飛雪</span> <span style="font-size:12.0pt; font-family:Times New Roman,serif">(Moon), </span> <span style="font-size:12.0pt; font-family:MS Mincho">如月</span> <span style="font-size:12.0pt; font-family:Times New Roman,serif">(the King), and</span> <span style="font-size:12.0pt; font-family:MS Mincho">秦王</span> <span style="font-size:12.0pt; font-family:Times New Roman,serif">(Sky).</span> </p> </body> </html>
再使用java轉換代碼進行轉換即可:
package com.zhouqian.itext; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.nio.charset.Charset; import com.itextpdf.text.Document; import com.itextpdf.text.DocumentException; import com.itextpdf.text.pdf.PdfWriter; import com.itextpdf.tool.xml.XMLWorkerHelper; public class D07_ParseHtmlAsian { public static final String HTML = "E:/Dropbox/document/java/designPattern/data/hero.html"; public static final String DEST = "E:/Dropbox/document/java/designPattern/data/hero.pdf"; /** * Creates a PDF with the words "Hello World" * @param file * @throws IOException * @throws DocumentException */ public void createPdf(String file) throws IOException, DocumentException { // step 1 Document document = new Document(); // step 2 PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(file)); // step 3 document.open(); // step 4 XMLWorkerHelper.getInstance().parseXHtml(writer, document, new FileInputStream(HTML), Charset.forName("UTF-8")); // step 5 document.close(); } /** * Main method */ public static void main(String[] args) throws IOException, DocumentException { File file = new File(DEST); file.getParentFile().mkdirs(); new D07_ParseHtmlAsian().createPdf(DEST); } }
在指定路徑下就可以得到 PDF 結果:
我測試之后發現能夠正常使用,nice
PDF中放入統計圖:
需要用到 jfreechart 來生成圖,然后再把圖片引入html,再轉pdf
https://www.yiibai.com/jfreechart
發現這個易百教程上面的java教程很全面,基本上涵蓋了java的各類技術和組件,都是一些生產上使用廣泛的組件技術,可以用來實現各種需求
Excel:
excel的話,使用poi+模板的方式就可以了
報表生成思路:
pdf:先寫一個基本的符合pdf生成標准(要點:所有的單標簽必須閉合,成對標簽正常些即可,支持一些基本的html、css,不支持外部link script,不支持js,body以外必須全部按照下面的格式來寫,body以內的,注意每個span都必須配上字體的樣式,否則不能顯示pdf中文文本)的html,然后用jsp的方式在特定位置填充數據,想要生成pdf的時候,讓程序自己去訪問剛才的jsp頁面(直接讓程序訪問localhost的頁面位置進行下載即可,使用http/https通道訪問),訪問得到的就是已經填充好數據的html了,然后下載,文件名生成時規定成.html格式的,然后再用上面的html轉pdf即可得到pdf了。
(待續)