pdf文件之itextpdf插入html内容以及中文解决方案

简述

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

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

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

感谢:http://gridmix.blog.51cto.com/4764051/1229585

实现思路

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

1         String html = "<div style=‘color:green;font-size:20px;‘>你好世界!hello world !</div>";
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         // HTML
10         CssAppliers cssAppliers = new CssAppliersImpl(FontFactory.getFontImp());//这里可以下手对字体进行操作
11         HtmlPipelineContext htmlContext = new HtmlPipelineContext(cssAppliers);
12         htmlContext.setTagFactory(Tags.getHtmlTagProcessorFactory());
13         htmlContext.autoBookmark(false);
14
15         // Pipelines
16         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 Worker
22         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         // CSS
20         CSSResolver cssResolver = new StyleAttrCSSResolver();
21         if (css != null) {
22             CssFile cssFile = XMLWorkerHelper.getCSS(new ByteArrayInputStream(css.getBytes()));
23             cssResolver.addCss(cssFile);
24         }
25
26         // HTML
27         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         // Pipelines
34         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 Worker
40         XMLWorker worker = new XMLWorker(cssPipeline, true);
41         XMLParser p = new XMLParser(worker);
42         html = html.replace("<br>", "").replace("<hr>", "").replace("<img>", "").replace("<param>", "")
43                 .replace("<link>", "");
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

时间: 2024-10-12 01:24:13

pdf文件之itextpdf插入html内容以及中文解决方案的相关文章

PDF文件中如何插入对象

在已有的文本中插入对象,是一种非常常见的编辑技巧.放在Word文档中,我相信大多数的人都会轻松搞定这个问题.但如果在PDF文档中去插入自己想要的对象的话,很多人就会纳闷了,难道PDF还可以进行编辑?别不相信,现在我们只要使用专门的pdf编辑器早就可以对PDF进行编辑了. 捷速PDF编辑器就是这样的一款软件,帮助我们解决各种PDF的编辑问题.捷速PDF编辑器是一款体积小,功能强大的软件,专业的PDF编辑器能使用户如同操作Office系列软件一样去创建和编辑PDF文件,捷速就完全能做到.软件不仅支持

PDF文件的内容怎样编辑修改

现在办公总是会遇到各种格式的文档需要编辑修改,office的一些文档是最常见的,使用也比较频繁,但是像pdf这种格式的文档对于我们却不常见的,如果遇到这种格式的文档我们该怎样去编辑呢. 要编辑修改PDF文件的内容要先确定pdf文件是否能够编辑,一般扫描形成的PDF文件是图片类型的内容,所以无法编辑.而受加密保护的文档需要先去除密码后才可进行正常编辑. 用PDF编辑器打开PDF文件,通过页面缩略图选择需要编辑的文档页面,然后在编辑区域可以对该页面的内容进行编辑修改. pdf的文字是在文本框中直接编

如何把PDF文件内容转换成TXT

PDF格式文档的兴起使得现在很多文档都用PDF格式进行传递一些文档资料内容,如果拿到这种格式的文档,需要用到里面的一些文本内容,有些人就会进行复制粘贴了,但是如果需要的文本内容比较多,显然一页一页的复制操作是很浪费时间的,如果要将PDF文本内容提取出来可以直接将文件转换为txt格式就可以了. 一般我们查看PDF文件都会用的Adobe Reader,这个不仅可以查看PDF文档的内容,也能将里面的文本内容单独提取出来.所以在需要里面文本内容的时候就不需要再用复制粘贴的方法了. 首先用Adobe Re

利用iText导出pdf文件

一.导出pdf工具类:  package pdf; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import j

如何进行PDF文件翻译?

?   相信转换文件格式对大家来说现在不是稀奇的事,使用转换工具就能够轻松的解决了.那么可以将电脑中的PDF文件内容翻译为其它的语言.就比如说将PDF文件内的中文翻译成英文的话可以不,现在电脑中只要有PDF转换工具就可以了,如何进行PDF操作呢? 1.如何进行到PDF文件翻译呢?首先我们可以在电脑上安装一款PDF翻译的软件,在浏览器中搜索关键词PDF翻译工具迅捷PDF转换器进行安装. 2.安装好后,双击运行软件.进入到操作主页面,进行的是PDF文件翻译,鼠标点击选择"特色功能"这个栏目

javaWeb项目springMVC框架下利用ITextpdf 工具打印PDF文件的方法(打印表单、插入图片)

方法一:打印PDF表单以及在PDF中加入图片 需要的资料: jar包:iTextAsian.jar ,itext-2.1.7.jar: 源码: 1 public static void main(String args[]) throws IOException, DocumentException { 2 String fileName = "D:/testPDF.pdf"; // pdf模板 3 InputStream input = new FileInputStream(new

【使用Itext处理PDF文档(新建PDF文件、修改PDF文件、PDF中插入图片、将PDF文件转换为图片)】

iText简介 iText是著名的开放源码的站点sourceforge一个项目,是用于生成PDF文档的一个java类库.通过iText不仅可以生成PDF或rtf的文档,而且可以将XML.Html文件转化为PDF文件. iText的安装非常方便,下载iText.jar文件后,只需要在系统的CLASSPATH中加入iText.jar的路径,在程序中就可以使用iText类库了. 1.包的引用 1 import java.io.FileNotFoundException; 2 import java.i

java操作office和pdf文件java读取word,excel和pdf文档内容

在平常应用程序中,对office和pdf文档进行读取数据是比较常见的功能,尤其在很多web应用程序中.所以今天我们就简单来看一下Java对word.excel.pdf文件的读取.本篇博客只是讲解简单应用.如果想深入了解原理.请读者自行研究一些相关源码. 首先我们来认识一下读取相关文档的jar包: 1. 引用POI包读取word文档内容 poi.jar 下载地址 http://apache.freelamp.com/poi/release/bin/poi-bin-3.6-20091214.zip 

PDF编辑器怎么编辑修改PDF文件的内容

刚接触pdf这种格式的文档时,发现打开文档后不能对文件的内容进行编辑修改,最后才知道有pdf阅读器和pdf编辑器,通常pdf文档默认都是以阅读器来打开文档的,所以只能查看,无法编辑.但是发现用编辑器打开文档后,文件还是不能进行编辑,这是为什么呢? PDF其他格式的文档一样,被加密后是无法进行编辑的,有些pdf文件则是由扫描后的图片形成的文件,这样的文档内容都是图片对象,无法像文本内容那样进行编辑. 另外用pdf编辑器打开pdf文件后,文档处于浏览的方式,不能直接插入光标进行输入编辑等操作. 当点