关闭

iText中文问题

2462人阅读 评论(0) 收藏 举报

1.前言

  有很多文章对Java的中文问题进行了论述,论坛上的许多问题也与此有关,所以中文问题实在是Java应用中的一个不小的问题。尽管已经有这么多的参考资料,但是由于Java的应用范围实在太广,包含的内容太多,虽然问题的根源往往万变不离其宗,然而很容易乱花渐欲迷人眼,导致各种各样的问题层出不穷。
总的说来,Java的中文问题较多的出现在数据传输的场合,比如数据从A传递到B,将B得到的数据显示出来可能就成了乱码。Java中文问题产生的根源是编码,如果A和B存放字符的编码不同,则乱码就产生了。
下面我就将iText中所遇到的一些中文问题进行一下力所能及的阐述,恐言有所未逮,不能尽善尽美,面面俱到之处,权当抛砖引玉耳。
我将分两个部分进行阐述,一个是application中的中文问题,一个是在JSP中的中文问题。
iText是一个用来生成PDF文件的开源类库,详细情况和用法请参考http: //www.lowagie.com/iText/tutorial/index.html,下载请至http://sourceforge.net/projects/itext。如果有必要的话我会再写一篇iText的简单介绍。
************************************

2.iText在Java Application中的中文问题


1)从“HelloWorld”开始

我们从iText的一个入门程序开始:

该程序在PDF文件中写入HelloWorld,编译并运行该程序,我们可以在同级目录下得到一个名为“Chap0101”的PDF文件,打开这个文件,就可以看到左上角的“HelloWorld”。
这样我们就完成了一个几乎就是最简单的PDF文件的制作,有心的朋友可能就想,如果把HelloWorld替换成中文字符效果如何。好的!

2)用“我们是害虫”替换“HelloWorld”

  我们把document.add(new Paragraph("HelloWorld"));改成document.add(new Paragraph("我们是害虫"));然后编译运行,得到一个PDF文件,但是打开却发现,没有任何字符。添加中文字符失败!PDF文件完全不认这里的中文字符。
  iText添加中文字符,需要设置相应的编码和字体。
  在程序开端添加import com.lowagie.text.pdf.BaseFont;引入所需要的类。
  然后将中文字符做成字符串:String chinese =”我们是害虫”;
  设置字体和编码:BaseFont bfChinese = BaseFont.createFont("STSong-Light",
                    "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
            Font FontChinese = new Font(bfChinese, 12, Font.NORMAL);
加入document:
              Paragraph chunk = new Paragraph(chinese, FontChinese);
              document.add(chunk);
  此时要正确编译,还需要下载一个包,该包包含了中、日、韩文字的一些字体和编码。该包名为iTextAsian.jar,访问http://itext.sourceforge.net/downloads/iTextAsian.jar可以下载。
  下载后加入classpath,则程序可以正确编译运行了。

3)可能存在的意外

  一般来说,按照上述的步骤将中文字符加入到PDF文件中,是没有问题的。为什么这么说呢?这样就不得不说到Java的编译器javac。
  如果我们在命令行中输入javac然后回车,就可以看到屏幕上会输出一些javac的相关参数。其中有一个是encoding。我们一般很少用到这个参数,其实这个参数对于java的跨平台非常重要。如果在编译时不指定这个参数,则系统默认:在中文平台上为gb2312,英文平台上为ISO8859_1。编译器就是根据这个参数来读取java文件的,然后把用utf-8形式编译成class文件。
  想象一下,如果此时所用为英文操作系统,则在不指定encoding参数的情况下,javac以ISO8859_1为编码读取java文件,则中文字符串必定不能顺利读出,于是在PDF中出现乱码!!
  我们可以将上面可以正确生成中文的java文件重新编译和执行,指定encoding参数为ISO8859_1:javac ?Cencoding ISO8859_1 ……打开生成的PDF文件,你可以看到奇形怪状的乱码。
  我们一般用的都是中文平台,所以上述“凑巧”不会碰到,但是以后如果真遇上了这样的场合,只要指定encoding为相应的编码就可以了。
  还有一种方法就是将字符串放在文本文件中,用相应的编码保存,然后在程序中利用流读进来。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:206924次
    • 积分:2533
    • 等级:
    • 排名:第14500名
    • 原创:51篇
    • 转载:71篇
    • 译文:0篇
    • 评论:16条