【问题标题】:PDFBox ERROR Could not load font filePDFBox 错误无法加载字体文件
【发布时间】:2018-03-09 04:31:31
【问题描述】:

我不确定这是否是 PDFBox 问题。但提及它可能有助于理解我的问题。

所以我收到了很多来自 PDFBox 的警告:

WARN  No Unicode mapping for a37 (37) in font TCBLZV+LCIRCLE10

这是百分之一。

所以我决定添加 LCRICLE10 字体和警告列表中提到的其他字体。

这是我下载的字体:

这是我得到的 PDFBox 错误:

5517 ERROR Could not load font file: /home/$USER/.fonts/bakoma/pfb/eurb9.pfb
5518 java.io.IOException: Found Token[kind=NAME, text=dup] but expected INTEGER
5519    at org.apache.fontbox.type1.Type1Parser.read(Type1Parser.java:812)
5520    at org.apache.fontbox.type1.Type1Parser.readEncoding(Type1Parser.java:226)
5521    at org.apache.fontbox.type1.Type1Parser.parseASCII(Type1Parser.java:135)
5522    at org.apache.fontbox.type1.Type1Parser.parse(Type1Parser.java:61)
5523    at org.apache.fontbox.type1.Type1Font.createWithPFB(Type1Font.java:56)
5524    at org.apache.pdfbox.pdmodel.font.FileSystemFontProvider.addType1Font(FileSystemFontProvider.java:646)
5525    at org.apache.pdfbox.pdmodel.font.FileSystemFontProvider.scanFonts(FileSystemFontProvider.java:255)
5526    at org.apache.pdfbox.pdmodel.font.FileSystemFontProvider.<init>(FileSystemFontProvider.java:225)
5527    at org.apache.pdfbox.pdmodel.font.FontMapperImpl$DefaultFontProvider.<clinit>(FontMapperImpl.java:130)
5528    at org.apache.pdfbox.pdmodel.font.FontMapperImpl.getProvider(FontMapperImpl.java:149)
5529    at org.apache.pdfbox.pdmodel.font.FontMapperImpl.findFont(FontMapperImpl.java:413)
5530    at org.apache.pdfbox.pdmodel.font.FontMapperImpl.findFontBoxFont(FontMapperImpl.java:376)
5531    at org.apache.pdfbox.pdmodel.font.FontMapperImpl.getFontBoxFont(FontMapperImpl.java:350)
5532    at org.apache.pdfbox.pdmodel.font.PDType1Font.<init>(PDType1Font.java:146)
5533    at org.apache.pdfbox.pdmodel.font.PDType1Font.<clinit>(PDType1Font.java:79)
5534    at org.apache.pdfbox.pdmodel.font.PDFontFactory.createFont(PDFontFactory.java:62)
5535    at org.apache.pdfbox.pdmodel.PDResources.getFont(PDResources.java:143)
5536    at org.apache.pdfbox.contentstream.operator.text.SetFontAndSize.process(SetFontAndSize.java:60)
5537    at org.apache.pdfbox.contentstream.PDFStreamEngine.processOperator(PDFStreamEngine.java:838)
5538    at org.apache.pdfbox.contentstream.PDFStreamEngine.processStreamOperators(PDFStreamEngine.java:495)
5539    at org.apache.pdfbox.contentstream.PDFStreamEngine.processStream(PDFStreamEngine.java:469)
5540    at org.apache.pdfbox.contentstream.PDFStreamEngine.processPage(PDFStreamEngine.java:150)
5541    at org.apache.pdfbox.text.LegacyPDFStreamEngine.processPage(LegacyPDFStreamEngine.java:139)
5542    at org.apache.pdfbox.text.PDFTextStripper.processPage(PDFTextStripper.java:391)
5543    at org.apache.tika.parser.pdf.PDF2XHTML.processPage(PDF2XHTML.java:147)
5544    at org.apache.pdfbox.text.PDFTextStripper.processPages(PDFTextStripper.java:319)
5545    at org.apache.pdfbox.text.PDFTextStripper.writeText(PDFTextStripper.java:266)
5546    at org.apache.tika.parser.pdf.PDF2XHTML.process(PDF2XHTML.java:117)
5547    at org.apache.tika.parser.pdf.PDFParser.parse(PDFParser.java:168)
5548    at org.apache.tika.parser.CompositeParser.parse(CompositeParser.java:280)
5549    at org.apache.tika.parser.CompositeParser.parse(CompositeParser.java:280)
5550    at org.apache.tika.parser.AutoDetectParser.parse(AutoDetectParser.java:143)
5551    at org.apache.tika.cli.TikaCLI$OutputType.process(TikaCLI.java:205)
5552    at org.apache.tika.cli.TikaCLI.process(TikaCLI.java:486)
5553    at org.apache.tika.cli.TikaCLI.main(TikaCLI.java:145)

