對比了不少生成pdf的方案,最終仍是決定使用flying saucer,網上能搜出N多相關文章,可是照着作了會出現各類問題,仍是得本身一點點摸索,先後花了兩天時間才達到本身的目標,下面把過程當中的經驗總結一下,但願對你們能有所幫助:css
小小抱怨一下,各類開源產品給了咱們極大幫助,可是一般版本管理較爲混亂,也給咱們帶來了不小的麻煩,由於jar包兼容性問題花了很長時間,尤爲是itext,下載了最新的5.5.0 5.5.1版本竟然裏面都有錯誤的!最後試了各類版本,終於選定5.0.6版本。貌似沒法上傳附件,不然能夠將jar上傳,省得你們找起來麻煩。注意一下,我也是網上下載了一個別人修改過支持中文的jar包。html
首先須要添加中文字庫,也就是你的頁面中用到的全部字體:java
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
ui
正確寫法:font-family:SimSun 或者 font-family:SimHei 加密
若是生成的pdf中文不顯示或者亂碼,請確認以下信息:spa
確保頁面中全部內容都指定了字體,最好能指定 body {font-family:....},以防止漏網之魚。code
確保上述全部字體均經過addFont加入,字體名稱錯誤或者字體不存在會拋出異常,很方便,可是沒導入的字體不會有任何提示。htm
確保字體名稱正確,不使用中文,大小寫正確。get
確保html標籤都正確,簡單的方法是全部內容都去掉,隨便寫幾個中文看看可否正常生成,若是能夠,在認真檢查html標籤,不然再次檢查上述幾條。
還有就是中文換行的問題了,帶有中文並且文字較多存在換行狀況時,須要給table加入樣式:
table-layout:fixed,而後表格中的td使用%還指定td的寬度。
加密方法較爲簡單:
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,百度一下不少的。
兩個參數:兩個都是密碼,不一樣的是第一個密碼是瀏覽密碼,輸入該密碼打開pdf後根據設置的權限進行控制,第二個密碼屬於全部者密碼,使用該密碼打開pdf權限不受控制。
pdf的操做權限根據例子中寫就好了
其實flying saucer對不少css都支持得很差,這個得本身慢慢試了,至關痛苦的過程,不過只要成功一個,其餘的就簡單了。
注意點:大寫標籤不識別!好比<DIV> <TD>等等通通不識別!,說到底就是大小寫敏感。
其實很簡單,第一個頁面不變,從第二個起:
for(int i = 1; i < inputFile.length; i++) { renderer.setDocument(new File(root, inputFile[i])); renderer.layout(); renderer.writeNextDocument(); } renderer.finishPDF();
<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就能夠了!不然會重複哦。