检测 PDF 中丢失/损坏的 Unicode 映射

Detect missing / corrupt Unicode mapping in PDF

从某些 PDF 中提取文本时 PDFBox returns 出现乱码。 这是因为缺少或损坏的 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

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

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

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

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

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

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

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

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

第四种可能性(仅次于 Aaron Digulla 回答中给出的三种可能性)是在扩展 PDFTextStripper class:

时覆盖 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
    }
}