iText pdf 在使用 NOTO 字体或 Source Hans 时不显示汉字
iText pdf not displaying Chinese characters when using NOTO fonts or Source Hans
我正在尝试使用 NOTO 字体 (https://www.google.com/get/noto/) 来显示汉字。这是我的示例代码,来自 iText 的修改示例代码。
public void createPdf(String filename) throws IOException, DocumentException {
Document document = new Document();
PdfWriter.getInstance(document, new FileOutputStream(filename));
document.open();
//This is simple English Font
FontFactory.register("c:/temp/fonts/NotoSerif-Bold.ttf", "my_nato_font");
Font myBoldFont = FontFactory.getFont("my_nato_font");
BaseFont bf = myBoldFont.getBaseFont();
document.add(new Paragraph(bf.getPostscriptFontName(), myBoldFont));
//This is Chinese font
//Option 1 :
Font myAdobeTypekit = FontFactory.getFont("SourceHanSansSC-Regular", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
//Option 2 :
/*FontFactory.register("C:/temp/AdobeFonts/source-han-sans-1.001R/OTF/SimplifiedChinese/SourceHanSansSC-Regular.otf", "my_hans_font");
Font myAdobeTypekit = FontFactory.getFont("my_hans_font", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);*/
document.add(Chunk.NEWLINE);
document.add(new Paragraph("高興", myAdobeTypekit));
document.add(Chunk.NEWLINE);
//simplified chinese
document.add(new Paragraph("朝辞白帝彩云间", myAdobeTypekit));
document.add(Chunk.NEWLINE);
document.add(new Paragraph("高兴", myAdobeTypekit));
document.add(new Paragraph("The Source Han Sans Traditional Chinese ", myAdobeTypekit));
document.close();
}
我已经在我的机器上下载了字体文件。我正在使用两种方法
在 Adobe 中使用等效字体系列
将otf文件嵌入pdf
使用方法1,我希望中文字符显示为pdf,但显示英文文本,中文字符为空白。
使用方法 2,当我尝试使用 pdf 嵌入字体时,这不是我想要采用的路径,打开 pdf 时出现错误。
更新:
如果我看这个例子 http://itextpdf.com/examples/iia.php?id=214
在此代码中
public void createPdf(String filename, boolean appearances, boolean font)
throws IOException, DocumentException {
// step 1
Document document = new Document();
// step 2
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(filename));
// step 3
document.open();
// step 4
writer.getAcroForm().setNeedAppearances(appearances);
TextField text = new TextField(writer, new Rectangle(36, 806, 559, 780), "description");
text.setOptions(TextField.MULTILINE);
if (font) {
BaseFont unicode =
BaseFont.createFont("c:/windows/fonts/arialuni.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
text.setExtensionFont(BaseFont.createFont());
ArrayList<BaseFont> list = new ArrayList<BaseFont>();
list.add(unicode);
text.setSubstitutionFonts(list);
BaseFont f= (BaseFont)text.getSubstitutionFonts().get(0);
System.out.println(f.getPostscriptFontName());
}
text.setText(TEXT);
writer.addAnnotation(text.getTextField());
// step 5
document.close();
}
我把 c:/windows/fonts/arialuni.ttf 替换成 C:/temp/fonts/NotoSansCJKtc-Thin.otf ,我没有看到汉字。现在要转换的文本是
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).";
很明显你用错了字体。我已经从您发布的 link 下载了字体。您使用的是NotoSerif-Bold.ttf,一种不支持中文的字体。但是,ZIP 文件还包含字体名称中带有 CJK 的字体。 正如您参考的网站所述,CJK 代表中文、日语和韩语。使用其中一种 CJK 字体,您将能够在 PDF 中生成中文文本。
看看 NotoExample,我在其中使用了您引用的 ZIP 文件中的一种字体。它会创建一个如下所示的 PDF:
这是我使用的代码:
public static final String FONT = "resources/fonts/NotoSansCJKsc-Regular.otf";
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).";
public static final String CHINESE = "\u5341\u950a\u57cb\u4f0f";
public static final String JAPANESE = "\u8ab0\u3082\u77e5\u3089\u306a\u3044";
public static final String KOREAN = "\ube48\uc9d1";
public void createPdf(String dest) throws IOException, DocumentException {
Document document = new Document();
PdfWriter.getInstance(document, new FileOutputStream(DEST));
document.open();
Font font = FontFactory.getFont(FONT, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
Paragraph p = new Paragraph(TEXT, font);
document.add(p);
document.add(new Paragraph(CHINESE, font));
document.add(new Paragraph(JAPANESE, font));
document.add(new Paragraph(KOREAN, font));
document.close();
}
您声称 Adobe Reader XI 不显示中文字形,而是显示 "Cannot extract the embedded Font" 消息。我无法重现此 [*]。我什至按照指示在 Adobe Acrobat 中使用了 Preflight here,但没有发现错误:
[*] 更新:如果您使用 iText 4 可以重现此问题。2.x,一个由 iText Group NV 不知名的人发布的版本。请仅使用高于 5 的 iText 版本。
我正在尝试使用 NOTO 字体 (https://www.google.com/get/noto/) 来显示汉字。这是我的示例代码,来自 iText 的修改示例代码。
public void createPdf(String filename) throws IOException, DocumentException {
Document document = new Document();
PdfWriter.getInstance(document, new FileOutputStream(filename));
document.open();
//This is simple English Font
FontFactory.register("c:/temp/fonts/NotoSerif-Bold.ttf", "my_nato_font");
Font myBoldFont = FontFactory.getFont("my_nato_font");
BaseFont bf = myBoldFont.getBaseFont();
document.add(new Paragraph(bf.getPostscriptFontName(), myBoldFont));
//This is Chinese font
//Option 1 :
Font myAdobeTypekit = FontFactory.getFont("SourceHanSansSC-Regular", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
//Option 2 :
/*FontFactory.register("C:/temp/AdobeFonts/source-han-sans-1.001R/OTF/SimplifiedChinese/SourceHanSansSC-Regular.otf", "my_hans_font");
Font myAdobeTypekit = FontFactory.getFont("my_hans_font", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);*/
document.add(Chunk.NEWLINE);
document.add(new Paragraph("高興", myAdobeTypekit));
document.add(Chunk.NEWLINE);
//simplified chinese
document.add(new Paragraph("朝辞白帝彩云间", myAdobeTypekit));
document.add(Chunk.NEWLINE);
document.add(new Paragraph("高兴", myAdobeTypekit));
document.add(new Paragraph("The Source Han Sans Traditional Chinese ", myAdobeTypekit));
document.close();
}
我已经在我的机器上下载了字体文件。我正在使用两种方法
在 Adobe 中使用等效字体系列
将otf文件嵌入pdf
使用方法1,我希望中文字符显示为pdf,但显示英文文本,中文字符为空白。
使用方法 2,当我尝试使用 pdf 嵌入字体时,这不是我想要采用的路径,打开 pdf 时出现错误。
更新: 如果我看这个例子 http://itextpdf.com/examples/iia.php?id=214
在此代码中
public void createPdf(String filename, boolean appearances, boolean font)
throws IOException, DocumentException {
// step 1
Document document = new Document();
// step 2
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(filename));
// step 3
document.open();
// step 4
writer.getAcroForm().setNeedAppearances(appearances);
TextField text = new TextField(writer, new Rectangle(36, 806, 559, 780), "description");
text.setOptions(TextField.MULTILINE);
if (font) {
BaseFont unicode =
BaseFont.createFont("c:/windows/fonts/arialuni.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
text.setExtensionFont(BaseFont.createFont());
ArrayList<BaseFont> list = new ArrayList<BaseFont>();
list.add(unicode);
text.setSubstitutionFonts(list);
BaseFont f= (BaseFont)text.getSubstitutionFonts().get(0);
System.out.println(f.getPostscriptFontName());
}
text.setText(TEXT);
writer.addAnnotation(text.getTextField());
// step 5
document.close();
}
我把 c:/windows/fonts/arialuni.ttf 替换成 C:/temp/fonts/NotoSansCJKtc-Thin.otf ,我没有看到汉字。现在要转换的文本是
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).";
很明显你用错了字体。我已经从您发布的 link 下载了字体。您使用的是NotoSerif-Bold.ttf,一种不支持中文的字体。但是,ZIP 文件还包含字体名称中带有 CJK 的字体。 正如您参考的网站所述,CJK 代表中文、日语和韩语。使用其中一种 CJK 字体,您将能够在 PDF 中生成中文文本。
看看 NotoExample,我在其中使用了您引用的 ZIP 文件中的一种字体。它会创建一个如下所示的 PDF:
这是我使用的代码:
public static final String FONT = "resources/fonts/NotoSansCJKsc-Regular.otf";
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).";
public static final String CHINESE = "\u5341\u950a\u57cb\u4f0f";
public static final String JAPANESE = "\u8ab0\u3082\u77e5\u3089\u306a\u3044";
public static final String KOREAN = "\ube48\uc9d1";
public void createPdf(String dest) throws IOException, DocumentException {
Document document = new Document();
PdfWriter.getInstance(document, new FileOutputStream(DEST));
document.open();
Font font = FontFactory.getFont(FONT, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
Paragraph p = new Paragraph(TEXT, font);
document.add(p);
document.add(new Paragraph(CHINESE, font));
document.add(new Paragraph(JAPANESE, font));
document.add(new Paragraph(KOREAN, font));
document.close();
}
您声称 Adobe Reader XI 不显示中文字形,而是显示 "Cannot extract the embedded Font" 消息。我无法重现此 [*]。我什至按照指示在 Adobe Acrobat 中使用了 Preflight here,但没有发现错误:
[*] 更新:如果您使用 iText 4 可以重现此问题。2.x,一个由 iText Group NV 不知名的人发布的版本。请仅使用高于 5 的 iText 版本。