一、須要的jar包:org.xhtmlrenderer.flying-saucer-pdf-itext5,Maven依賴以下:html
1 <dependency> 2 <groupId>org.xhtmlrenderer</groupId> 3 <artifactId>flying-saucer-pdf-itext5</artifactId> 4 <version>9.0.7</version> 5 </dependency>
二、中文支持數組
因爲HTML代碼中存在中文,須要添加中文支持,須要把須要的字體文件添加到項目中app
三、轉換PDF主代碼ide
1 /** 2 * HTML代碼轉PDF文檔 3 * 4 * @param content 待轉換的HTML代碼 5 * @param storagePath 保存爲PDF文件的路徑 6 */ 7 @Override 8 public void parsePdf(String content, String storagePath) { 9 FileOutputStream os = null; 10 try { 11 File file = new File(storagePath); 12 if(!file.exists()) { 13 file.createNewFile(); 14 } 15 os = new FileOutputStream(file); 16 17 ITextRenderer renderer = new ITextRenderer(); 18 //解決中文支持問題 19 ITextFontResolver resolver = renderer.getFontResolver(); 20 resolver.addFont("/static/font/ARIALUNI.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED); 21 renderer.setDocumentFromString(content); 22 // 解決圖片的相對路徑問題,圖片路徑必須以file開頭 23 // renderer.getSharedContext().setBaseURL("file:/"); 24 renderer.layout(); 25 renderer.createPDF(os); 26 27 } catch (DocumentException e) { 28 e.printStackTrace(); 29 } catch (IOException e) { 30 e.printStackTrace(); 31 }finally { 32 if(null != os) { 33 try { 34 os.close(); 35 } catch (IOException e) { 36 e.printStackTrace(); 37 } 38 } 39 } 40 }
四、若是從文件中讀取HTML代碼,須要使用InputStream進行讀取,不要使用FileReader讀取,不知道爲何,使用FileReader讀取的內容解析會錯誤字體
1 StringBuilder content = new StringBuilder(); 2 byte[] bys = new byte[1024]; 3 int len; 4 in = new BufferedInputStream(new FileInputStream(htmlFilePath)); 5 while ((len = in.read(bys)) != -1) { 6 content.append(new String(bys, 0, len)); 7 }
五、若是想把生成PDF內容返回爲byte數組,能夠在調用renderer.createPDF(os)方法時,傳入的是ByteArrayOutputStream,而後調用輸出流的toByteArray便可。ui