当我在两个pdf文件中打印TextRenderInfo.getFont().getPostscriptFontName()时,它将打印AAAAAD+SourceHanSansCN-Normal和BIISMY+SourceHanSansCN-Normal.
我知道SourceHanSansCN-Normal是FontName-FontScript的格式,但是AAAAAD是什么?不像字体系列。
示例代码:
public class CheckPdfAllFontTest implements TextExtractionStrategy {
public static final String SRC = "ownTestFile.pdf";
@Override
public String getResultantText() {
return null;
}
@Override
public void beginTextBlock() {
}
@Override
public void renderText(TextRenderInfo textRenderInfo) {
String x = textRenderInfo.getFont().getPostscriptFontName();
String text = textRenderInfo.getText();
System.out.println(text + "=====" + x);
}
@Override
public void endTextBlock() {
}
@Override
public void renderImage(ImageRenderInfo imageRenderInfo) {
}
public static void main(String[] args) throws IOException, DocumentException {
new CheckPdfAllFontTest().parse(SRC);
}
public void parse(String filename) throws IOException, IOException {
int pageNumber = 1;
PdfReader reader = new PdfReader(filename);
System.out.println(PdfTextExtractor.getTextFromPage(reader, pageNumber, new CheckPdfAllFontTest()));
reader.close();
}
}
itext pdf版:
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.8</version>
</dependency>
这两个 pdf 是从 Power Point 文件导出的,带有“嵌入字体”和“不嵌入字体”设置。
我正在收集pdf中使用的字体,但我发现有这种格式的字体。我不知道'+'之前是什么。它的定义是什么?
根据PDF规范:
9.9.2 字体子集
PDF 文档可能包含 Subtype 为 Type1、TrueType 或 OpenType 的 PDF 字体子集。描述字体子集的字体和字体描述符与普通字体略有不同。这些差异允许 PDF 处理器识别字体子集并合并包含相同字体的不同子集的文档。 (有关字体描述符的更多信息,请参阅 9.8,“字体描述符”。)
对于字体子集,字体的 PostScript 名称,即字体的 BaseFont 条目和字体描述符的 FontName 条目的值,应以标记开头,后跟加号 (+),然后是从中创建子集的字体的 PostScript 名称。标签应由六个大写字母组成;字母的选择是任意的,但同一个PDF文件中相同字体的不同子集应该有不同的标签。字形名称 .notdef 应在字体子集中定义。
注意建议 PDF 处理器将多个子集字体视为完全独立的实体,即使它们看起来是从相同的原始字体创建的。
EXAMPLE EOODIA+Poetica 是 Type 1 字体 Poetica® 子集的名称。
(ISO 32000-2)
因此,AAAAAD+SourceHanSansCN-Normal 和 BIISMY+SourceHanSansCN-Normal 很可能是同一源字体的不同子集。