亲测代码没有问题,需要注意细节已经标注;需要jar包:iText-2.0.8.jar;core-renderer-R8.jar;

core-renderer-R8.jar下载地址:http://central.maven.org/maven2/org/xhtmlrenderer/core-renderer/R8/core-renderer-R8.jar

iText-2.0.8.jar下载地址:http://central.maven.org/maven2/com/lowagie/itext/2.0.8/itext-2.0.8.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) {
} }

  

最新文章

  1. .NET程序员细数Oracle与众不同的那些奇葩点
  2. webservice通信调用天气预报接口实例
  3. asp.net identity 2.2.0 中角色启用和基本使用(二)
  4. 检测WCF服务是否在线第二版
  5. 原来今天是感恩节-Linux基础继续&MySQL和PHP
  6. 理解android.intent.action.MAIN 与 android.intent.category.LAUNCHER
  7. Visual Studio工具栏中无法选择调试设备
  8. Webstorm & PhpStorm
  9. 封装application类
  10. SharePoint开发 - 自定义页面(错误页、登出页)
  11. 针对无线信道衰落特性分析3G,4G,5G的关键技术异同点
  12. hdu 4335 What is N?
  13. 完美高仿精仿京东商城手机客户端android版源码
  14. samba和squid 安装
  15. HTML文档类型
  16. B - 瑶瑶带你玩激光坦克
  17. groupbox 下的datagridview的列标题字体修改混乱
  18. Grafana4.2安装
  19. Oracle之SQL优化专题01-查看SQL执行计划的方法
  20. Exp3 免杀原理和实践

热门文章

  1. Thread.Sleep(0)
  2. New API
  3. MySQL event调度
  4. 蒟蒻Orion还要学的东西!
  5. POJ3057:Evacuation——题解
  6. BZOJ3994:[SDOI2015]约数个数和——题解
  7. 洛谷 P4555 [国家集训队]最长双回文串 解题报告
  8. HUD.2544 最短路 (Dijkstra)
  9. bzoj 4725 [POI2017]Reprezentacje ró?nicowe 暴力
  10. 数据分析侠A的成长故事