1. 程式人生 > >Itext中文處理pdf(轉)(改)

Itext中文處理pdf(轉)(改)

//註釋:多謝這篇文章給我的啟示,讓我找到了輸出中文的字型改好看的辦法。將我在之前文章中談到的PdfViewSupportAsian中的  smallFont = FontFactory.getFont( "STSongStd-Light" ,  "UniGB-UCS2-H" , false);改為smallFont = FontFactory.getFont( "STSongStd-Light" ,  "UniGB-UCS2-H" , false);

Itext中文處理:

在Itext中的中文處理隨著Itext的版本變化,採取的方法也在變化。

首先我來演示一下利用Itext-2.1.3.jar與iTextAsian.jar兩個包來解決中文問題。

附件中有所需要的包:

示例程式碼:

<SPAN style="FONT-SIZE: small">package com.lwf.pdf.test;

import java.awt.Color;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import com.lowagie.text.Document;

import com.lowagie.text.DocumentException;

import com.lowagie.text.Font;

import com.lowagie.text.Paragraph;

import com.lowagie.text.pdf.BaseFont;

import com.lowagie.text.pdf.PdfWriter;

public class HelloWord {

       public static void main(String[] args) {

              try {

                     Document doc = new Document();

                     PdfWriter.getInstance(doc, new FileOutputStream("c:\\good.pdf"));

                     doc.open();

                     BaseFont bfChinese = BaseFont.createFont( "STSongStd-Light" ,  "UniGB-UCS2-H" ,  false );

                     Font fontChinese =  new  Font(bfChinese  ,  12 , Font.NORMAL, Color.GREEN);

                     Paragraph pf = new Paragraph("eee");

                     pf.add(new Paragraph("我們的家好大的家",fontChinese));

                     pf.add(new Paragraph("sfsfsf"));

                     doc.add(pf);

                     doc.close();

              } catch (FileNotFoundException e) {

                     e.printStackTrace();

              } catch (DocumentException e) {

                     e.printStackTrace();

              } catch (IOException e) {

                     e.printStackTrace();

              }

       }

}

</SPAN>

上面程式碼測試環境是:JDK1.4編譯環境也為1.4,當然在以後的JDK版本中測試也是沒問題的。

好了,現在最新的Itext版本為Itext 5.0,附件中iText.jar即為該版本。以下為Itext5.0的修改:

關注兩句話:

From now on, the iText.jar is compiled using Java 5 (instead of with the JDK 1.4).

The package names have changed from com.lowagie to com.itextpdf.

上面兩句話第一說明itext5.0用於JDK1.5以及之後的版本。第二句更改了包名。

好了,如果我現在的程式使用iText.jar+iTextAsian.jar執行下面程式:

<SPAN style="FONT-SIZE: small">package com.lwf.pdf.test;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import com.itextpdf.text.BaseColor;

import com.itextpdf.text.Document;

import com.itextpdf.text.DocumentException;

import com.itextpdf.text.Font;

import com.itextpdf.text.Paragraph;

import com.itextpdf.text.pdf.BaseFont;

import com.itextpdf.text.pdf.PdfWriter;

public class HelloWord {

       public static void main(String[] args) {

              try {

                     Document doc = new Document();

                     PdfWriter.getInstance(doc, new FileOutputStream("c:\\good.pdf"));

                     doc.open();

                     BaseFont bfChinese = BaseFont.createFont( "STSongStd-Light" ,  "UniGB-UCS2-H" ,  false );

                     //Font fontChinese =  new  Font(bfChinese,12,Font.NORMAL,Color.GREEN);

                     Font fontChinese =  new  Font(bfChinese  ,  12 , Font.NORMAL, BaseColor.GREEN);   

                     Paragraph pf = new Paragraph("eee");

                     pf.add(new Paragraph("我們的家好大的家",fontChinese));

                     pf.add(new Paragraph("sfsfsf"));

                     doc.add(pf);

                     doc.close();

              } catch (FileNotFoundException e) {

                     e.printStackTrace();

              } catch (DocumentException e) {

                     e.printStackTrace();

              } catch (IOException e) {

                     e.printStackTrace();

              }

       }

}

</SPAN>

會報以下錯誤:

