如何检查完全嵌入和使用PDFBOX子集嵌入字体(How to check Fully embedde

2019-10-19 06:30发布

您好我要检查使用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;
}

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

Answer 1:

引述PDF规范ISO 32000-1的字体子集(第9.6.4):

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

对于字体集,字体的Postscript名称-字体的BASEFONT条目和字体描述的FONTNAME项的值-应使用标签后跟一个加号(+)开头。 标签应包括正好六个大写字母; 字母的选择是任意的,但在同一个PDF文件不同的子集应具有不同的标签。

实施例EOODIA + Poetica是Poetica®,类型1的字体的一个子集的名称。

在PDF跟进这一要求(“应”,所以这真的是一个要求)你,因此,可以通过其名称识别子集字体。

请记住,虽然,PDF文件之外,你可以通过只包括选择的图形导出从另一个字体。 这本质上创建了一个子集字体,但一个PDF创建软件,利用它可能没有注意到这一事实,并将其命名为完全嵌入字体。 因此,在本质你永远无法知道。



文章来源: How to check Fully embedded and subset embedded font using PDFBOX