使用flying-saucer 實現 html轉pdf實現input框select,textarea checkbox等的顯示

昨天研究html轉pdf,使用itextpdf 5.5.9版本(上一篇博客:http://www.javashuo.com/article/p-hftdqibm-kv.htmlcss

<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:

相關文章
相關標籤/搜索