博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
pdf文件之itextpdf插入html内容以及中文解决方案
阅读量:5138 次
发布时间:2019-06-13

本文共 4180 字,大约阅读时间需要 13 分钟。

简述

目前网上已经有很多种html文件直接转pdf的技术帖子,但是很少有直接将部分html作为段落插入到pdf中,而且也没有一个可以很好的解决中文显示的问题。

因此今天上午围绕这个问题进行了研究,把解决方案分享给大家。

itextpdf基础操作请访问:http://www.cnblogs.com/mvilplss/p/5640598.html

感谢:

实现思路

如果想插入html片段,我们使用一个类的静态方法:

1         String html = "
你好世界!hello world !
";2 Paragraph context = new Paragraph();3 ElementList elementList =XMLWorkerHelper.parseToElementList(htmlString, null);4 for (Element element : elementList) {5 context.add(element);6 }7 document.add(context);

不过你会发现不能显示中文,这个问题网上有很多种解决方法,但是都不好使。

查看XMLWorkerHelper.parseToElementList(htmlString, null)这个方法的源码,发现

CssAppliers cssAppliers = new CssAppliersImpl(FontFactory.getFontImp());可以进行字体的更换。
1 public static ElementList parseToElementList(String html, String css) throws IOException { 2         // CSS 3         CSSResolver cssResolver = new StyleAttrCSSResolver(); 4         if (css != null) { 5             CssFile cssFile = XMLWorkerHelper.getCSS(new ByteArrayInputStream(css.getBytes())); 6             cssResolver.addCss(cssFile); 7         } 8          9         // HTML10         CssAppliers cssAppliers = new CssAppliersImpl(FontFactory.getFontImp());//这里可以下手对字体进行操作11         HtmlPipelineContext htmlContext = new HtmlPipelineContext(cssAppliers);12         htmlContext.setTagFactory(Tags.getHtmlTagProcessorFactory());13         htmlContext.autoBookmark(false);14         15         // Pipelines16         ElementList elements = new ElementList();17         ElementHandlerPipeline end = new ElementHandlerPipeline(elements, null);18         HtmlPipeline htmlPipeline = new HtmlPipeline(htmlContext, end);19         CssResolverPipeline cssPipeline = new CssResolverPipeline(cssResolver, htmlPipeline);20         21         // XML Worker22         XMLWorker worker = new XMLWorker(cssPipeline, true);23         XMLParser p = new XMLParser(worker);24         p.parse(new ByteArrayInputStream(html.getBytes()));25         26         return elements;27     }

因此我们就想到重写XMLWorkerFontProvider类的getFont(*)方法,对于没有显示声明css样式的字体,默认使用undefine字体样式进行设置默认字体。

1 public class MyXMLWorkerHelper { 2     public static class MyFontsProvider extends XMLWorkerFontProvider { 3         public MyFontsProvider() { 4             super(null, null); 5         } 6  7         @Override 8         public Font getFont(final String fontname, String encoding, float size, final int style) { 9 10             String fntname = fontname;11             if (fntname == null) {12                 fntname = "宋体";13             }14             return super.getFont(fntname, encoding, size, style);15         }16     }17 18     public static ElementList parseToElementList(String html, String css) throws IOException {19         // CSS20         CSSResolver cssResolver = new StyleAttrCSSResolver();21         if (css != null) {22             CssFile cssFile = XMLWorkerHelper.getCSS(new ByteArrayInputStream(css.getBytes()));23             cssResolver.addCss(cssFile);24         }25 26         // HTML27         MyFontsProvider fontProvider = new MyFontsProvider();28         CssAppliers cssAppliers = new CssAppliersImpl(fontProvider);29         HtmlPipelineContext htmlContext = new HtmlPipelineContext(cssAppliers);30         htmlContext.setTagFactory(Tags.getHtmlTagProcessorFactory());31         htmlContext.autoBookmark(false);32 33         // Pipelines34         ElementList elements = new ElementList();35         ElementHandlerPipeline end = new ElementHandlerPipeline(elements, null);36         HtmlPipeline htmlPipeline = new HtmlPipeline(htmlContext, end);37         CssResolverPipeline cssPipeline = new CssResolverPipeline(cssResolver, htmlPipeline);38 39         // XML Worker40         XMLWorker worker = new XMLWorker(cssPipeline, true);41         XMLParser p = new XMLParser(worker);42         html = html.replace("
", "").replace("

", "").replace("", "").replace("", "")43 .replace("
", "");44 p.parse(new ByteArrayInputStream(html.getBytes()));45 46 return elements;47 }48 49 }

因为XMLWork不支持html的单标签,所以要对但标签进行过滤。不然就会报错:Invalid nested tag div found, expected closing tag br

 

转载于:https://www.cnblogs.com/mvilplss/p/5646675.html

你可能感兴趣的文章
为不同浏览器创建XMLHttpRequest对象
查看>>
安装关系型数据库MySQL 安装大数据处理框架Hadoop
查看>>
了解字串和数值比较间的差异
查看>>
微信小程序-1
查看>>
python运算符1
查看>>
步步为营-70-asp.net简单练习(文件的上传和下载)
查看>>
操作系统内存管理机制
查看>>
thinkphp学习2
查看>>
Istio技术与实践03:最佳实践之sidecar自动注入
查看>>
[HDU](1257)最少拦截系统 ---贪心
查看>>
Volly框架的使用基础版及使用中的一些坑 Ace 网络篇(三)
查看>>
typeScrip(五)泛型
查看>>
Linux 压缩认识误区
查看>>
ehcache.xml配置参数
查看>>
DexClassLoader和PathClassLoader类载入机制
查看>>
python基础_MySQL的bigint类型
查看>>
python_并发与通信
查看>>
JavaScript-String基础知识
查看>>
PNPoly算法代码例子,判断一个点是否在多边形里面
查看>>
gprc-java与golang分别实现服务端,客户端,跨语言通信(二.golang实现)
查看>>