这是许多其他人中的一个。

这是一个小清单:

ERROR Could not load font file: /home/$USER/.fonts/bakoma/pfb/eufm6.pfb
ERROR Could not load font file: /home/$USER/.fonts/bakoma/pfb/euex9.pfb
ERROR Could not load font file: /home/$USER/.fonts/bakoma/pfb/eusm10.pfb
ERROR Could not load font file: /home/$USER/.fonts/bakoma/pfb/cmmi7.pfb
ERROR Could not load font file: /home/$USER/.fonts/bakoma/pfb/msam6.pfb

他们似乎都来自:.fonts/bakoma/pfb/

当我使用 FireFox 时,我看到了这个:

我从 ~/.fonts/ 中删除了字体并清除了字体缓存,现在一切都恢复正常了。

【问题讨论】:

    标签: linux fonts pdfbox


    【解决方案1】:

    “警告无 Unicode 映射”消息仅在您进行文本提取时才相关,即您的文本对于该字形将一无所有,因为缺少 Unicode 映射。 “TCBLZV+LCIRCLE10”表示嵌入的字体子集,因此无论如何添加字体都无济于事。另见: https://pdfbox.apache.org/2.0/faq.html#notext

    所以你真正的问题到此为止,加载字体并没有变得更好,除非你在使用非嵌入字体时遇到问题。

    错误“Found Token[kind=NAME, text=dup] but expected INTEGER”表示解析类型 1 字体时出错。这可能是字体中的语法错误,或 PDFBox type 1 字体解析器中的错误。我比较怀疑后者,因为 type 1 字体是基于 PostScript 的,而 PDFBox 解析器只能识别它的一个子集。

    更新:我查看了 eurb9.pfb 字体。就像我怀疑的那样,字体的 ASCII 部分有一个计算(“dup dup 161 10 getinterval 0 exch putinterval dup dup 173 23 getinterval 10 exch putinterval dup 127 exch 196 get put readonly def”),我们无法解析它。我们自己的类型 1 解析器只能解析不计算的元素。 (这仍然涵盖了 99% 的 type1 字体)

    【讨论】:

    • 为什么我的 Linux 系统搞砸了字体?是因为它像 PDFBox 一样只支持 OpenType 的一个子集吗? (顺便说一句,我删除了这些字体,所以现在一切正常。我只是好奇。)谢谢你这么长的回答!
    • 我不是 Linux 专家,所以我无法回答这个问题,抱歉。
    • 这个 PDFBox 项目有票吗? (我不知道在 JIRA 中用什么关键字来搜索这个)
    • “Linux 上的火狐搞砸了”不是 PDFBox 问题。 type1 解析问题是一个 PDFBox 问题,但由于我们不会编写 PostScript 解释器,所以无法解决。如果您想使用这些字体创建 PDF,请使用它们的 TrueType 版本。缺少的 unicode 不是错误,那是您的 PDF 没有 unicode 映射或错误的映射。有时这样做是为了防止文本提取。
    • 对于第一部分,我猜得这么多。感谢您提供额外的信息。真的很感激。一个想法是我必须将字体格式更改为 PDFBox 可以理解的另一种字体格式(我没有制作 PDF)。因为由于我使用的是 Tika,所以我正在考虑使用 Tesseract 或 Tensorflow 来提取无法识别的元素。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-22
    • 1970-01-01
    • 2020-02-03
    • 2011-04-10
    • 1970-01-01
    • 1970-01-01
    • 2015-09-19
    相关资源
    最近更新 更多