iText - 中文字符未显示
iText - chinese character aren't shown
我有以下问题有一个 utf8 编码和中文字符的数据库。我把数据变成一个字符串,然后把它传递给图书馆的单元格,一切都很好,除了当我使用中文字符时,它们没有显示,我试过这个:
public String testEncoding(String str) {
String result = "";
for(char ch : str.toCharArray())
result += "\u" + Integer.toHexString(ch | 0x10000).substring(1);
return result;
}
还使用 notosans 和 arial uni 字体,将字符串转换为 unicode,当我打印时它显示 pdf \u6b98\u528d 中的 unicode,而不是中文字符,但当我将其粘贴到字符串中时
String text = "\u6b98\u528d";
并将其传递给它显示正常的段落的单元格!
这是我为此使用的代码:
final String PATH_FONT_ARIALUNI = "src/main/resources/fonts/NotoSansCJKsc-Regular.otf";
// FOR Chinese
BaseFont baseFont = null;
try {
baseFont = BaseFont.createFont(PATH_FONT_ARIALUNI, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Font font = new Font(baseFont, 6.8f);
Font fontNormal = new Font(FontFamily.HELVETICA, 10, Font.NORMAL, BaseColor.RED);
char[] aa = title.toCharArray();
boolean isLastChineseChar = false;
for (int j = 0; j < title.length(); j++) {
if((Character.UnicodeBlock.of(aa[j]) == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS)){
isLastChineseChar = true;
/*System.out.println("Is CHINESE: " + aa[j]);*/
}
}
Phrase phrase = null;
if(isLastChineseChar){
phrase = new Phrase(title, font);
//also passing testEncoding(title) but as i say it shows unicode in the printed pdf
PdfPCell cell = new PdfPCell(phrase);
cell.setVerticalAlignment(Element.ALIGN_CENTER);
if (align == 2) {
cell.setHorizontalAlignment(Element.ALIGN_CENTER);
}
return cell;
} else {
phrase = new Phrase(title, fontNormal);
PdfPCell cell = new PdfPCell(phrase);
cell.setVerticalAlignment(Element.ALIGN_CENTER);
if (align == 2) {
cell.setHorizontalAlignment(Element.ALIGN_CENTER);
}
return cell;
}
有什么想法吗?我做错了什么?我在这里看到很多例子,但有读取文本文件和直接传递 unicode 字符串的例子,这与我的例子不同。
我的代码已经运行良好,如果您在生产服务器中遇到字符未显示的任何问题,解决方案如下:
在你class添加这个
@Value("classpath:fonts/NotoSansCJKsc-Regular.otf")
private Resource res;
然后你像这样导入:
baseFont = BaseFont.createFont(res.getURI().getPath(), BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
一切都会好起来的!
Resource 是一个 Spring 框架 class 可以为您完成这项工作
我有以下问题有一个 utf8 编码和中文字符的数据库。我把数据变成一个字符串,然后把它传递给图书馆的单元格,一切都很好,除了当我使用中文字符时,它们没有显示,我试过这个:
public String testEncoding(String str) {
String result = "";
for(char ch : str.toCharArray())
result += "\u" + Integer.toHexString(ch | 0x10000).substring(1);
return result;
}
还使用 notosans 和 arial uni 字体,将字符串转换为 unicode,当我打印时它显示 pdf \u6b98\u528d 中的 unicode,而不是中文字符,但当我将其粘贴到字符串中时
String text = "\u6b98\u528d";
并将其传递给它显示正常的段落的单元格! 这是我为此使用的代码:
final String PATH_FONT_ARIALUNI = "src/main/resources/fonts/NotoSansCJKsc-Regular.otf";
// FOR Chinese
BaseFont baseFont = null;
try {
baseFont = BaseFont.createFont(PATH_FONT_ARIALUNI, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Font font = new Font(baseFont, 6.8f);
Font fontNormal = new Font(FontFamily.HELVETICA, 10, Font.NORMAL, BaseColor.RED);
char[] aa = title.toCharArray();
boolean isLastChineseChar = false;
for (int j = 0; j < title.length(); j++) {
if((Character.UnicodeBlock.of(aa[j]) == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS)){
isLastChineseChar = true;
/*System.out.println("Is CHINESE: " + aa[j]);*/
}
}
Phrase phrase = null;
if(isLastChineseChar){
phrase = new Phrase(title, font);
//also passing testEncoding(title) but as i say it shows unicode in the printed pdf
PdfPCell cell = new PdfPCell(phrase);
cell.setVerticalAlignment(Element.ALIGN_CENTER);
if (align == 2) {
cell.setHorizontalAlignment(Element.ALIGN_CENTER);
}
return cell;
} else {
phrase = new Phrase(title, fontNormal);
PdfPCell cell = new PdfPCell(phrase);
cell.setVerticalAlignment(Element.ALIGN_CENTER);
if (align == 2) {
cell.setHorizontalAlignment(Element.ALIGN_CENTER);
}
return cell;
}
有什么想法吗?我做错了什么?我在这里看到很多例子,但有读取文本文件和直接传递 unicode 字符串的例子,这与我的例子不同。
我的代码已经运行良好,如果您在生产服务器中遇到字符未显示的任何问题,解决方案如下:
在你class添加这个
@Value("classpath:fonts/NotoSansCJKsc-Regular.otf")
private Resource res;
然后你像这样导入:
baseFont = BaseFont.createFont(res.getURI().getPath(), BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
一切都会好起来的!
Resource 是一个 Spring 框架 class 可以为您完成这项工作