itext轉換HTML為pdf,支援中文換行
阿新 • • 發佈:2019-02-11
最近有個需求,OA系統流程走完後,要求將流程匯出為pdf供人下載,在網上各種查資料搗鼓了半天,終於算是搞出來了,基本邏輯就是配置好需要顯示的佈局,然後根據佈局生成HTML頁面,再匯出為pdf。
(20180903增加:此方法生成pdf樣式存在差異,我後續使用了別的方式生成pdf,詳見:
使用的jar包:
itext-2.1.5.jar
jsoup-1.1.1.jar
core-renderer-2011.04.16.jar
其中core-renderer-2011.04.16.jar 原本不支援中文換行,我按照網上的方法修改了一下,增加了對中文的處理。
測試程式碼:
package com.eweaver.base.util; import java.io.FileOutputStream; import java.io.OutputStream; import org.jsoup.Jsoup; import org.xhtmlrenderer.pdf.ITextFontResolver; import org.xhtmlrenderer.pdf.ITextRenderer; import com.lowagie.text.pdf.BaseFont; /** * 轉換html為pdf * @author xiongfan * */ public class Html2pdf { /** * * @param html 標準的html格式。 * @param outpath * @return */ public static String html2pdf(String html ,String outpath){ if(html == null || html.length()<=0) return null; try { OutputStream os = new FileOutputStream(outpath); ITextRenderer renderer = new ITextRenderer(); // renderer.getSharedContext().setReplacedElementFactory(new Base64ImgReplacedElementFactory()); // renderer.getSharedContext().getTextRenderer().setSmoothingThreshold(0); renderer.setDocumentFromString(html); ITextFontResolver fontResolver = renderer.getFontResolver(); // 新增字型支援 // 實際專案中,可以獲取改字型所在真實的伺服器的路徑,這個方法是本地地址和網路地址都支援的 // 這裡面新增的是宋體 String zipath = Html2pdf.class.getResource("/resources/fonts/simsun.ttc").getFile(); zipath = zipath.replace("%20", " ");//處理目錄中有空格問題 fontResolver.addFont(zipath,BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED); //圖片載入問題。(僅支援相對路徑的圖片。) // renderer.getSharedContext().setBaseURL("file:/D:/apache-tomcat-6.0.32/webapps/ROOT/"); renderer.layout(); renderer.createPDF(os); os.flush(); os.close(); } catch (Exception e) { e.printStackTrace(); return null; } return outpath; } public static void main(String[] args) { String str = "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">" + "<html lang=\"en\">" + "<head>" + "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />" + "<title>HTML 2 PDF</title>" +"<style type=\"text/css\">"+ " @page{size:A3 }"+ " body {font-family: SimSun;font-size:14px; width:95%; }"+ " table{table-layout:fixed; word-break:break-strict;}"+ " </style>" + "</head>" + "<body>" // + "<center>" + "<div style=\"width:100%; aligh:left;border:1px solid black;padding:1px;\"> 多情浪漫的人,其實內心的情感" //+ "<hr/>" + "<table style=\"BORDER-TOP: #090909 1px solid; BORDER-RIGHT: #090909 1px solid; WIDTH: 100%; BORDER-COLLAPSE: collapse; BORDER-BOTTOM: #090909 1px solid; BORDER-LEFT: #090909 1px solid\" borderColor=#090909 cellSpacing=0 cellPadding=0 border=1" +"<COLGROUP>" +"<COL width=\"50%\">" +"<COL width=\"50%\">" +"</COLGROUP>" + " <tr>" + " <td>中table的中文顯示daf dsafd saf dsaf dsafd safd sfds afds afaf asdfs addsa fds fd sad sad sad fsa及換行,多情浪漫的人,其實內心的情感是非dd常脆弱 多情浪漫的人多情浪漫的人多情浪,和無人房間卡薩,阿飛飛,發的發的過來看個加快經濟後果。" + " </td>" + " <td>" + "多情浪漫的人,其實內心的情感是非dd常脆弱多情浪漫的人。" + " </td>" + " </tr>" + " <tr>" + " <td colspan=\"2\">" + " 多情浪漫的人,其實內心的情感是非dd常脆弱的,感情的末梢,有那麼一。多情浪漫的人,其實內心的情感是非多情浪漫的人,其實內心的情感是非多情浪漫的人,其實內心的情感是非多情浪漫的人,其實內心的情感是非多情浪漫的人,其實內心的情感是非多情浪漫的人,其實內心的情感是非多情浪漫的人,其實內心的情感是非" + " </td>" + " </tr>" + "</table>" + "</div>" + "</body>" // + "</center>" + "</html>"; str = Jsoup.parse(str).html(); System.out.println(str); String filepath = html2pdf(str, "d://testpdf3.pdf"); System.out.println(filepath); } }
我這裡使用了中文字型:simsun.ttc,如需其它字型請自行更換,沒有字型請自行百度下載。
另外:頁面大小設定:style中加入: @page{size:A3 } //大小自己設定。
注意:需要為table增加樣式:table{table-layout:fixed; word-break:break-strict;}