親測代碼沒有問題,需要注意細節已經標注;需要jar包:iText-2.0.8.jar;core-renderer-R8.jar;
import com.lowagie.text.pdf.BaseFont;
import org.xhtmlrenderer.pdf.ITextFontResolver;
import org.xhtmlrenderer.pdf.ITextRenderer;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
public class HtmlToPDF {
public static void main(String[] args) throws Exception {
htmlToPdf("C://Users//Administrator//Desktop//20181001.pdf","C://Users//Administrator//Desktop//xse//newFile.html");
}
/**
* 把URL轉換為PDF
* @param outputFile
* , 示例:/data/fs/inspector/BJ20150522001.pdf
* @param url
* ,示例:http :xxxx
* @return
* @throws Exception
*/
public static void htmlToPdf(String outputFile, String url)throws Exception {
try{
OutputStream os = new FileOutputStream(outputFile);
ITextRenderer renderer = new ITextRenderer();
// 如果攜帶圖片則加上以下代碼,將圖片標簽轉換為Itext自己的圖片對象
renderer.getSharedContext().setReplacedElementFactory(new Base64ImgReplacedElementFactory());
renderer.getSharedContext().getTextRenderer().setSmoothingThreshold(0);
//String fontPath = HtmlToPDF.class.getClassLoader().getResource("").toString().replaceAll("file:/", "C:\\Users\\Administrator\\Downloads\\simsunttc\\") + "simsun.ttc";
// 解決中文支持問題 字體必須名稱必須和前台頁面的大小寫一直(simsun 區分大小寫)
String fontPath="C:\\Users\\Administrator\\Downloads\\simsunttc\\simsun.ttc";
ITextFontResolver fontResolver = renderer.getFontResolver();
fontResolver.addFont(fontPath, BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);
url=new File(url).toURI().toURL().toString();
renderer.setDocument(url);
//解決圖片相對路徑問題,window 上必須用file:/; 后面路徑只寫到img標簽中src的上級目錄
renderer.getSharedContext().setBaseURL("file:/C:/Users/Administrator/Desktop/xse/");
renderer.layout();
renderer.createPDF(os);
os.flush();
os.close();
}catch(Exception e ){
e.printStackTrace();
}
}
}
import com.lowagie.text.BadElementException;
import com.lowagie.text.Image;
import com.lowagie.text.pdf.codec.Base64;
import org.w3c.dom.Element;
import org.xhtmlrenderer.extend.FSImage;
import org.xhtmlrenderer.extend.ReplacedElement;
import org.xhtmlrenderer.extend.ReplacedElementFactory;
import org.xhtmlrenderer.extend.UserAgentCallback;
import org.xhtmlrenderer.layout.LayoutContext;
import org.xhtmlrenderer.pdf.ITextFSImage;
import org.xhtmlrenderer.pdf.ITextImageElement;
import org.xhtmlrenderer.render.BlockBox;
import org.xhtmlrenderer.simple.extend.FormSubmissionListener;
import java.io.IOException;
/**
* * 圖片base64支持,把圖片轉換為itext自己的圖片對象
* * @author Administrator
* *
*
*/
public class Base64ImgReplacedElementFactory implements ReplacedElementFactory {
/**
* * 實現createReplacedElement 替換html中的Img標簽
* *
* * @param c 上下文
* * @param box 盒子
* * @param uac 回調
* * @param cssWidth css寬
* * @param cssHeight css高
* * @return ReplacedElement
*
*/
public ReplacedElement createReplacedElement(LayoutContext c, BlockBox box, UserAgentCallback uac,int cssWidth, int cssHeight) {
Element e = box.getElement();
if (e == null) {
return null;
}
String nodeName = e.getNodeName();
// 找到img標簽
if (nodeName.equals("img")) {
String attribute = e.getAttribute("src");
FSImage fsImage;
try {
// 生成itext圖像
fsImage = buildImage(attribute, uac);
} catch (BadElementException e1) {
fsImage = null;
} catch (IOException e1) {
fsImage = null;
}
if (fsImage != null) {
// 對圖像進行縮放
if (cssWidth != -1 || cssHeight != -1) {
fsImage.scale(cssWidth, cssHeight);
}
return new ITextImageElement(fsImage);
}
}
return null;
}
/**
* * 編解碼base64並生成itext圖像
*
*/
protected FSImage buildImage(String srcAttr, UserAgentCallback uac) throws IOException,
BadElementException {
FSImage fiImg = null;
if (srcAttr.toLowerCase().startsWith("data:image/")) {
String base64Code = srcAttr.substring(srcAttr.indexOf("base64,") + "base64,".length(), srcAttr.length());
// 解碼
byte[] decodedBytes = Base64.decode(base64Code);
fiImg = new ITextFSImage(Image.getInstance(decodedBytes));
} else {
fiImg = uac.getImageResource(srcAttr).getImage();
}
return fiImg;
}
public void reset() {
}
@Override
public void remove(Element arg0) {
}
@Override
public void setFormSubmissionListener(FormSubmissionListener arg0) {
}
}