itext/itextg添加中文支持的两种办法

1. 无关紧要的话

itext/itextg是不支持中文(或其他亚洲语言)的。如果你在生成的文档中写入了中文,那么很遗憾,什么都不会显示出来 :(

但是,(凡是都有个但是)仍然有其他办法能够让itext/itextg支持中文的显示。


2. 办法一:itext-assian.jar

itext-assian.jar提供了对亚洲语言的支持。你可以从itext在sourceforge的项目主页中找到extrajars,并下载它,itext-assian.jar就在里面。

题外话,虽然你是在itext的sourceforge项目里下载的itext-assian.jar,但是itext-assian.jar和其他在extrajars文件夹下的jar并不是itext项目的一部分。(The extra jars (itext-asian, itext-hyph-xml, bc*,...) are NOT A PART of the iText project. These jars are bundled for your convenience.)

先声明下我所使用的itext版本:itextg-5.5.3,extrajars-2.3。现在,把itextg-5.5.3.jar和itext-assian.jar放在Android项目的libs目录下,配置properties,然后build project,出错了,报错如下:

“ Error generating final archive: Found duplicate file for APK: com/itextpdf/text/pdf/fonts/cmap_info.txt

Origin 1: D:\Workspace\ITextTest\libs\itext-asian.jar

Origin 2: D:\Workspace\ITextTest\libs\itextg-5.5.3.jar ”

原来是itextg-5.5.3.jar 和 itext-assian.jar 含有相同的一个文件.../cmap_info.txt。现在解压itext-assian.jar,(用rar就行)把cmap_info.txt删掉,再用jar命令打包回itext-assian.jar就行了。

题外话,cmap_info.txt这个文件的存在不仅是拿来让你的程序编译出错而已。如果认真看一下cmap_info.txt,你就会知道为什么itext不内嵌CJK了 :P

现在,我们在程序里这么使用中文字体:

BaseFont bfChinese = null;  
try {
	bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",BaseFont.NOT_EMBEDDED);
} catch (DocumentException e) {
	// Do sth. here
} catch (IOException e) {  
	// Do sth. here
}  
Font font = new Font(bfChinese, 16, Font.NORMAL);

Paragraph p = new Paragraph("这是中文", font);

中文支持的问题解决了。但是,itext-assian支持的中文字体是不是略少了一点啊:( 而且,还有个问题,就是用itext/itextg生成的pdf如果使用了中文,那么pdf阅读器打开这些pdf的时候会提示你需要下载并安装使用的字体。更有甚者,我发现有的安卓app安装完了字体,下次重启android系统的时候,再打开pdf,居然还要重新下载安装,简直了!(╯‵□′)╯︵┻━┻


3. 办法二:使用字库

用word的时候,我们可以使用很多种字体,如果能在itext中使用这些字体,岂不很好?幸好,itext/itextg提供了使用字库的办法。

下面说的是在android项目里添加字库,并在itextg里面使用它。

首先你需要一些字体文件,你可以从网上下载,但是方便的办法是从C:\Windows\Fonts里找,嘎嘎:D 

然后,把 .ttf 文件拷到安卓项目的assets/fonts目录下,比如STSONG.TTF字体文件。

接着,在程序里这样写:

BaseFont bfChinese = null;  
try {
	bfChinese = BaseFont.createFont("assets/fonts/STSONG.TTF",BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED); #只改这一句
} catch (DocumentException e) {
	// Do sth. here
} catch (IOException e) {  
	// Do sth. here
}  
Font font = new Font(bfChinese, 16, Font.NORMAL);


Paragraph p = new Paragraph("这是中文", font);
就这么简单,大功告成了!

现在我们不再需要itext-assian.jar了。用能打开pdf的app打开生成的pdf文件也不需要下载安装字体了,解决了itext-assian.jar支持的字体种类少,app打开带有中文的pdf文件还要下载安装字体的问题。

使用字库后,带来的一个明显的问题就是,项目build的速度会变慢,尤其是你添加了好几个字体文件时,编译的速度简直不能忍了。这篇文章里说到使用字体文件带来的一些问题,仅供参考。

4. 后话

使用itext-assian.jar还是使用字体文件来解决itext/itextg中文显示的问题,需要自己根据实际情况来决定。不过目前个人更倾向于使用字体文件 :P


  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值