目录:
- 介绍
- 中文字符转换
- 转换效果
[一]、介绍
XML Worker是辅助iText用于把XML、XHTML转换PDF的一个开源的软件工具库,详细介绍可以参见下面的链接:
- 官网地址:http://sourceforge.net/projects/xmlworker/
- 在线转换的Demo:http://demo.itextsupport.com/xmlworker/
- 在线文档:http://demo.itextsupport.com/xmlworker/itextdoc/index.html
- 在线文档:http://demo.itextsupport.com/xmlworker/itextdoc/flatsite.html
[二]、中文字符问题
如果HTML文件中包含中文字符,在转换成PDF是会无法显示,简单看了下它的源码,发现XML Worker无法设置默认字体,只好修改它的部分源码实现中文字符的转换。
附件提供修改后的lib包下载:xmlworker-1.2.1-micmiu.jar.zip (源码:https://github.com/micmiu/micmiu-xmlworker)
修改:com.itextpdf.tool.xml.css.apply.ChunkCssApplier.java 中的 public Chunk apply(final Chunk c, final Tag t) 这个方法,增加如下逻辑判断:
1 2 3 4 5 6 7 8 |
Font f = applyFontStyles(t); // for chinese charater display @www.micmiu.com if (null != HTMLUtils.bfCN && HTMLUtils.isChinese(c.getContent())) { f = new Font(HTMLUtils.bfCN, f.getSize(), f.getStyle(), f.getColor()); } float size = f.getSize(); ...... |
在:com.itextpdf.tool.xml.html.HTMLUtils.java 中 增加下面用于中文字符判断的方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
public static BaseFont bfCN = null; static { try { bfCN = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED); } catch (Exception e) { } } // add by Michael more see:http://www.micmiu.com private static final boolean isChinese(char c) { Character.UnicodeBlock ub = Character.UnicodeBlock.of(c); if (ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS || ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS || ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A || ub == Character.UnicodeBlock.GENERAL_PUNCTUATION || ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION || ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS) { return true; } return false; } // add by Michael more see:http://www.micmiu.com public static final boolean isChinese(String strName) { char[] ch = strName.toCharArray(); for (int i = 0; i < ch.length; i++) { char c = ch[i]; if (isChinese(c)) { return true; } } return false; } |
[三]、转换效果
演示一个简单的HTML文件:demo-cn.html
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" lang="zh-CN"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>iText xmlworker</title> </head> <body> <div> <p>[ Hello iText English ]</p> <p>[ 你好 iText 这是中文 ]</p> </div> </body> </html> |
转PDF的程序: Demo4HTMLCn.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
package com.micmiu.pdf.itext; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStreamReader; import com.itextpdf.text.Document; import com.itextpdf.text.pdf.PdfWriter; import com.itextpdf.tool.xml.XMLWorkerHelper; /** * 测试xml worker 页面包含中文字符的转换 * * @author <a href="http://www.micmiu.com">Michael Sun</a> */ public class Demo4HTMLCn { /** * @param args */ public static void main(String[] args) throws Exception { String pdfFile = "d:/test/itext/demo-htmlcn.pdf"; String htmlFile = "d:/test/itext/demo-cn.html"; Document document = new Document(); PdfWriter pdfwriter = PdfWriter.getInstance(document, new FileOutputStream(pdfFile)); pdfwriter.setViewerPreferences(PdfWriter.HideToolbar); document.open(); // html文件 InputStreamReader isr = new InputStreamReader(new FileInputStream( htmlFile), "UTF-8"); XMLWorkerHelper.getInstance().parseXHtml(pdfwriter, document, isr); document.close(); } } |
HTML页面、修改源码前 、修改源码后的效果对比图如下:
从上图可知,修改源码后,基本实现了对HTML的中文字符的支持。
本文介绍到此结束@Michael Sun.
原创文章,转载请注明: 转载自micmiu – 软件开发+生活点滴[ http://www.micmiu.com/ ]
本文链接地址: http://www.micmiu.com/opensource/expdoc/itext-xml-worker-cn/
无法支持table显示,itextpdf和itext-asian版本是哪个呢,我这无法显示table?
现在测试中文是可以了,但是英文的样式都变了,
What a beautiful world 样式上变成”W hata beautifu lw orld”,难道是是fontsize的原因?
com.itextpdf
itextpdf
5.5.10
com.itextpdf
itext-asian
5.2.0
com.itextpdf.tool
xmlworker
5.5.10
你好,我把你说的源码git下来以后打包使用,中文还是在pdf上显示不出来呢?help
感谢博主,我想请问一下,我在调用XMLWorkerHelper.getInstance().parseXHtml(pdfwriter, document, isr);时始终报java.lang.NoClassDefFoundError: com/itextpdf/text/log/LoggerFactory,求博主解答!
我在调用XMLWorkerHelper.getInstance().parseXHtml(pdfwriter, document, isr);时始终报java.lang.NoClassDefFoundError: com/itextpdf/text/log/LoggerFactory,
我也遇到了相同问题,百度无果,求解答,能不能给我的邮箱发一份解决办法,小菜再此感激不尽
楼主你好,请问一下、我按照做好的程序,之后,除了数字和英文的变量替换后是不换行的,中文可以、、有没有办法解决,英文和数字不换行的问题
特殊字符,比如●生成pdf是空白
你这个功能实在太强大了!!! 😯 😯 😯
您好,我把你的源码放上后,发现,转化后,中午和数字都没有,只有表格,是不是对html有要求啊?有qq吗,给个,急需要解决下,谢谢,发到邮箱即可。
对html 没有特别要求,只是table 中嵌套某些标签会不识别,之前有个朋友也和你一样的问题
但如果,html中有繁体中文就会乱码的。
嗯 这个要自己扩展修改的
为什么我和你一样的操作,代码也一样,jar包用的你修改好的,IText版本也是一样的,为什么中文还是不显示呢?好郁闷呢啊
你好,请问是否可以将xmlworker-1.2.1-micmiu.jar.zip 的源码也附上呢?我按照你的方法实现了一下,不知是否是版本问题,执行后没有效果。
https://github.com/micmiu/micmiu-xmlworker
您好, 我引入 jar 版本是 : 5.4.2。
修改后,将html 的转换为 element 加到 pdf 中, 但是中文字符不显示。请帮忙看一下, 谢谢啦
您好!我用的是xmlworker-5.5.1.jar,按照您的方法改了代码后不成功呢,希望您能帮帮我
苦扰了好久的问题终于解决了,谢谢大牛~
😳
为什么我试了一下不好呢
源码修改的地址:https://github.com/micmiu/micmiu-xmlworker,我用来转换blog的项目代码:https://github.com/micmiu/blog-exp-tool
可以看看
望解决:
我三个jar:itext-asian-5.1.1.jar itextpdf-5.1.2.jar xmlworker-1.2.1-micmiu.jar ,和你一样的代码,报 java.io.IOException: The document has no pages.
望解决:
我三个jar:itext-asian-5.1.1.jar itextpdf-5.1.2.jar xmlworker-1.2.1-micmiu.jar ,和你一样的代码,报
忘解决:
请问你当时用的itext版本号是多少? 我下了itext5.3.4和你的 xmlworker-1.2.1-micmiu.jar一起用, 但是中文还是显示不了
https://github.com/micmiu/blog-exp-tool/blob/master/pom.xml 应该是5.3.2
求助博主,我下载xmlworker-5.4.1-sources.jar包,按照您文章所说修改了源码,但是我该如何把这个.java文件编译成,class文件替换到xmlworker-5.4.1.jar包中去,谢谢 😆
如果是用IDE 直接打包导出即可,如果是直接编辑源码,用 ant 或者 maven 编译 ,甚至是原生jdk 都可以
博主,能把你使用的jar包,发我邮箱吗liu.019(#)qq.com?我修改了xmlworker-5.4.0的源码,然后与itextpdf 5.1到5.42都不成功 😥
高手,太崇拜你了,真是帮我解决了一个大问题,非常感谢你的分享!
C#怎么改~
这个不了解的
请问,如果涉及到图片的问题怎么解决的?
如果是在线的网页它可以根据url自己去读取图片转换,如果是加载自己本地的需要自己写个类实现
如果是相对路径和css中的图片 就加载不了 这个您实现过吗?
相对路径的图片是支持的,我在官方文档里看到过,但是css 中的图片我就不清楚了
我试了下 相对的不行
我能加你qq吗 方便和你谈论下?
ok 给你回复邮件了
您好,昨天按照你说的中文问题已经解决了,但是图片如何显示呢,您有没有关于图片方面的文章
img 标签 本身就支持的 我把我的blog都生成pdf了
那为什么我这图片显示不了呢?请问有哪些可能导致的,谢谢
如果是在线页面,只要图片没有限制访问 一般没有问题,如果是本地html 需要配置本地的图片路径(这个没有具体试过)
果然可以,非常感谢!!! 😛 😛 😛
大神,请问如何加载相对路径的图片呢? 😛
这个没有实际应用实现过,我是以前看到文档上有这方面的介绍
我也遇到了这个问题,如果是我在本地进行测试,将图片的地址写成相对路径,在导出PDF的时候,图片就无法导出,显示的是空白,如果我是写绝对路径,图片就会输出。请问有没有什么解决方法?我将我的应用部署到linux中,图片也还是无法导出
相对路径是正解,当然绝对路径也可以 只要保证你生成pdf时可以读到该文件
我这边,win是 不加你那种方式也行,中文也没问题,但是放到Linux上面就不行了, 然后加上你的方法win上还是可以,Linux还是不行,你那是在什么服务器上的;请指教
我是在win 上做的,这个没有到linux上做过测试,不过应该没有问题 它加载注册的是自己带的字体,
你可以用第一篇中的简单测试程序在linux下看能否运行成功?
啊我跟你一样的啊,解决了么?
i found that some tags can’t be shown. e.g.
i have tried, but all style removed.
🙂 ,非常感谢,按你的代码,我运行了一遍,可以
我当时也很郁闷的