iText pdf在使用NOTO字体或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(); } 

我已经在我的机器上下载了字体文件。 我正在使用两种方法

  1. 在Adobe中使用等效的字体系列

  2. 将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 list = new ArrayList(); 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:/temp/fonts/NotoSansCJKtc-Thin.otf替换c:/windows/fonts/arialuni.ttf,我没看到中文字符。 要转换的文本是

 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)."; 

显然你使用的是错误的字体。 我已从您发布的链接下载了字体。 您正在使用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不显示中文字形,而是显示“无法提取嵌入字体”消息。 我不能重现这个[*] 。 我甚至在Adobe Acrobat中使用了Preflight,如下所示,但没有发现错误:

在此处输入图像描述

[*]更新:如果您使用iText群集NV未知的版本iText 4.2.x,则可以重现此问题。 请仅使用高于5的iText版本。