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

时间:2019-03-17 15:23:56

标签: java pdf unicode fonts pdfbox

从某些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

2 个答案:

答案 0 :(得分:3)

第四种可能性(除了Aaron Digulla给出的三种可能性之外)是在扩展showGlyph()类时覆盖PDFTextStripper

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
    }
}

答案 1 :(得分:2)

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

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

您可以使用支持MDC的其他方式(例如,登录)来替换公用日志。然后,您可以将标记放在MDC中。

解决方案2:修补PDFbox的来源。在类PDSimpleFontPDType0Font中添加吸气剂:

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

应该有一种方法可以在调用getText()之后获取所有字体。

解决方案3:使用反射读取字段值(对mkl表示敬意)。请注意,这可能会因Java新版本而中断,或者在安装SecurityManager或激活默认版本时中断。