1. 程式人生 > >Java實現HTML程式碼生成PDF文件

Java實現HTML程式碼生成PDF文件

1、IText實現html2pdf,速度快,糾錯能力差,支援中文(要求HTML使用unicode編碼),但中支援一種中文字型,開源。

2、Flying Sauser實現html2pdf,糾錯能力差,支援多種中文字型(部分樣式不能識別),開源。

3、PD4ML實現html2pdf,速度快,糾錯能力強,支援多種中文字型,商業。

(一)IText

         測試案例:TestIText.Java

         依賴jar包:iText-2.0.8.jar、iTextAsian.jar(支援中文)

         下面只是一個小的測試案例,如果專案中使用到了該元件可以參考API完成專案組中相應的功能!

  1. import java.io.FileOutputStream;  
  2. import java.io.FileReader;  
  3. import java.util.ArrayList;  
  4. import com.lowagie.text.Document;  
  5. import com.lowagie.text.Element;  
  6. import com.lowagie.text.Font;  
  7. import com.lowagie.text.PageSize;  
  8. import com.lowagie.text.Paragraph;  
  9. import com.lowagie.text.html.simpleparser.HTMLWorker;  
  10. import com.lowagie.text.html.simpleparser.StyleSheet;  
  11. import com.lowagie.text.pdf.BaseFont;  
  12. import com.lowagie.text.pdf.PdfWriter;  
  13. publicclass TestIText{  
  14.     publicstaticvoid main(String[] args) {  
  15.         TestIText ih = new TestIText();  
  16.         ih.htmlCodeComeFromFile("D://Test//iText.html"
    "D://Test//iText_1.pdf");  
  17.         ih.htmlCodeComeString("Hello中文""D://Test//iText_2.pdf");  
  18.     }  
  19.     publicvoid htmlCodeComeFromFile(String filePath, String pdfPath) {  
  20.         Document document = new Document();  
  21.         try {  
  22.             StyleSheet st = new StyleSheet();  
  23.             st.loadTagStyle("body""leading""16,0");  
  24.             PdfWriter.getInstance(document, new FileOutputStream(pdfPath));  
  25.             document.open();  
  26.             ArrayList p = HTMLWorker.parseToList(new FileReader(filePath), st);  
  27.             for(int k = 0; k < p.size(); ++k) {  
  28.                 document.add((Element)p.get(k));  
  29.             }  
  30.             document.close();  
  31.             System.out.println("文件建立成功");  
  32.         }catch(Exception e) {  
  33.             e.printStackTrace();  
  34.         }  
  35.     }  
  36.     publicvoid htmlCodeComeString(String htmlCode, String pdfPath) {  
  37.         Document doc = new Document(PageSize.A4);  
  38.         try {  
  39.             PdfWriter.getInstance(doc, new FileOutputStream(pdfPath));  
  40.             doc.open();  
  41.             // 解決中文問題
  42.             BaseFont bfChinese = BaseFont.createFont("STSong-Light""UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);  
  43.             Font FontChinese = new Font(bfChinese, 12, Font.NORMAL);  
  44.             Paragraph t = new Paragraph(htmlCode, FontChinese);  
  45.             doc.add(t);  
  46.             doc.close();  
  47.             System.out.println("文件建立成功");  
  48.         }catch(Exception e) {  
  49.             e.printStackTrace();  
  50.         }  
  51.     }  
  52. }  

 (二)Flying Sauser

         依賴jar包:iText-2.0.8.jar、iTextAsian.jar、core-renderer.jar

         預設情況下,core-renderer.jar對中文是不能進行換行的,如果想解決換行問題可以去http://bettereveryday.javaeye.com/blog/611561下載一個jar包,該包對原始碼做了稍加修改.

        下面只是一個小的測試案例,如果專案中使用到了該元件可以參考API完成專案組中相應的功能!

  1. import java.io.File;  
  2. import java.io.FileOutputStream;  
  3. import java.io.OutputStream;  
  4. import org.xhtmlrenderer.pdf.ITextFontResolver;  
  5. import org.xhtmlrenderer.pdf.ITextRenderer;  
  6. import com.lowagie.text.pdf.BaseFont;  
  7. publicclass TestFlyingSauser {  
  8.     publicstaticvoid main(String[] args) throws Exception {  
  9.         demo_1();  
  10.         demo_2();  
  11.     }  
  12.     // 不支援中文
  13.     publicstaticvoid demo_1() throws Exception {  
  14.         String inputFile = "D:/Test/flying.html";  
  15.         String url = new File(inputFile).toURI().toURL().toString();  
  16.         String outputFile = "D:/Test/flying.pdf";  
  17.         OutputStream os = new FileOutputStream(outputFile);  
  18.         ITextRenderer renderer = new ITextRenderer();  
  19.         renderer.setDocument(url);  
  20.         renderer.layout();  
  21.         renderer.createPDF(os);  
  22.         os.close();  
  23.     }  
  24.     // 支援中文
  25.     publicstaticvoid demo_2() throws Exception {  
  26.         String outputFile = "D:/Test/demo_3.pdf";  
  27.         OutputStream os = new FileOutputStream(outputFile);  
  28.         ITextRenderer renderer = new ITextRenderer();  
  29.         ITextFontResolver fontResolver = renderer.getFontResolver();  
  30.         fontResolver.addFont("C:/Windows/fonts/simsun.ttc", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);  
  31.         StringBuffer html = new StringBuffer();  
  32.         // DOCTYPE 必需寫否則類似於 這樣的字元解析會出現錯誤
  33.         html.append("<!DOCTYPE html PUBLIC /"-//W3C//DTD XHTML 1.0 Transitional//EN/" /"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd/">");
  34.         html.append("<html xmlns=/"http://www.w3.org/1999/xhtml/">").append("<head>")
  35.             .append("<meta http-equiv=/"Content-Type/" content=/"text/html; charset=UTF-8/" />")  
  36.             .append("<mce:style type=/"text/css/"><!--  
  37. body {font-family: SimSun;}  
  38. --></mce:style><style type=/"text/css/" mce_bogus="1">body {font-family: SimSun;}</style>")  
  39.             .append("</head>")  
  40.             .append("<body>");  
  41.         html.append("<div>支援中文!</div>");  
  42.         html.append("</body></html>");  
  43.         renderer.setDocumentFromString(html.toString());  
  44.         // 解決圖片的相對路徑問題
  45.         // renderer.getSharedContext().setBaseURL("file:/F:/teste/html/");
  46.         renderer.layout();  
  47.         renderer.createPDF(os);  
  48.         os.close();  
  49.     }  
  50. }  

(三)PD4ML

        依賴jar包:pd4ml_demo.jar、pd4ml__css2.jar、fonts.jar

       下面只是一個小的測試案例,如果專案中使用到了該元件可以參考API完成專案組中相應的功能!

  1. import java.awt.Insets;  
  2. import java.io.File;  
  3. import java.io.FileOutputStream;  
  4. import java.io.StringReader;  
  5. import org.zefer.pd4ml.PD4Constants;  
  6. import org.zefer.pd4ml.PD4ML;  
  7. publicclass Converter {  
  8.     publicstaticvoid main(String[] args) throws Exception {  
  9.         Converter converter = new Converter();  
  10.         converter.generatePDF_2(new File("D:/Test/demo_ch_pd4ml_a.pdf"), "D:/Test/a.htm");  
  11.         File pdfFile = new File("D:/Test/demo_ch_pd4ml.pdf");  
  12.         StringBuffer html = new StringBuffer();  
  13.         html.append("<html>")  
  14.             .append("<head>")  
  15.             .append("<meta http-equiv=/"Content-Type/" content=/"text/html; charset=UTF-8/" />")  
  16.             .append("</head>")  
  17.             .append("<body>")  
  18.             .append("<font face=/"KaiTi_GB2312/">")  
  19.             .append("<font color='red' size=22>顯示中文</font>")  
  20.             .append("</font>")  
  21.             .append("</body></html>");  
  22.         StringReader strReader = new StringReader(html.toString());  
  23.         converter.generatePDF_1(pdfFile, strReader);  
  24.     }  
  25.     // 手動構造HTML程式碼
  26.     publicvoid generatePDF_1(File outputPDFFile, StringReader strReader) throws Exception {  
  27.         FileOutputStream fos = new FileOutputStream(outputPDFFile);  
  28.         PD4ML pd4ml = new PD4ML();  
  29.         pd4ml.setPageInsets(new Insets(20101010));  
  30.         pd4ml.setHtmlWidth(950);  
  31.         pd4ml.setPageSize(pd4ml.changePageOrientation(PD4Constants.A4));  
  32.         pd4ml.useTTF("java:fonts"true);  
  33.         pd4ml.setDefaultTTFs("KaiTi_GB2312""KaiTi_GB2312""KaiTi_GB2312");  
  34.         pd4ml.enableDebugInfo();  
  35.         pd4ml.render(strReader, fos);  
  36.     }