工具类:

 package test;

 import java.io.IOException ;
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 com.lowagie.text.BadElementException ;
import com.lowagie.text.Image ;
import com.lowagie.text.pdf.codec.Base64 ; public class B64ImgReplacedElementFactory 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图像
*
* @param srcAttr 属性
* @param uac 回调
* @return FSImage
* @throws IOException io异常
* @throws BadElementException BadElementException
*/
protected FSImage buildImage(String srcAttr, UserAgentCallback uac) throws IOException,
BadElementException {
FSImage fsImage;
if (srcAttr.startsWith("data:image/")) {
String b64encoded = srcAttr.substring(srcAttr.indexOf("base64,") + "base64,".length(),
srcAttr.length());
// 解码
byte[] decodedBytes = Base64.decode(b64encoded); fsImage = new ITextFSImage(Image.getInstance(decodedBytes));
} else {
fsImage = uac.getImageResource(srcAttr).getImage();
}
return fsImage;
} /**
* 实现reset
*/
public void reset() {
} @Override
public void remove(Element arg0) {} @Override
public void setFormSubmissionListener(FormSubmissionListener arg0) {}
}

生成pdf时:

 // 解决base64图片支持问题
sharedContext.setReplacedElementFactory(new B64ImgReplacedElementFactory());
sharedContext.getTextRenderer().setSmoothingThreshold(0);
renderer.setDocumentFromString(strFileContent);

最新文章

  1. sqlmap注入小结
  2. 安装Eclipse插件
  3. 【PHP代码审计】 那些年我们一起挖掘SQL注入 - 8.全局防护盲点的总结下篇
  4. 跳出if判断
  5. 水仙花数 java 实现
  6. CentOS中TFTP配置
  7. 《Principles of Mathematical Analysis》-chaper1-实数系与复数系
  8. Matlab:拟合(2)
  9. db2 xml 转 table【XQuery系列】
  10. DDD分层架构之我见
  11. SpringMvc处理post请求乱码的filter
  12. python学习笔记之列表与元组
  13. webpack2学习日志
  14. Python学习之--socket续集
  15. docker入门(一)
  16. H3C单臂路由配置
  17. C# IEnumerable 和 IEnumerator接口浅析
  18. 计算机网络Web应用层与运输层(HTTP/TCP)
  19. .net core dump分析
  20. 我的vim插件配置

热门文章

  1. hzau 1209 Deadline(贪心)
  2. javascript常用的数组操作
  3. Asp.Net MVC session跨域
  4. ASP.NET MVC中加入Web Forms
  5. L116
  6. 每天一个linux命令(15):head命令
  7. swing之borderlayout
  8. 基于Python语言使用RabbitMQ消息队列(一)
  9. Maven实现直接部署Web项目到Tomcat7
  10. CAS单点登录系统简介