會員註冊 / 登入  |  電腦版  |  Jump to bottom of page

網頁程式設計 Web Development » iText在產生pdf檔時,遇到一些特殊中文字(例如:珉、峯、喆等),都會有unicode字碼(&#xxxxx;)輸出,該怎麼辦?

發表人: collectWu, 十級學員
2011-05-10 16:49:53
我的資料庫裡頭儲存是Big5資料,想從資料庫SELECT一些資料,然後用iText來產生pdf檔,但遇到一些特殊中文字時,就會產生如附件(樣本檔)所示錯誤現象,請問版主該如何解決?謝謝!

檔案名稱 sample.pdf
描述 樣本檔
檔案大小 23 Kbytes
下載次數 11 次
[Disk] 下載


發表人: andowson, 七段學員
2011-05-17 23:24:47
我猜測這個現象會發生的原因可能如下,
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 LangStringEscapeUtils.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

檔案名稱 HelloWorld.java
描述 產生PDF的範例檔
檔案大小 2 Kbytes
下載次數 5 次
[Disk] 下載

檔案名稱 hello.pdf
描述 產生的範例pdf檔
檔案大小 23 Kbytes
下載次數 7 次
[Disk] 下載





會員註冊 / 登入  |  電腦版  |  Jump to top of page