PDFBox 2.0: получить информацию о цвете в TextStripper - PullRequest
0 голосов
/ 28 июня 2018

Я использую PDFBox PDFTextStripper для извлечения текста. Мне также нужно получить информацию о цвете для каждого символа, в идеале в методе writeString . Я обнаружил, что это решение для PDFBox 1.8 (на самом деле его легко конвертировать в версию 2.0), и что мне еще нужно, так это цвет фона для каждого символа (так как в этом ответе есть только символ цвет). Я добавил все обработчики для операторов Fill - CloseFillNonZeroAndStrokePath, CloseFillEvenOddAndStrokePath FillNonZeroAndStrokePath, FillEvenOddAndStrokePath, LegacyFillNonZeroRule, операторы FillNonZ * * 100 * * *, не только *, но и другие *, такие как 100 * * * *

public final class FillEvenOddRule extends OperatorProcessor {
        @Override
        public void process(Operator operator, List<COSBase> operands) throws IOException {
            linePath.setWindingRule(GeneralPath.WIND_EVEN_ODD);
            deleteCharsInPath();
            linePath.reset();
            PDGraphicsState gs = getGraphicsState();    
            PDColor nonStrokingColor = gs.getNonStrokingColor();
            fillColor = nonStrokingColor.toRGB();
        }

        @Override
        public String getName() {
            return "f*";
        }
    }

Затем в processTextPosition Я попытался получить это fillColor и поместить его на карту для каждого символа (при условии, что поток контента работает последовательно - после завершения оператора Fill все последующие переходы к processTextPosition символов должны иметь это fillColor . Однако это не правда, и все символы имеют неправильный цвет. Есть файл Я пытаюсь В процессе обработки каждая вторая строка имеет синюю заливку, и я хотел бы получить этот синий цвет для каждого символа в такой строке и белый цвет для каждого символа в белой строке. Возможно ли это с PDFBox?

1 Ответ

0 голосов
/ 28 июня 2018

Проблема в контексте с примером документа

Затем в processTextPosition я попытался получить это fillColor и поместить его в карту для каждого символа (при условии, что поток контента работает последовательно - после завершения оператора Fill все последующие символы processTextPosition должны иметь это fillColor. Однако это не правда, и все персонажи имеют неправильный цвет.

Как вы узнали, ваше предположение неверно для данного PDF. Стратегия в этом документе состоит в том, чтобы сначала нарисовать весь справочный материал, а затем нарисовать весь текст. Таким образом, ваш подход к этому документу всегда должен возвращать цвет последнего бита фонового материала.

Как уже упоминалось в моем комментарии ко второму вопросу, на который вы здесь ссылались, вы должны собрать все прямоугольники (или, более обобщенно: пути), заполненные параллельно фактическому извлечению текста, и проверить, Цвет (ы) рендеринга шрифта (в зависимости от режима рендеринга текста это также может быть StrokingColor!) текущего проверяемого текста совпадает с цветом текущего заполненного пути в месте расположения текста.

В комментарии вы задаетесь вопросом

означает ли это, что этот подход будет работать для всех документов?

Работает ли этот подход для всех документов

Для многих это так, но не для всех.

На ум сразу приходят следующие вопросы:

  • Не все цветовые пространства поддерживают используемый вами метод toRGB. (Я только что проверил, я очень удивлен тем, сколько PDFBox имеет реализацию.)

    В частности, в случае цветов узора вам нужно много покопаться в узоре и использовать его в вашем случае, чтобы найти фактические цвета фона.

  • Есть и другие способы рисования фона, в частности:

    • Подход учитывает только заполненные пути, но если вы используете большее значение для ширины линии состояния графики или матрицы преобразования растяжения, штриховая линия также может рисовать прямоугольные формы. Таким образом, для этого случая вы также должны учитывать штриховые пути.

    • Фон может быть растровым изображением. В этом случае вам придется проанализировать изображение, чтобы получить цвет (ы) фона

    • Другой альтернативой для рассмотрения является заливка штриховкой. Обычно это также приводит к ряду цветов на заднем плане.

  • Формы, нарисованные над глифом впоследствии, вместо того, чтобы покрывать его, могут значительно изменить передний план и фон. Там, например, являются режимами наложения, которые берут оттенок на заднем плане и насыщенность на переднем плане ...

  • Мягкие маски, активные при рисовании фона или переднего плана, также могут представлять интерес.

  • ...

...