使用flying saucer將html轉pdf經驗分享
對比了很多生成pdf的方案,最終還是決定使用flying saucer,網上能搜出N多相關文章,但是照著做了會出現各種問題,還是得自己一點點摸索,前后花了兩天時間才達到自己的目標,下面把過程中的經驗總結一下,希望對大家能有所幫助:
1)jar包選擇
小小抱怨一下,各種開源產品給了我們極大幫助,但是通常版本管理較為混亂,也給我們帶來了不小的麻煩,因為jar包兼容性問題花了很長時間,尤其是itext,下載了最新的5.5.0 5.5.1版本居然里面都有錯誤的!最后試了各種版本,終于選定5.0.6版本。貌似無法上傳附件,否則可以將jar上傳,免得大家找起來麻煩。注意一下,我也是網上下載了一個別人修改過支持中文的jar包。
2)中文支持
首先需要添加中文字庫,也就是你的頁面中用到的所有字體:
ITextFontResolver fontResolver = renderer.getFontResolver(); fontResolver.addFont("C:/Windows/Fonts/simsun.ttc", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED); fontResolver.addFont("C:/Windows/Fonts/simhei.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED); fontResolver.addFont("C:/Windows/Fonts/simkai.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
上面這個很簡單,到處都能找到示例代碼,但是注意點來了:頁面中字體不能使用中文,需要使用英文名稱,而且是大小寫敏感的!例如宋體的英文名稱是 SimSun(注意不是simsun!,首字母都是大寫的)
錯誤寫法:font-family:宋體 或者 font-family:simsun
正確寫法:font-family:SimSun 或者 font-family:SimHei
如果生成的pdf中文不顯示或者亂碼,請確認如下信息:
-
確保頁面中所有內容都指定了字體,最好能指定 body {font-family:....},以防止漏網之魚。
</li> -
確保上述所有字體均通過addFont加入,字體名稱錯誤或者字體不存在會拋出異常,很方便,但是沒導入的字體不會有任何提示。
</li> -
確保字體名稱正確,不使用中文,大小寫正確。
</li> -
確保html標簽都正確,簡單的方法是所有內容都去掉,隨便寫幾個中文看看能否正常生成,如果可以,在認真檢查html標簽,否則再次檢查上述幾條。
</li> </ul>3)加密
加密方法較為簡單:
ITextRenderer renderer = new ITextRenderer(); renderer.setPDFEncryption(getEncryption()); private PDFEncryption getEncryption() { PDFEncryption encrypt = new PDFEncryption(new String("a").getBytes(), new String("b").getBytes(), PdfWriter.ALLOW_SCREENREADERS); return encrypt; }
但是注意點來了,需要引入jar包!bcprov-jdk16-145.jar,百度一下很多的。
4)css樣式
其實flying saucer對很多css都支持得不好,這個得自己慢慢試了,相當痛苦的過程,不過只要成功一個,其他的就簡單了。
5)多頁面生成pdf
其實很簡單,第一個頁面不變,從第二個起:
for(int i = 1; i < inputFile.length; i++) { renderer.setDocument(new File(root, inputFile[i])); renderer.layout(); renderer.writeNextDocument(); } renderer.finishPDF();
6)標簽
<head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> <link href="****.css" rel="stylesheet" type="text/css" /> <bookmarks> <bookmark name="a" href="#a" /> <bookmark name="b" href="#b" /> </bookmarks> </head>
其實就是在頁面中增加錨點,然后在head中加入bookmark即可,但是注意點來了,如果你是將多個頁面生成到一個pdf中,那么只要在最后一個頁面中加入bookmark就可以了!否則會重復哦。
來自:http://my.oschina.net/u/603602/blog/268611