Java PDFBox:提取字体中没有U+0050的图示符

Java PDFBox:提取字体中没有U+0050的图示符,java,pdf,fonts,pdfbox,Java,Pdf,Fonts,Pdfbox,我试图在文档中创建新页面,并在使用文件中包含的字体时向其写入一些文本 字体是从以下资源中提取的: PDPage page = document.getPage(0); PDResources res = page.getResources(); List<PDFont> fonts = new ArrayList<>(); for (COSName fontName : res.getFontNames()) { PDFont font = res.getF

我试图在文档中创建新页面,并在使用文件中包含的字体时向其写入一些文本

字体是从以下资源中提取的:

PDPage page = document.getPage(0);
PDResources res = page.getResources();

List<PDFont> fonts = new ArrayList<>();

for (COSName fontName : res.getFontNames()) {
     PDFont font = res.getFont(fontName);
     System.out.println(font);
     fonts.add(font);
}
showText方法总是失败并出现错误

字体QZHBRL+ArialMT中的U+0050P没有字形

但正如FontForge所证实的那样,铭文就在那里:

此外,方法hasGlyph返回true


完整的项目(包括PDF)可在

中找到。在这里,您实际遇到了一个打开的PDFBox TODO,您的stream.showText最终为每个字符调用基础CID字体的编码,我们有:

公共类PDCIDFontType2扩展了PDCIDFont { ... 公共字节[]encodeint unicode { int-cid=-1; 如果我被嵌入 { ... //否则,我们需要一个明确的ToUnicode CMap 如果cid==-1 { //TODO:反转ToUnicode CMap? //另见PDFBOX-4233 cid=0; } } ... 如果cid==0 { 抛出新的IllegalArgumentException String.format字体%s、unicode、char unicode、getName中的U+%04X%c没有字形; } 返回编码符号idcid; } ... } org.apache.pdfbox.pdmodel.font.PDCIDFontType2

如果PDFBox无法在cid==-1的情况下确定从Unicode到glyph代码的映射,则JavaDoc注释指示确定glyph代码的另一种方法,即ToUnicode映射的反向查找。如果实现了这一点,PDFBox可能已经确定了一个glyph ID并写入了您的文本


不幸的是,它还没有实现。

在这里,您实际上遇到了一个打开的PDFBox TODO,您的stream.showText最终会为每个字符调用基础CID字体的编码,这里我们有:

公共类PDCIDFontType2扩展了PDCIDFont { ... 公共字节[]encodeint unicode { int-cid=-1; 如果我被嵌入 { ... //否则,我们需要一个明确的ToUnicode CMap 如果cid==-1 { //TODO:反转ToUnicode CMap? //另见PDFBOX-4233 cid=0; } } ... 如果cid==0 { 抛出新的IllegalArgumentException String.format字体%s、unicode、char unicode、getName中的U+%04X%c没有字形; } 返回编码符号idcid; } ... } org.apache.pdfbox.pdmodel.font.PDCIDFontType2

如果PDFBox无法在cid==-1的情况下确定从Unicode到glyph代码的映射,则JavaDoc注释指示确定glyph代码的另一种方法,即ToUnicode映射的反向查找。如果实现了这一点,PDFBox可能已经确定了一个glyph ID并写入了您的文本


不幸的是,它还没有实现。

这一问题已经解决。这将在PDFBox 2.0.23中提供,在此之前,这已在发行中得到修复。这将在PDFBox 2.0.23中提供,在此之前,将在a中提供。

您的测试代码在帮助解决此问题方面非常有用。您的测试代码在帮助解决此问题方面非常有用。好消息!谢谢你的更新。好消息!谢谢你的更新。
stream.beginText();
stream.setFont(fonts.get(0), 12);
stream.setTextMatrix(Matrix.getTranslateInstance(20, 50));
stream.showText("Protokol");
stream.endText();