如何使用PDFBOX检查完全嵌入和子集嵌入字体

时间:2014-01-27 21:49:05

标签: java pdf pdfbox font-embedding

您好我想使用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;
}

但似乎我无法找出如何区分完全嵌入或子集嵌入。 有人可以给我答案吗?

1 个答案:

答案 0 :(得分: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创建软件可能不会注意到这一事实并将其命名为完全嵌入的字体。所以从本质上讲,你永远无法确定。