freemarker+ITextRenderer 生成html轉pdf
阿新 • • 發佈:2019-02-01
網上已經有比較多的例子 寫這個 但是很多都是簡單的 demo,而且有很多隱藏的問題
或者是零散的 對某些問題的解決方案
本人再次寫一個完整的demo 無bug 可用
我是在spring mvc中應用的
Java程式碼
模版中在table 加樣式 style="margin-top: 60px;table-layout:fixed; word-break:break-strict;"
這是為了避免 在pdf中顯示不全
我的 功能是 通過生成的html生成合同 pdf
最終效果圖:
模版檔案 就是 ftl檔案 你 用html怎麼顯示就可以生成什麼樣的pdf
裡面可以包含樣式 圖片
儘量用table佈局 這樣不會出現 顯示到pdf顯示不全的 問題
另外 附上freemark、模板檔案頭部關鍵 程式碼主要是處理 中文問題
Java程式碼
另外有關中文換行 問題 有網友問我 後 我發現 解決途徑必須需要修改原始碼 修改後原始碼包我已經傳到 了 附件上core-renderer-R8-0604.jar
有什麼疑問可以加我 qq :6637152交流
另外很多網友問我要專案demo 和相關檔案
我這個功能是整合在公司專案裡的 原先不方便放出來,現在我已經單獨抽出一個開源專案供網友參考程式碼,https://git.oschina.net/zqb/usk.git
或者是零散的 對某些問題的解決方案
本人再次寫一個完整的demo 無bug 可用
我是在spring mvc中應用的
Java程式碼
- String basePath = request.getSession().getServletContext()
- .getRealPath("/");
- /* 建立配置 */
- Configuration cfg = new Configuration();
-
/* 指定模板存放的路徑 */
- cfg.setDirectoryForTemplateLoading(new File(basePath + "/WEB-INF/ftl"));
- cfg.setDefaultEncoding("UTF-8");
- // cfg.setObjectWrapper(new DefaultObjectWrapper());
- /* 從上面指定的模板目錄中載入對應的模板檔案 */
- // contractTemplate
-
Template temp = cfg.getTemplate("contractTemplate.ftl"
- /* 建立資料模型 */
- Map root = new HashMap();
- root.put("user", "Big Joe");
- // Map latest = new HashMap();
- // root.put("latestProduct", latest);
- // latest.put("name", "green mouse");
- /* 將生成的內容寫入hello .html中 */
-
String file1 = basePath + "html/contractTemplate.html"
- File file = new File(file1);
- if (!file.exists())
- file.createNewFile();
- // Writer out = new FileWriter(file);
- Writer out = new BufferedWriter(new OutputStreamWriter(
- new FileOutputStream(file), "utf-8"));
- // Writer out = new OutputStreamWriter(System.out);
- temp.process(root, out);
- out.flush();
- String url = new File(file1).toURI().toURL().toString();
- String outputFile = basePath + "html/contractTemplate.pdf";
- OutputStream os = new FileOutputStream(outputFile);
- ITextRenderer renderer = new ITextRenderer();
- // PDFEncryption pdfEncryption = new
- // PDFEncryption(null,null,PdfWriter.ALLOW_PRINTING);
- // renderer.setPDFEncryption(pdfEncryption); //只有列印許可權的
- renderer.setDocument(url);
- // 解決中文問題
- ITextFontResolver fontResolver = renderer.getFontResolver();
- try {
- fontResolver.addFont(basePath + "/ui/fonts/simsun.ttc",
- BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
- } catch (DocumentException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- renderer.layout();
- try {
- renderer.createPDF(os);
- } catch (DocumentException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- System.out.println("轉換成功!");
- os.close();
模版中在table 加樣式 style="margin-top: 60px;table-layout:fixed; word-break:break-strict;"
這是為了避免 在pdf中顯示不全
我的 功能是 通過生成的html生成合同 pdf
最終效果圖:
模版檔案 就是 ftl檔案 你 用html怎麼顯示就可以生成什麼樣的pdf
裡面可以包含樣式 圖片
儘量用table佈局 這樣不會出現 顯示到pdf顯示不全的 問題
另外 附上freemark、模板檔案頭部關鍵 程式碼主要是處理 中文問題
Java程式碼
- <!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">
- <head>
- <title>要生成的合同檔案</title>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <style mce_bogus="1" type="text/css">
- body {font-family: SimSun; background:none;margin-left: auto;margin-right: auto;}
- body,html,div,p{ font-size:14px; margin:0px; padding:0px;}
- </style>
- .....
- <div class="table_block">
- <table width="680" border="0" cellspacing="1" cellpadding="1" bgcolor="#CCCCCC" style="table-layout:fixed; word-break:break-strict;">
- ....
另外有關中文換行 問題 有網友問我 後 我發現 解決途徑必須需要修改原始碼 修改後原始碼包我已經傳到 了 附件上core-renderer-R8-0604.jar
有什麼疑問可以加我 qq :6637152交流
另外很多網友問我要專案demo 和相關檔案
我這個功能是整合在公司專案裡的 原先不方便放出來,現在我已經單獨抽出一個開源專案供網友參考程式碼,https://git.oschina.net/zqb/usk.git
網友可以把專案匯入eclipse或者myeclipse搜尋上面提到的相關程式碼找到相關功能
原文:http://skyfar666.iteye.com/blog/2001353