<SPAN style="FONT-SIZE: small">com.itextpdf.text.DocumentException: No message found for font.1.with.2.is.not.recognized

       at com.itextpdf.text.pdf.BaseFont.createFont(Unknown Source)

       at com.itextpdf.text.pdf.BaseFont.createFont(Unknown Source)

       at com.itextpdf.text.pdf.BaseFont.createFont(Unknown Source)

       at com.lwf.pdf.test.HelloWord.main(HelloWord.java:24)

</SPAN>

這是為什麼呢?

不難發現上面兩個測試只是更改了iText包。而iTextAsian.jar只是包含了亞洲國家的文字資訊。開啟iTextAsian.jar發現它採用了與原來iText-2.1.3.jar一樣的包名:com.lowagie.text.Font而現在的iText5.0包名已經改為了com.itextpdf.text.Font,顯然我們更一下包名就可以解決問題。在winrar中把對應包名重新命名加進來即可。我把改好的jar放在附件的更改.rar中。好了,那麼現在使用iText.jar+更改.rar中的iTextAsian.jar測試就不會報錯了。

顯然,它是一個示例。那麼同樣使用iText5.0+更改後的iTextAsian包,下面有另一種實現方法:

/*

 * This class is part of the book "iText in Action - 2nd Edition"

 * written by Bruno Lowagie (ISBN: 9781935182610)

 * For more info, go to: http://itextpdf.com/examples/

 * This example only works with the AGPL version of iText.

 */

import java.io.FileOutputStream;

import java.io.IOException;

import com.itextpdf.text.Document;

import com.itextpdf.text.DocumentException;

import com.itextpdf.text.FontFactory;

import com.itextpdf.text.PageSize;

import com.itextpdf.text.Paragraph;

import com.itextpdf.text.Phrase;

import com.itextpdf.text.pdf.BaseFont;

import com.itextpdf.text.pdf.FontSelector;

import com.itextpdf.text.pdf.PdfWriter;

/**

 * This example was written by Bruno Lowagie. It is part of the book 'iText in

 * Action' by Manning Publications.

 * ISBN: 1932394796

 * http://www.1t3xt.com/docs/book.php

 * http://www.manning.com/lowagie/

 */

public class FontSelectionExample {

    /** The resulting PDF file. */

    public static final String RESULT

        = "results/part3/chapter11/font_selection.pdf";

    /** Some text */

    public static final String TEXT

        = "These are the protagonists in 'Hero', a movie by Zhang Yimou:\n"

                     + "\u7121\u540d (Nameless), \u6b98\u528d (Broken Sword), "

                     + "\u98db\u96ea (Flying Snow), \u5982\u6708 (Moon), "

                     + "\u79e6\u738b (the King), and \u9577\u7a7a (Sky)." +

                                   "中華人民共和國萬歲勞動人民是光榮的,歲月崢嶸,百舸爭流" ;

    /**

     * Creates a PDF document.

     * @param filename the path to the new PDF document

     * @throws DocumentException 

     * @throws IOException

     * @throws    DocumentException

     * @throws    IOException

     */

       public void createPdf(String filename) throws IOException, DocumentException {

              // step 1

              Document document = new Document(PageSize.A4);

              // step 2

              PdfWriter.getInstance(document, new FileOutputStream(filename));

              // step 3: we open the document

              document.open();

              // step 4:

              FontSelector selector = new FontSelector();

              selector.addFont(FontFactory.getFont(FontFactory.TIMES_ROMAN, 12));

//            selector.addFont(FontFactory.getFont("MSung-Light",

//                   "UniCNS-UCS2-H", BaseFont.NOT_EMBEDDED));

//            

              selector.addFont(FontFactory.getFont("STSongStd-Light",

                            "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED));

              Phrase ph = selector.process(TEXT);

              document.add(new Paragraph(ph));

              // step 5: we close the document

              document.close();

       }

    /**

     * Main method.

     *

     * @param    args    no arguments needed

     * @throws DocumentException

     * @throws IOException

     */

       public static void main(String[] args) throws IOException, DocumentException {

              new FontSelectionExample().createPdf("c:/good.pdf");

       }

}

呵呵,我只是把示例程式碼改了一下,那麼在C盤就會生成一個名為good.pdf的檔案.內容在附件裡.

更改.rar (309.7 KB)下載次數: 143

good.pdf (1.7 KB)下載次數: 58