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


最近在工作中遇到了一個很囧的事情。要把HTML頁面轉換成PDF或者tiff圖片等其他形式,目前tiff還是一頭霧水,如果各位大師有真的可行的想法(不要是別人那邊抄的,百度最近搜索的質量嚴重的打擊了我對國貨的信心。)希望能夠告訴我,先謝了。
言歸正傳。所以,我就做了把HTML轉換成PDF的形式。目前可以完美支持一比一轉換,下面就把我的解決方案貼出來。
首先,當然是找到能夠解析PDF的完美組件,百度和谷歌不約而同的告訴我們。IText是王道。而目前開源的組件中,Itext的確是一個First Choice,如果各位單純是做把圖片轉成PDF或者自己寫了Velocity或者FreeMarker模板生成了HTML是非常推薦直接用Itext來進行的。而如果,大家像我這樣已經有前人寫好了HTML頁面或者懶得寫FreeMarker模板的話。可以直接看下一段。
由於他們已經寫好了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);

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

以上就是解決方案。

下面給出這幾個包的下載地址。大家可以直接下載。


下載地址,猛點我吧!

 

轉自:http://blog.csdn.net/jasonchris/article/details/7705631

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM