您好,我想使用 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;
}
但似乎我无法找出如何区分完全嵌入或子集嵌入。
谁能给我答案吗?
引用PDF规范ISO 32000-1 http://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/PDF32000_2008.pdf关于字体子集(第 9.6.4 节):
PDF 文档可能包含 Type 1 和 TrueType 字体的子集。描述字体子集的字体和字体描述符与普通字体略有不同。这些差异允许合格的读者识别字体子集并合并包含相同字体的不同子集的文档。 (有关字体描述符的更多信息,请参阅第 9.8 节“字体描述符”。)
对于字体子集,字体的 PostScript 名称 — 字体的值BaseFont条目和字体描述符FontName条目 — 应以标签开头,后跟加号 (+)。标签应由六个大写字母组成;字母的选择是任意的,但同一PDF文件中的不同子集应具有不同的标签。
示例 EOODIA+Poetica 是 Poetica®(一种 1 类字体)子集的名称。
因此,在遵循此要求(“应”,因此这确实是一个要求)的 PDF 中,您可以通过名称识别子集字体。
但请记住,在 PDF 之外,您可以通过仅包含选定的字形从另一种字体派生字体。这本质上创建了一个子集字体,但使用它的 PDF 创建软件可能不会注意到这一事实并将其命名为完全嵌入的字体。所以本质上你永远无法确定。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)