-
關于jar包
<dependency> <groupId>org.xhtmlrenderer</groupId> <artifactId>flying-saucer-pdf-itext5</artifactId> <version>9.1.18</version> </dependency>
如果只是html通過url或字符串來轉換成pdf的話荒叶,只需要上面一個jar足矣嗦哆。有時候項目比較龐大引入的jar比較多的時候,可能會跟別的jar起沖突壳快,我就遇到過flying-saucer-pdf-itext5的9.1.0及以上的版本出現jar沖突而9.1.0以下的版本不會沖突的情況菜皂,如果沖突了就得指定特定的路徑贞绵,比如:
System.setProperty("javax.xml.transform.TransformerFactory",
"com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl");
System.setProperty("javax.xml.parsers.DocumentBuilderFactory",
"com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl");
關于中文不換行的問題
在flying-saucer-pdf-itext5的9.0.6及以下版本,中文是不會換行的恍飘,在網上說需要程序自己拼接\n或者修改源碼org.xhtmlrenderer.layout.Breaker.java榨崩。但其實,在flying-saucer-pdf-itext5的9.0.7及以上版本就已經支持中文換行了章母,不需要這么麻煩自己造輪子蜡饵。-
關于中文字體問題
使用itext轉pdf是需要安裝中文字體庫的,不然中文顯示不出來胳施,在itext里面有多種引入字體的方式溯祸,其中html通過字符串轉pdf的,使用以下方式引入字體庫舞肆。并且在前端樣式中加入font-family:SimSun;
焦辅,即可顯示中文。如果是linux系統(tǒng)中椿胯,可以路徑改成/usr/share/fonts/chinese/simsun.ttc(linux中默認是沒有字體庫的哦筷登,需要自己安裝)。String path = "c:/Windows/Fonts/simsun.ttc"; ITextFontResolver fontResolver = renderer.getFontResolver(); fontResolver.addFont(path, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
關于紙張大小哩盲、換頁
其實紙張大小和換行其中一個方式可以用樣式來指定紙張大小和換頁的前方。
比如指定紙張大小為a4橫向排版、并且邊距為0的樣式:
@page{size:297mm 210mm;margin:0;padding:0;margin:0}
換頁樣式:.pageNext{page-break-after:always;}
廉油,
在需要換行的位置加入前端代碼<div class='pageNext'></div>
惠险,即可換頁。關于引入的css樣式是否需要加絕對路徑問題
很多時候抒线,前端的樣式引入是可能用相對路徑的班巩,但pdf轉換的時候是必須用絕對路徑的,那就要么讓前端把根路徑加上嘶炭,又或者我們在程序里面把link標簽拎出來遍歷給它們加上根路徑抱慌,但其實還有一種方式,也就是flying-saucer-pdf提供的一個方法renderer.setDocumentFromString(html,baseUrl)
也是能達到效果眨猎,不需要我們事先加好根路徑抑进。關于樣式失效問題
樣式在瀏覽器看起來可能正常,但轉成pdf的時候可能失效睡陪。這時候可能是該插件不支持這種樣式寺渗,也可能是該頁面多個樣式沖突了夕凝。其他問題
該轉換方式的html必須是靜態(tài)化的,該轉換方式對html的檢查非常嚴格户秤,必須使用閉合的標簽码秉,否則報錯。完整的代碼實現方式:
package itext.html2pdf;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.pdf.BaseFont;
import org.xhtmlrenderer.pdf.ITextFontResolver;
import org.xhtmlrenderer.pdf.ITextRenderer;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
public class PDFUtil {
/**
* 通過html的字符串轉pdf
* @param out
* @param html
* @throws IOException
* @throws DocumentException
*/
public static void createPdfByHtml(OutputStream out, String html) throws IOException, DocumentException {
ITextRenderer renderer = new ITextRenderer();
renderer.setDocumentFromString(html);
// 解決中文支持問題
ITextFontResolver fontResolver = renderer.getFontResolver();
fontResolver.addFont("c:/Windows/Fonts/simsun.ttc", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
renderer.layout();
renderer.createPDF(out);
}
/**
* 通過html的文件路徑轉pdf
* @param out
* @param htmlFilePath
* @throws IOException
* @throws DocumentException
*/
public static void createPdfByUrl(OutputStream out,String htmlFilePath) throws IOException, DocumentException{
ITextRenderer renderer = new ITextRenderer();
String url = new File(htmlFilePath).toURI().toURL().toString();
renderer.setDocument(url);
// 解決中文支持問題
ITextFontResolver fontResolver = renderer.getFontResolver();
fontResolver.addFont("c:/Windows/Fonts/simsun.ttc", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
//解決圖片的相對路徑問題
//renderer.getSharedContext().setBaseURL("http://localhost:8080");//file:/e:/
renderer.layout();
renderer.createPDF(out);
}
}