我猜測這個現象會發生的原因可能如下,
1.如果資料庫內碼是使用Big5編碼時,透過網頁上輸入的中文字(UTF-8)進入到應用伺服器時,被轉了一次碼(ISO-8859-1),再存到資料庫時,又轉了一次碼(Big5),例如下列的順序:
UTF-8->ISO-8859-1->Big5
當UTF-8轉成ISO-8859-1時,Unicode被轉成10進制的HTML Entity格式(如珉),然後跟其他可以轉成Big5的字元一起存到資料庫去。
2.等到從資料庫取回這個字串時,就會得到一個夾雜著HTML Entity格式的Big5字串,如果把這個字串直接傳給iText 去產生 pdf 檔,這些HTML Entity字串應該就會當做英文字母一樣輸出。於是就產生類似您所附上的sample.pdf 般的內容了。
好,了解原因後,要解決這個問題就很簡單了,只要在步驟2時補上將HTML Entity字串轉碼回原始編碼,再傳給iText去產生pdf即可。而要將HTML Entity字串轉碼回原始編碼只要呼叫
Apache Commons Lang的
StringEscapeUtils.unescapeHtml(java.lang.String) method即可。
在此以修改
iText in Action 2nd Edition所提供的
HelloWorld.java作為範例
HelloWorld.java:
/*
* 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.
*/
package com.andowson.pdf;
import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.commons.lang.StringEscapeUtils;
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;
/**
* First iText example: Hello World.
*/
public class HelloWorld {
/** Path to the resulting PDF file. */
public static final String RESULT
= "D:/hello.pdf";
/**
* Creates a PDF file: hello.pdf
* @param args no arguments needed
*/
public static void main(String[] args)
throws DocumentException, IOException {
new HelloWorld().createPdf(RESULT);
}
/**
* Creates a PDF document.
* @param filename the path to the new PDF document
* @throws DocumentException
* @throws IOException
*/
public void createPdf(String filename)
throws DocumentException, IOException {
// step 1
Document document = new Document();
// step 2
PdfWriter.getInstance(document, new FileOutputStream(filename));
// step 3
document.open();
// Assumes that source string comes from database
String source = "測試物品-珉彣峯喆献";
// Unescapes the Unicode characters from HTML entities (decimal format) to string
String output = StringEscapeUtils.unescapeHtml(source);
// Specifies the file path to the Chinese font file
BaseFont bfChinese = BaseFont.createFont("C:/Windows/Fonts/kaiu.ttf",
BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
Font font = new Font(bfChinese, 12); // The font size is 12.
// step 4
document.add(new Paragraph(output, font));
// step 5
document.close();
}
}
下載函式庫:
http://itextpdf.com/
http://commons.apache.org/lang/
參考網址:
* Unicode 編碼字集
http://theorem.ca/~mvcorks/cgi-bin/unicode.pl.cgi?start=4E00&end=9FFF
* 解決iText輸出中文問題
http://blog.yam.com/rexmen/article/1888474
* Hello World example
http://itextpdf.com/examples/iia.php?id=12