qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

          Java實現HTML頁面轉PDF解決方案

          首先,當然是找到能夠解析PDF的完美組件,百度谷歌不約而同的告訴我們。IText是王道。而目前開源的組件中,Itext的確是一個First Choice,如果各位單純是做把圖片轉成PDF或者自己寫了Velocity或者FreeMarker模板生成了HTML是非常推薦直接用Itext來進行的。而如果,大家像我這樣已經有前人寫好了HTML頁面或者懶得寫FreeMarker模板的話??梢灾苯涌聪乱欢巍?/div>
            由于他們已經寫好了HTML頁面,而且顯示已經很完美了。那我要做的就是能完美解析HTML+CSS的PDF生成工具。這時候flying-saucer進入了我的選擇范圍中。
            http://code.google.com/p/flying-saucer/
            上面是網址,這個工具托管在GoogleCode上面,作者做他們能夠做下面的工作
            Flying Saucer takes XML or XHTML and applies CSS 2.1-compliant stylesheets to it, in order to render to PDF (via iText), images, and on-screen using Swing or SWT。
            不難看出工作原理,就是解析XML或者XHTML并且包括css樣式表,并且用Swing或者SWT的組件生成PDF的功能。這解決了頁面的顯示問題。IText自身的一個很嚴重的問題就是解析CSS有很大的問題。而這個解決了。下面就是用Flying Saucer來實現的代碼:
          public boolean convertHtmlToPdf(String inputFile, String outputFile)
          throws Exception {
          OutputStream os = new FileOutputStream(outputFile);
          ITextRenderer renderer = new ITextRenderer();
          String url = new File(inputFile).toURI().toURL().toString();
          renderer.setDocument(url);
          // 解決中文支持問題
          ITextFontResolver fontResolver = renderer.getFontResolver();
          fontResolver.addFont("C:/Windows/Fonts/SIMSUN.TTC", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
          //解決圖片的相對路徑問題
          renderer.getSharedContext().setBaseURL("file:/D:/");
          renderer.layout();
          renderer.createPDF(os);
          os.flush();
          os.close();
          return true;
          }
            上面這段代碼是這樣的,輸入一個HTML地址URL = inputFile,輸入一個要輸出的地址,就可以在輸出的PDF地址中生成這個PDF。
            注意事項:
            1.輸入的HTML頁面必須是標準的XHTML頁面。頁面的頂上必須是這樣的格式:
            <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
            <html xmlns="http://www.w3.org/1999/xhtml">
            并且HTML頁面的語法必須是非常嚴謹的,所有標簽都必須閉合等等(由于flying-Saucer做了XML解析的工作,不嚴謹會報錯的。),這是對頁面的第一個要求。
            2.要用到圖片的地方寫相對路徑的形式,比如:
            <img src="a.jpg" alt="323" width="252" height="80" />
            而它的圖片位置則必須在Java代碼中指定。
            renderer.getSharedContext().setBaseURL("file:/D:/");
            也有另一種方法就是直接在<img>標簽中寫絕對路徑。
            3.Flying-Saucer在解析tiff格式的圖片的時候會報錯。具體原因我還沒找到。希望大家能夠指點我。
            4.如果在頁面中有中文字體的話。必須在HTML代碼中的樣式中寫上某種字體的css,并且必須是用英文的,然后在Java代碼中寫上對應的文件位置。
            ITextFontResolver fontResolver = renderer.getFontResolver();
            fontResolver.addFont("C:/Windows/Fonts/SIMSUN.TTC", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
            上面的方法是添加了宋體。也可以添加其他字體。
            以上就是解決方案。

          posted on 2013-12-17 09:12 順其自然EVO 閱讀(532) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          <2013年12月>
          24252627282930
          1234567
          891011121314
          15161718192021
          22232425262728
          2930311234

          導航

          統計

          • 隨筆 - 3936
          • 文章 - 404
          • 評論 - 179
          • 引用 - 0

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 喜德县| 治县。| 太康县| 开鲁县| 西吉县| 彭泽县| 当阳市| 雷州市| 湟中县| 平泉县| 遂昌县| 永城市| 四川省| 江永县| 新余市| 枞阳县| 广德县| 龙江县| 祁连县| 大方县| 九江市| 新闻| 格尔木市| 青神县| 桂东县| 融水| 凤冈县| 邵武市| 隆德县| 林甸县| 商丘市| 阜新| 龙游县| 南部县| 南投市| 大丰市| 红安县| 隆子县| 林芝县| 永宁县| 册亨县|