1. 程式人生 > >freemarker+ITextRenderer 生成html轉pdf

freemarker+ITextRenderer 生成html轉pdf

網上已經有比較多的例子 寫這個 但是很多都是簡單的 demo,而且有很多隱藏的問題 
或者是零散的 對某些問題的解決方案 

本人再次寫一個完整的demo  無bug 可用 

我是在spring mvc中應用的 

Java程式碼  收藏程式碼
  1. String basePath = request.getSession().getServletContext()  
  2.                 .getRealPath("/");  
  3.         /* 建立配置 */  
  4.         Configuration cfg = new Configuration();  
  5.         /* 指定模板存放的路徑 */
      
  6.         cfg.setDirectoryForTemplateLoading(new File(basePath + "/WEB-INF/ftl"));  
  7.         cfg.setDefaultEncoding("UTF-8");  
  8.         // cfg.setObjectWrapper(new DefaultObjectWrapper());  
  9.         /* 從上面指定的模板目錄中載入對應的模板檔案 */  
  10.         // contractTemplate  
  11.         Template temp = cfg.getTemplate("contractTemplate.ftl"
    );  
  12.         /* 建立資料模型 */  
  13.         Map root = new HashMap();  
  14.         root.put("user""Big Joe");  
  15.         // Map latest = new HashMap();  
  16.         // root.put("latestProduct", latest);  
  17.         // latest.put("name", "green mouse");  
  18.         /* 將生成的內容寫入hello .html中 */  
  19.         String file1 = basePath + "html/contractTemplate.html"
    ;  
  20.         File file = new File(file1);  
  21.         if (!file.exists())  
  22.             file.createNewFile();  
  23.         // Writer out = new FileWriter(file);  
  24.         Writer out = new BufferedWriter(new OutputStreamWriter(  
  25.                 new FileOutputStream(file), "utf-8"));  
  26.         // Writer out = new OutputStreamWriter(System.out);  
  27.         temp.process(root, out);  
  28.         out.flush();  
  29.         String url = new File(file1).toURI().toURL().toString();  
  30.         String outputFile = basePath + "html/contractTemplate.pdf";  
  31.         OutputStream os = new FileOutputStream(outputFile);  
  32.         ITextRenderer renderer = new ITextRenderer();  
  33.         // PDFEncryption pdfEncryption = new  
  34.         // PDFEncryption(null,null,PdfWriter.ALLOW_PRINTING);  
  35.         // renderer.setPDFEncryption(pdfEncryption); //只有列印許可權的  
  36.         renderer.setDocument(url);  
  37.         // 解決中文問題  
  38.         ITextFontResolver fontResolver = renderer.getFontResolver();  
  39.         try {  
  40.             fontResolver.addFont(basePath + "/ui/fonts/simsun.ttc",  
  41.                     BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);  
  42.         } catch (DocumentException e) {  
  43.             // TODO Auto-generated catch block  
  44.             e.printStackTrace();  
  45.         }  
  46.         renderer.layout();  
  47.         try {  
  48.             renderer.createPDF(os);  
  49.         } catch (DocumentException e) {  
  50.             // TODO Auto-generated catch block  
  51.             e.printStackTrace();  
  52.         }  
  53.         System.out.println("轉換成功!");  
  54.         os.close();  



模版中在table 加樣式 style="margin-top: 60px;table-layout:fixed; word-break:break-strict;" 

這是為了避免 在pdf中顯示不全  
我的 功能是 通過生成的html生成合同 pdf 

最終效果圖: 


模版檔案 就是 ftl檔案 你 用html怎麼顯示就可以生成什麼樣的pdf 

裡面可以包含樣式  圖片 


儘量用table佈局 這樣不會出現 顯示到pdf顯示不全的 問題 


另外 附上freemark、模板檔案頭部關鍵 程式碼主要是處理 中文問題 
Java程式碼  收藏程式碼
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">    
  2. <html xmlns="http://www.w3.org/1999/xhtml">    
  3.   <head>  
  4.     <title>要生成的合同檔案</title>  
  5.   <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  
  6. <style mce_bogus="1" type="text/css">  
  7. body {font-family: SimSun; background:none;margin-left: auto;margin-right: auto;}  
  8. body,html,div,p{ font-size:14px; margin:0px; padding:0px;}  
  9. </style>  
  10. .....  
  11. <div class="table_block">  
  12. <table width="680" border="0" cellspacing="1" cellpadding="1" bgcolor="#CCCCCC"  style="table-layout:fixed; word-break:break-strict;">  
  13. ....  



另外有關中文換行 問題 有網友問我 後 我發現 解決途徑必須需要修改原始碼 修改後原始碼包我已經傳到 了 附件上core-renderer-R8-0604.jar 
有什麼疑問可以加我 qq :6637152交流


另外很多網友問我要專案demo 和相關檔案 
我這個功能是整合在公司專案裡的 原先不方便放出來,現在我已經單獨抽出一個開源專案供網友參考程式碼,https://git.oschina.net/zqb/usk.git 

網友可以把專案匯入eclipse或者myeclipse搜尋上面提到的相關程式碼找到相關功能 

原文:http://skyfar666.iteye.com/blog/2001353