使用 PDFTextStripper.getText() 时出现 PDFBox "Symbolic fonts must have a built-in encoding" 错误

PDFBox "Symbolic fonts must have a built-in encoding" error when using PDFTextStripper.getText()

我正在使用 Apache PDFBox 2.0.2。 从网络加载 pdf 文档以获取其中的文本。

URL u = new URL("url/to/file.pdf");
PDDocument pddDocument = PDDocument.load(u.openStream());

PDFTextStripper textStripper = new PDFTextStripper();
String doc = textStripper.getText(pddDocument);

问题是,有时我会遇到 IllegalArgumentException: "Symbolic fonts must have a built-in encoding" 并且无法从 PDF 中提取文本。

请帮忙。

正如@Tilman 在 PDFBox Jira 中打开一个错误问题所指出的,此行为是一个错误:

DictionaryEncoding 构造函数使用 Encoding.getInstance 检索字体基本编码的 Encoding 实例,并且很清楚此方法可能 return null:

base = Encoding.getInstance(name); // may be null

如果它是 null,但 PDFBox 无法确定字体的内置编码,则会抛出观察到的异常:

throw new IllegalArgumentException("Symbolic fonts must have a built-in " + 
                                   "encoding");

在本例中,基本编码是 MacExpertEncoding,它是 PDF 规范明确命名的可能基本编码之一。不幸的是 Encoding.getInstance 不知道这种编码,因此 returns null 反过来触发异常,因为 PDFBox 也无法识别内置编码。


因此,修复应该包括为 MacExpertEncoding 添加 Encoding class 并相应地扩展 Encoding.getInstance

此外,应该考虑根本不抛出异常:有许多情况不需要隐式或显式基本编码,例如如果 Differences 明确地为每个字符代码提供映射,或者(在纯文本提取的情况下)如果字体具有良好的 ToUnicode table.