1

嗨,我想使用 PDFBOX 检查 PDF 中字体的完全嵌入和子集嵌入。我尝试使用以下逻辑进行检查:


private boolean IsEmbedded(Map<String, PDFont> fontsMap, Set<String> keys) {
    for(String key:keys) {
        PDFont font = fontsMap.get(key);
        PDFontDescriptor  fontDescriptor = font.getFontDescriptor();
        if(null != fontDescriptor && fontDescriptor instanceof PDFontDescriptorDictionary){
            PDFontDescriptorDictionary fontDescriptorDictionary = (PDFontDescriptorDictionary)fontDescriptor;
            if(null == fontDescriptorDictionary.getFontFile() && null == fontDescriptorDictionary.getFontFile2() && null == fontDescriptorDictionary.getFontFile3())
                return false;
        }
    }
    return true;
}

但似乎我无法找出如何区分完全嵌入或子集嵌入。谁能给我答案?

4

1 回答 1

1

要引用关于字体子集的 PDF 规范ISO 32000-1 (第 9.6.4 节):

PDF 文档可能包含 Type 1 和 TrueType 字体的子集。描述字体子集的字体和字体描述符与普通字体略有不同。这些差异允许符合标准的阅读器识别字体子集并合并包含相同字体的不同子集的文档。(有关字体描述符的更多信息,请参阅 9.8,“字体描述符”。)

对于字体子集,字体的 PostScript 名称——字体的BaseFont条目和字体描述符的FontName条目的值——应以标记开头,后跟加号 (+)。标签应由六个大写字母组成;字母的选择是任意的,但是同一个 PDF 文件中的不同子集应该有不同的标签。

示例 EOODIA+Poetica 是 Poetica® 子集的名称,一种 Type 1 字体。

因此,在满足此要求的 PDF 中(“应该”,因此确实是一个要求),您可以通过名称识别子集字体。

但请记住,在 PDF 之外,您可以通过仅包含选定的字形从另一个字体派生字体。这实际上创建了一个子集字体,但使用它的 PDF 创建软件可能不会注意到这一事实并将其命名为完全嵌入的字体。所以本质上你永远无法确定。

于 2014-01-28T08:06:51.000 回答