【问题标题】:Detect missing / corrupt Unicode mapping in PDF检测 PDF 中丢失/损坏的 Unicode 映射
【发布时间】:2019-03-17 15:23:56
【问题描述】:

从某些 PDF 中提取文本时,PDFBox 返回乱码。 这是因为 Unicode 映射丢失或损坏。 我可以在控制台上看到以下警告。 我希望能够检测到这一点,以便能够将这些 PDF 标记为已损坏。

我正在寻找比解析日志更好的解决方案。

感谢您的帮助!

示例控制台日志:

WARNING: No Unicode mapping for CID+32 (32) in font F6
WARNING: Failed to find a character mapping for 32 in TimesNewRoman,Bold

下面提到的帖子也谈到了同样的问题,但没有谈到能够在代码端检测到这个问题并进行处理的方法:Issue with reading some unicode characters out of a PDF using PDFBox

【问题讨论】:

  • 有几种不同的方式来使用 PDFBox,你能分享一下你是如何运行它的吗?请参阅minimal reproducible example 获取帮助,包括大量代码,以便想要回答您问题的人可以重现您的问题并更好地帮助您。
  • 正如@DavyM 提到的,请提供一些代码来展示您如何使用 PDFBox,并尽可能地说明哪部分代码失败
  • @Magpies3 改善您的问题的信息,例如该代码,以及应将其他研究编辑到您的问题中,而不是作为 cmets 放置。这样,回答您问题的所有信息都位于问题本身中。
  • 对不起。尝试覆盖showGlyph()
  • 感谢 Tilman 成功了,我能够覆盖此方法并获取缺少 unicode 的字体和代码信息。

标签: java pdf unicode fonts pdfbox


【解决方案1】:

第四种可能性(在 Aaron Digulla 答案中给出的三个旁边)是在扩展 PDFTextStripper 类时覆盖 showGlyph()

protected void showGlyph(Matrix textRenderingMatrix, PDFont font, int code, String unicode, Vector displacement) throws IOException
{
    super.showGlyph(textRenderingMatrix, font, code, unicode, displacement);
    if (unicode == null || unicode.isEmpty())
    {
        // do stuff
    }
}

【讨论】:

    【解决方案2】:

    我看到这些解决方案,都有些乱。

    解决方案 #1:将您自己的过滤器安装到记录器。过滤器可以检查日志消息并设置线程本地标志。调用getText() 后检查标志。不要忘记删除标志,否则您的线程本地地图将填满。

    您可以用支持 MDC 的其他东西(例如 logback)替换公共日志记录。然后,您可以将标志放入 MDC。

    解决方案 #2:修补 PDFbox 的来源。在 PDSimpleFontPDType0Font 类中添加一个 getter:

    public boolean hadEncodingProblems() {
        return !noUnicode.isEmpty();
    }
    

    调用getText()后应该有办法获取所有字体。

    解决方案 #3:使用反射读取字段值(感谢 mkl)。请注意,这可能会因新的 Java 版本或 SecurityManager 是安装程序或激活默认安装程序而中断。

    【讨论】:

    • 是的,我也在考虑类似的路线,但想检查是否有人对更清洁的解决方案有建议。感谢您的意见,在我将其标记为已关闭之前,将等待看看是否有其他人有建议。
    • 另一种方法可能是应用反射来访问那些noUnicode 变量。
    猜你喜欢
    • 2020-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-20
    • 1970-01-01
    • 2014-12-04
    • 1970-01-01
    • 2012-04-13
    相关资源
    最近更新 更多