Обнаружение отсутствующего / поврежденного отображения Unicode в PDF - PullRequest
3 голосов
/ 17 марта 2019

При извлечении текста из некоторых 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

В приведенном ниже посте также говорится об этой же проблеме, но не говорится о способах ее обнаружения на стороне кода и ее обработки: Ошибка чтения некоторых символов Юникода из PDF с помощью PDFBox

Ответы [ 2 ]

3 голосов
/ 20 марта 2019

Четвертая возможность (рядом с тремя, указанными в ответе Аарона Дигуллы) - переопределить 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
    }
}
2 голосов
/ 18 марта 2019

Я вижу эти решения, оба немного грязные.

Решение № 1: Установите свой собственный фильтр в логгер. Фильтр может проверить сообщение журнала и установить локальный флаг потока. Проверьте флаг после звонка getText(). Не забудьте удалить флаг, иначе ваша локальная карта будет заполнена.

Вы можете заменить регистрацию общего ресурса чем-то другим, например, logback, который поддерживает MDC . Затем вы можете поставить флаг в MDC.

Решение № 2: Исправить источники PDFbox. В классах PDSimpleFont и PDType0Font добавьте геттер:

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

Должен быть способ получить все шрифты после вызова getText().

Решение № 3: Используйте отражение, чтобы прочитать значение поля (слава мкл ). Обратите внимание, что это может нарушиться с новыми версиями Java или когда SecurityManager является установщиком или активирована версия по умолчанию.

...