中文JAVA技術(shù)平等自由協(xié)作創(chuàng)造

          Java專題文章博客和開源

          常用鏈接

          統(tǒng)計

          最新評論

          Java實(shí)現(xiàn)HTML頁面轉(zhuǎn)PDF解決方案

            首先,當(dāng)然是找到能夠解析PDF的完美組件,百度和谷歌不約而同的告訴我們。IText是王道。而目前開源的組件中,Itext的確是一個First Choice,如果各位單純是做把圖片轉(zhuǎn)成PDF或者自己寫了Velocity或者FreeMarker模板生成了HTML是非常推薦直接用Itext來進(jìn)行的。而如果,大家像我這樣已經(jīng)有前人寫好了HTML頁面或者懶得寫FreeMarker模板的話。可以直接看下一段。

            由于他們已經(jīng)寫好了HTML頁面,而且顯示已經(jīng)很完美了。那我要做的就是能完美解析HTML+CSS的PDF生成工具。這時候flying-saucer進(jìn)入了我的選擇范圍中。

            這個工具托管在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自身的一個很嚴(yán)重的問題就是解析CSS有很大的問題。而這個解決了。下面就是用Flying Saucer來實(shí)現(xiàn)的代碼:

            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頁面必須是標(biāo)準(zhǔn)的XHTML頁面。頁面的頂上必須是這樣的格式:

            <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ".org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

            <html xmlns=".org/1999/xhtml">

            并且HTML頁面的語法必須是非常嚴(yán)謹(jǐn)?shù)模袠?biāo)簽都必須閉合等等(由于flying-Saucer做了XML解析的工作,不嚴(yán)謹(jǐn)會報錯的。),這是對頁面的第一個要求。

            2.要用到圖片的地方寫相對路徑的形式,比如:

            <img src="a.jpg" alt="323" width="252" height="80" />

            而它的圖片位置則必須在Java代碼中指定。

            renderer.getSharedContext()。setBaseURL("file:/D:/");

            也有另一種方法就是直接在<img>標(biāo)簽中寫絕對路徑。

            3.Flying-Saucer在解析tiff格式的圖片的時候會報錯。具體原因我還沒找到。希望大家能夠指點(diǎn)我。

            4.如果在頁面中有中文字體的話。必須在HTML代碼中的樣式中寫上某種字體的css,并且必須是用英文的,然后在Java代碼中寫上對應(yīng)的文件位置。

            ITextFontResolver fontResolver = renderer.getFontResolver();

            fontResolver.addFont("C:/Windows/Fonts/SIMSUN.TTC", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);

            上面的方法是添加了宋體。也可以添加其他字體。

            以上就是解決方案托福答案

          posted on 2013-12-15 10:57 好不容易 閱讀(228) 評論(0)  編輯  收藏


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


          網(wǎng)站導(dǎo)航:
           
          PK10開獎 PK10開獎
          主站蜘蛛池模板: 兰考县| 阜阳市| 天柱县| 崇州市| 东宁县| 西峡县| 吉林市| 武定县| 绥阳县| 阿勒泰市| 阳春市| 阳谷县| 安宁市| 嘉义县| 和顺县| 巨鹿县| 辽阳市| 卢氏县| 仁化县| 永定县| 九台市| 天长市| 五原县| 根河市| 壤塘县| 荣成市| 黄石市| 武清区| 凤翔县| 太仆寺旗| 乌审旗| 佛冈县| 玉田县| 通许县| 天等县| 彰武县| 阜新市| 台前县| 保山市| 精河县| 洮南市|