为什么80%的码农都做不了架构师?>>>   hot3.png

itextpdf 实现html转pdf中中文及图片base64的解决方法:

1. 中文解决方案:

实现FontProvider接口:

package com.mumu.image2pdf;import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Font;
import com.itextpdf.text.FontProvider;
import com.itextpdf.text.pdf.BaseFont;public class MyFontProvider implements FontProvider {private BaseColor bc;private String fontname;private String encoding;private boolean embedded;private boolean cached;private float size;private int style;private BaseFont baseFont;public MyFontProvider() {}public BaseColor getBc() {return bc;}public void setBc(BaseColor bc) {this.bc = bc;}public String getFontname() {return fontname;}public void setFontname(String fontname) {this.fontname = fontname;}public String getEncoding() {return encoding;}public void setEncoding(String encoding) {this.encoding = encoding;}public boolean isEmbedded() {return embedded;}public void setEmbedded(boolean embedded) {this.embedded = embedded;}public boolean isCached() {return cached;}public void setCached(boolean cached) {this.cached = cached;}public float getSize() {return size;}public void setSize(float size) {this.size = size;}public int getStyle() {return style;}public void setStyle(int style) {this.style = style;}public BaseFont getBaseFont() {return baseFont;}public void setBaseFont(BaseFont baseFont) {this.baseFont = baseFont;}public MyFontProvider(BaseColor bc, String fontname, String encoding, boolean embedded, boolean cached, float size,int style, BaseFont baseFont) {super();this.bc = bc;this.fontname = fontname;this.encoding = encoding;this.embedded = embedded;this.cached = cached;this.size = size;this.style = style;this.baseFont = baseFont;}@Overridepublic Font getFont(String arg0, String arg1, boolean arg2, float arg3, int arg4, BaseColor arg5) {Font font = null;if (baseFont == null) {font = new Font();} else {font = new Font(baseFont);}font.setColor(arg5);font.setFamily(fontname);font.setSize(size);font.setStyle(arg4);return font;}@Overridepublic boolean isRegistered(String arg0) {// TODO Auto-generated method stubreturn true;}
}

2. 图片base64的dataurl显示问题解决:

实现com.itextpdf.tool.xml.html.Image类

package com.mumu.image2pdf;import java.util.ArrayList;
import java.util.List;
import java.util.Map;import com.itextpdf.text.Chunk;
import com.itextpdf.text.Element;
import com.itextpdf.text.Image;
import com.itextpdf.text.pdf.codec.Base64;
import com.itextpdf.tool.xml.NoCustomContextException;
import com.itextpdf.tool.xml.Tag;
import com.itextpdf.tool.xml.WorkerContext;
import com.itextpdf.tool.xml.exceptions.RuntimeWorkerException;
import com.itextpdf.tool.xml.html.HTML;
import com.itextpdf.tool.xml.pipeline.html.HtmlPipelineContext;public class ImageTagProcessor extends com.itextpdf.tool.xml.html.Image {/** (non-Javadoc)* * @see com.itextpdf.tool.xml.TagProcessor#endElement(com.itextpdf.tool.xml.Tag, java.util.List, com.itextpdf.text.Document)*/@Overridepublic List<Element> end(final WorkerContext ctx, final Tag tag, final List<Element> currentContent) {final Map<String, String> attributes = tag.getAttributes();String src = attributes.get(HTML.Attribute.SRC);List<Element> elements = new ArrayList<Element>(1);if (null != src && src.length() > 0) {Image img = null;if (src.startsWith("data:image/")) {final String base64Data = src.substring(src.indexOf(",") + 1);try {img = Image.getInstance(Base64.decode(base64Data));} catch (Exception e) {throw new I18NIllegalArgumentException(e);}if (img != null) {try {final HtmlPipelineContext htmlPipelineContext = getHtmlPipelineContext(ctx);elements.add(getCssAppliers().apply(new Chunk((com.itextpdf.text.Image) getCssAppliers().apply(img, tag, htmlPipelineContext), 0, 0, true), tag,htmlPipelineContext));} catch (NoCustomContextException e) {throw new RuntimeWorkerException(e);}}}if (img == null) {elements = super.end(ctx, tag, currentContent);}}return elements;}
}

3. 转换方法:

public void html2pdf(String html, File file) throws I18NIllegalArgumentException {try {// step 1Document document = new Document();BaseFont bfChinese;bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", false);MyFontProvider myFontProvider = new MyFontProvider(BaseColor.BLACK, "", "", false, false, 16, 1, bfChinese);// step 2PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(file));// step 3document.open();final TagProcessorFactory tagProcessorFactory = Tags.getHtmlTagProcessorFactory();tagProcessorFactory.removeProcessor(HTML.Tag.IMG);tagProcessorFactory.addProcessor(new ImageTagProcessor(), HTML.Tag.IMG);final CssFilesImpl cssFiles = new CssFilesImpl();cssFiles.add(XMLWorkerHelper.getInstance().getDefaultCSS());final StyleAttrCSSResolver cssResolver = new StyleAttrCSSResolver(cssFiles);final HtmlPipelineContext hpc = new HtmlPipelineContext(new CssAppliersImpl(myFontProvider));hpc.setAcceptUnknown(true).autoBookmark(true).setTagFactory(tagProcessorFactory);final HtmlPipeline htmlPipeline = new HtmlPipeline(hpc, new PdfWriterPipeline(document, writer));final Pipeline<?> pipeline = new CssResolverPipeline(cssResolver, htmlPipeline);final XMLWorker worker = new XMLWorker(pipeline, true);final Charset charset = Charset.forName("UTF-8");final XMLParser xmlParser = new XMLParser(true, worker, charset);ByteArrayInputStream bais = new ByteArrayInputStream(html.getBytes("UTF-8"));xmlParser.parse(bais, charset);// step 5document.close();bais.close();} catch (Exception e) {throw new I18NIllegalArgumentException(e);}}

PS:  input框等的显示还没实现,待完善

转载于:https://my.oschina.net/u/1778261/blog/809757

itextpdf 实现html转pdf中中文及图片base64的解决方法相关推荐

  1. word文档html图片不能移动,win7系统Word中插入的图片不能移动的解决方法

    很多小伙伴都遇到过win7系统Word中插入的图片不能移动的困惑吧,一些朋友看过网上零散的win7系统Word中插入的图片不能移动的处理方法,并没有完完全全明白win7系统Word中插入的图片不能移动 ...

  2. SpringMVC项目中中文字符乱码问题及解决办法总结(非专业最优解决办法) -- ajax传值乱码; request.getParameter()乱码;

    SpringMVC项目中中文字符乱码问题及解决办法总结(非专业最优解决办法) -- ajax传值乱码; request.getParameter()乱码; 参考文章: (1)SpringMVC项目中中 ...

  3. java.net.url 中文乱码_asp.net URL中包含中文参数造成乱码的解决方法

    asp.net URL中包含中文参数造成乱码的解决方法 更新时间:2010年03月08日 21:44:27   作者: 中文乱码一直以来是WEB开发中比较常见的问题之一,对于初学者来说,各种各样的编码 ...

  4. 图片提取利器,从PDF中快速提取图片并存储到本地

    PDF是日常生活中经常使用的文件格式,里面可能包含着重要的文字信息和图片资源.然而当需要提取PDF中的图片时,往往需要使用复杂的工具.图片提取利器能够帮助你从PDF中快速提取图片并存储到本地. # c ...

  5. Java解析PDF文件(PDFBOX、itext解析PDF)导出PDF中的子图片,去除PDF中的水印

    前段时间,为了解析PDF,花了不少时间去学习PDFbox和itext,这两个都是处理PDF的开源库,有java和C#的.作为一个刚开始学习这两个开源库的,感觉百度上的资源还是太少了.我做的是一个关于P ...

  6. php模糊搜索慢怎么办,MySQL中文模糊检索问题的解决方法_php

    mysql中文模糊检索问题的解决方法 来源:林兴陆 在 MySQL 下,在进行中文模糊检索时,经常会返回一些与之不相关的 记录,如查找 "-0x1.ebea4bfbffaacp-4%&quo ...

  7. java 转换gbk编码,java中GBK转UTF-8乱码的解决方法

    java中GBK转UTF-8乱码的解决方法 如果自己采用的是GBK编码,对方采用得到是UTF-8编码,发送数据时需要将GBK编码数据转换成UTF-8编码数据,这样对方才不会乱码. 问题出现:GBK转U ...

  8. win10 oracle11g 乱码,win10系统下载中文文件出现乱码的解决方法

    将windows7系统升级到windows10正式版后,发现即使自己将系统显示语言改为中文,在用浏览器下载某些中文文件时候,下载的文件名及文件内容仍会出现乱码的情况.这是怎么回事呢?其实,该问题是用户 ...

  9. php 日文中文乱码,phpgd库中文乱码的产生与解决方法详解 || mao的博客

    在php jpgraph安装教程之验证php环境是否支持jpgraph安装方法的php教程中我提到了gd库的验证,对于jpgraph中文使用者来说使用 jpgraph时不产生中文乱码是非常必要的,而g ...

最新文章

  1. 【青少年编程】【二级】货运飞船
  2. python常用字符大全_python字符串,列表,字典,集合的常用方法
  3. 怎么用mysql存储系统数据库_mysql数据库之基本操作和存储引擎
  4. android复选框不选中无法点击按钮,Android-Listveiw的checkbox,Button焦点问题
  5. linux 下 安装 matplotlib 版本依赖(旧版本)
  6. 个人管理 - Learn More,Study Less!
  7. html5 audio js控制进度,HTML5 audio标签使用js进行播放控制实例
  8. hdu 2993 MAX Average Problem 斜率优化DP
  9. MyCat分片规则之取模范围分片
  10. 通俗理解什么是隐马尔科夫模型(hmm)
  11. 关于国内几大云计算平台
  12. 教领导“做事”的新人,后来过得好吗?
  13. single-spa
  14. 学期总结(思维导图)
  15. 2-2日期时间类型基础
  16. 购物车列表加载商品信息及商品增减功能(Ajax+jQuery)
  17. 黑龙江省力推互联网与畜牧产业深度融合 打造大数据中心
  18. CentOS7 安装 CMake 解决 cmake command not found 问题
  19. 下载百度排行榜音乐的程序(Perl)
  20. P1618 三连击(升级版)C语言

热门文章

  1. v-viewer图片打不开一直在刷新_网速很慢甚至打不开?广告弹窗太多了?有效提升网络质量的方法。...
  2. python写web自动化_jenkins+selenium+python实现web自动化测试
  3. thinkphp3.2.3漏洞_Chrome新版本修复CVE202015999 0 day漏洞
  4. java怎么预加载字典值,有选择地显示预加载内容提高网站的性能
  5. 杭电计算机研究院排名,2020浙江省大学最新10强排名,浙大第1,杭电第5
  6. 数木桩的c语言编程,Vijos P1007 绕钉子的长绳子 C语言版
  7. python stackless_Stackless Python的缺点是什么?
  8. dcdc芯片效率不高的原因_电动汽车DCDC变换器应用详解
  9. python compile
  10. StereoPannerNode