Получить точное положение строки в PDF, которое будет использоваться позже для его изменения - PullRequest
0 голосов
/ 30 декабря 2018

На основании ответа на вопрос Получить точное расположение строк в PDF Теперь я могу получить все строки в файле PDF.Пожалуйста, взгляните на код:

PdfReader reader = new PdfReader("file.pdf");
RenderListener listener = new MyTextRenderListener();

PdfReaderContentParser parser = new PdfReaderContentParser(reader);
parser.processContent(1, listener);

static class MyTextRenderListener implements RenderListener {

        @Override
        public void renderText(TextRenderInfo renderInfo) {
            String text = renderInfo.getText(); // line with text
        }

        @Override
        public void beginTextBlock() { }

        @Override
        public void endTextBlock() { }

        @Override
        public void renderImage(ImageRenderInfo renderInfo) { }
}

мкл в своем ответе писал:

если ваш RenderListener вПомимо проверки текста с помощью getText() также учитываются getBaseline() или даже getAscentLine() и getDescentLine()., у вас есть все координаты, которые вам, вероятно, понадобятся.

Фактически, TextRenderInfo имеет несколько экземпляров класса LineSegment , которые дают своего рода координаты.Как использовать эти координаты (путем преобразования или извлечения соответствующих значений) для подготовки объекта Rectangle , чтобы можно было удалить найденный текст?Прямоугольный объект имеет четыре координаты, которые описывают положение данного текста.

Пример удаления строк (т.е. редактирование) с помощью объекта Rectangle можно найти в SO ( Удаление текстовых вхождений, содержащихся взаданная область с iText )

ОБНОВЛЕНИЕ

Мне удалось сделать то, что я хотел, методом проб и ошибок, но я считаю, что это обходной путь, а не правильныйрешение.

@Override
public void renderText(TextRenderInfo renderInfo) {
    LineSegment baseline = renderInfo.getBaseline();
    float x = baseline.getStartPoint().get(Vector.I1);
    float y = baseline.getStartPoint().get(Vector.I2);
    float xx = baseline.getEndPoint().get(Vector.I1);
    float yy = baseline.getEndPoint().get(Vector.I2);
    rectangle = new Rectangle(x, yy, xx, y + 5);
}

Теперь у меня есть объект Rectangle (обратите внимание, что я добавляю 5 к одной из его координат, играя с координатами, чтобы они покрывали всю строку), и теперь я могу редактировать текст.Он отлично работает для однотонных цветов (например, белого), когда изображение отсутствует.Если текст на изображении или цвет страницы отличается от черного, произойдет сбой.Вот почему я описываю свое решение как обходной путь. Для меня было бы лучше очистить текст (замените его пустой строкой).Как это можно сделать?

Ответ на комментарий mkl Не уверен, правильно ли я это сделал:

LineSegment descentLine = renderInfo.getDescentLine();
float x = descentLine.getStartPoint().get(Vector.I1);
float y = descentLine.getStartPoint().get(Vector.I2);
float xx = descentLine.getEndPoint().get(Vector.I1);
float yy = descentLine.getEndPoint().get(Vector.I2);
rectangle = new Rectangle(xx, yy, x, y);

Я также использовалвосхождение так же.К сожалению, ничего из этого не сработало.

1 Ответ

0 голосов
/ 02 января 2019

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

Вместо этого вы должны использовать линии спуска и подъема!

Например, при условии упрощенного случая текста, нарисованного вертикально:

LineSegment ascentLine = renderInfo.getAscentLine();
LineSegment descentLine = renderInfo.getDescentLine();
float llx = descentLine.getStartPoint().get(Vector.I1);
float lly = descentLine.getStartPoint().get(Vector.I2);
float urx = ascentLine.getEndPoint().get(Vector.I1);
float ury = ascentLine.getEndPoint().get(Vector.I2);
rectangle = new Rectangle(llx, lly, urx, ury);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...