Java生成PDF有兩種辦法:1.利用PDF模板,讀入模板,填充數(shù)據(jù),生成帶數(shù)據(jù)的PDF。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2.利用HTML模板,讀取HTML模板,填充數(shù)據(jù),由HTML轉(zhuǎn)PDF。
第一種缺點是,表單域的變量只能是name,age這樣的簡單變量,而不能是user.name,user.age這樣的復(fù)雜變量;而且這種生成PDF的方式要自己制作表單的時候就設(shè)計好那一塊應(yīng)該放什么,沒有這個變量的時候就會空出來一塊,樣式擴展性很差。
第二種基本是可以解決第一種的,只是要自己把需要的樣式用css樣式寫出來,可以配合freemaker,這種變量賦值的方式就是變量如果不存在,就會報錯,整個PDF都無法完成打印,要每一個變量都判空,可以參考:http://www.jb51.net/article/112366.html
其中第二種又有很多可以實現(xiàn)的jar包,網(wǎng)上有幾種,我也試過了其中的兩種,一種就是itext,網(wǎng)上說的這種目前淶水還是挺多的,這種的好處就是,中文不用特地下載一個字符集,只要在HTML頁面中注明?body {font-family:SimSun;},總體來說中文的支持度還可以,只是對css樣式支持性能很差,有網(wǎng)友總結(jié)的幾點:

而這只是其中的幾種限制,要想寫出一個好看得PDF,itext問題還是很大的,故不建議使用,如果是簡單的PDF,沒有過多的樣式,這種方法倒是還可以。
還有一種是使用flying-saucer,這種對css樣式的支持非常好,而麻煩的地方就是中文的支持,主要有兩個問題:一、不支持中文。解決辦法:在項目中放入一個simsun.ttc,即新宋體,如果想要其他的,可以放其他的,直接放進去是為了解決不同操作系統(tǒng)的系統(tǒng)字體可能找不到的原因,然后在代碼中引入這個字符集,注意路徑,運行時路徑和在磁盤的路徑是不一樣的,這樣可以解決中文不支持的問題。二、支持中文,但是中文不換行,寫到外面,直接截斷。解決辦法:在需要中文換行的地方加上css樣式:

這樣就可以解決中文不換行的問題。另外圖片的顯示效果并不是很好,這個問題暫時還沒有研究。
另外網(wǎng)上說的需要重寫jar包,自己下載jar包,然后每個下載都是要登錄、積分,真是坑爹啊,一聽到要自己導(dǎo)入jar就憂傷,自己的項目還好說,整個公司人手一份你導(dǎo)出的jar包,各種問題,我用的jar包就是普通的maven倉庫中下載的,我的pom文件依賴如下:

最后,效果圖,每次搜別人的博客或者主頁,看了半天,并沒有效果圖,又是憂傷,我怎么知道你說了這么多,這些到底有沒有用,而且沒有效果圖總是讓人沒有動力:

tips:每次改這種類似的程序,總是搞不懂要怎么修改FileOutputStream,這個是寫到一個真實存在的文件夾中的,要怎么上傳到阿里云或者別的什么服務(wù)器上呢?其實只要修改輸出流類型,不要輸出到一個具體的文件就行了。