使用flying saucer將html轉pdf經驗分享

jopen 10年前發布 | 26K 次閱讀 PDF工具包 flying saucer

    對比了很多生成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

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!