使用 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.
我正在使用 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.