iText中文问题 2008-09-19 16:44

字号:    
 
 有很多文章对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的一个入门程序开始:
  1. import java.io.FileOutputStream;
  2. import java.io.IOException;
  3. import com.lowagie.text.*;
  4. import com.lowagie.text.pdf.PdfWriter;
  5. public class Chap0101 {
  6.     public static void main(String[] args) {
  7.         System.out.println("Chapter 1 example 1: Hello World");
  8.         // step 1: creation of a document-object
  9.         Document document = new Document();
  10.         try {
  11.             // step 2:
  12.             // we create a writer that listens to the document
  13.             // and directs a PDF-stream to a file
  14.             PdfWriter.getInstance(document, new FileOutputStream               ("Chap0101.pdf"));
  15.             // step 3: we open the document
  16.             document.open();
  17.             // step 4: we add a paragraph to the document
  18.             document.add(new Paragraph("Hello World"));
  19.        }
  20.         catch(DocumentException de) {
  21.             System.err.println(de.getMessage());
  22.         }
  23.         catch(IOException ioe) {
  24.             System.err.println(ioe.getMessage());
  25.         }
  26.         // step 5: we close the document
  27.         document.close();
  28.     }
  29. }

    该程序在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为相应的编码就可以了。
    还有一种方法就是将字符串放在文本文件中,用相应的编码保存,然后在程序中利用流读进来。
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
网易公司版权所有 ©1997-2009