您的位置:首页 > 其它

Itext中文处理pdf(转)(改)

2016-07-13 11:28 369 查看
//注释:多谢这篇文章给我的启示,让我找到了输出中文的字体改好看的办法。将我在之前文章中谈到的PdfViewSupportAsian中的 smallFont = FontFactory.getFont( "STSongStd-Light" , "UniGB-UCS2-H" , false);改为smallFont = FontFactory.getFont( "STSongStd-Light" , "UniGB-UCS2-H" , false);

Itext中文处理pdf(转)

文章分类:Java编程

http://quicker.javaeye.com/blog/549876

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的修改:

http://itextpdf.com/history.php

关注两句话:

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测试就不会报错了。

其实这个问题也有文章谈到,如:http://xiaolongfeixiang.javaeye.com/blog/577816

我在itext官方网站上,查iTextAsian,发现这样的文章http://www.itextpdf.com/examples/index.php?page=example&id=214

显然,它是一个示例。那么同样使用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的文件.内容在附件里.

iText-2.1.3.jar (1 MB)下载次数: 157

iTextAsian.jar (324 KB)下载次数: 197

iText.jar (1 MB)下载次数: 93

更改.rar (309.7 KB)下载次数: 143

good.pdf (1.7 KB)下载次数: 58

收藏于 2011-03-12
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: