flying saucer html轉pdf經驗分享

    對比了不少生成pdf的方案,最終仍是決定使用flying saucer,網上能搜出N多相關文章,可是照着作了會出現各類問題,仍是得本身一點點摸索,先後花了兩天時間才達到本身的目標,下面把過程當中的經驗總結一下,但願對你們能有所幫助:css

1)jar包選擇

小小抱怨一下,各類開源產品給了咱們極大幫助,可是一般版本管理較爲混亂,也給咱們帶來了不小的麻煩,由於jar包兼容性問題花了很長時間,尤爲是itext,下載了最新的5.5.0 5.5.1版本竟然裏面都有錯誤的!最後試了各類版本,終於選定5.0.6版本。貌似沒法上傳附件,不然能夠將jar上傳,省得你們找起來麻煩。注意一下,我也是網上下載了一個別人修改過支持中文的jar包。html

2)中文支持

首先須要添加中文字庫,也就是你的頁面中用到的全部字體: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的寬度。


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,百度一下不少的。

兩個參數:兩個都是密碼,不一樣的是第一個密碼是瀏覽密碼,輸入該密碼打開pdf後根據設置的權限進行控制,第二個密碼屬於全部者密碼,使用該密碼打開pdf權限不受控制。

pdf的操做權限根據例子中寫就好了


4)css樣式

其實flying saucer對不少css都支持得很差,這個得本身慢慢試了,至關痛苦的過程,不過只要成功一個,其餘的就簡單了。

注意點:大寫標籤不識別!好比<DIV> <TD>等等通通不識別!,說到底就是大小寫敏感。

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就能夠了!不然會重複哦。

相關文章
相關標籤/搜索