昨天研究html轉pdf,使用itextpdf 5.5.9版本(上一篇博客:http://www.javashuo.com/article/p-hftdqibm-kv.html)css
<dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version>${itextpdf.version}</version> </dependency> <dependency> <groupId>com.itextpdf</groupId> <artifactId>itext-asian</artifactId> <version>${itext.asian.version}</version> </dependency>
中文顯示問題解決了,當時碰到了打印表單中input框等不顯示的問題。html
今天換了個方案使用flying-saucer 實現html轉pdfjava
<dependency> <groupId>org.xhtmlrenderer</groupId> <artifactId>flying-saucer-pdf-itext5</artifactId> <version>9.1.1</version> </dependency>
實現代碼以下:windows
public void html2pdf(String html, File file, String fontDir) throws I18NIllegalArgumentException { try (OutputStream os = new FileOutputStream(file); ){ ITextRenderer renderer = new ITextRenderer(); ITextFontResolver fontResolver = (ITextFontResolver) renderer.getSharedContext().getFontResolver(); //添加字體庫 begin File f = new File(fontDir); if (f.isDirectory()) { File[] files = f.listFiles(new FilenameFilter() { @Override public boolean accept(File dir, String name) { String lower = name.toLowerCase(); return lower.endsWith(".otf") || lower.endsWith(".ttf") || lower.endsWith(".ttc"); } }); for (int i = 0; i < files.length; i++) { fontResolver.addFont(files[i].getAbsolutePath(), BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED); } } //添加字體庫end renderer.setDocumentFromString(html); renderer.layout(); renderer.createPDF(os); } catch (Exception e) { throw new I18NIllegalArgumentException(e); } }
網上查的都是添加字體的方法都是這樣實現的:瀏覽器
ITextFontResolver fontResolver = renderer.getFontResolver(); fontResolver.addFont("C:/Windows/Fonts/simsun.ttc", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED); fontResolver.addFont("C:/Windows/Fonts/simhei.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED); fontResolver.addFont("C:/Windows/Fonts/simkai.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
這樣實現有個缺陷:字體的路徑都是系統的目錄,不一樣系統(windows,Linux)字體目錄不一樣,對系統依賴過高。ide
爲了解決這個問題:找到字體庫文件,複製到項目的目錄中,在代碼中直接遍歷這個目錄,添加全部的字體。測試
注意:頁面中字體不能使用中文,須要使用英文名稱,並且是大小寫敏感的!例如宋體的英文名稱是 SimSun(注意不是simsun!,首字母都是大寫的)字體
錯誤寫法:font-family:'宋體' 或者 font-family:'simsun' 或者 font-family: '微軟雅黑'.net
正確寫法:font-family:'SimSun' 或者 font-family:'SimHei'或者 font-family: 'Microsoft YaHei'code
另外: html的格式要求符合xml格式(即必須有結束標籤)
測試:
測試用html代碼:
<!DOCTYPE html> <html> <head> <title>我是標題</title> <meta charset="utf-8"/> <style type="text/css"> *{font-family: 'SimSun';} </style> </head> <body> <input type="text" name="name" style="line-height: 1;height: 30px; width: 300px; font-size: 12px;" value="I am 輸入 input" readonly="readonly" /> <textarea disabled="disabled">我是內容</textarea> <select disabled="disabled"><option>asdfsdf今晚打老虎</option></select> <input type="checkbox" name="hobby" value="運動" disabled="disabled"/>運動<input type="checkbox" name="hobby2" value="睡覺" checked="checked" readonly="readonly"/>睡覺 </body> </html>
html瀏覽器顯示結果:
生成的pdf: