На основании ответа на вопрос Получить точное расположение строк в 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);
Я также использовалвосхождение так же.К сожалению, ничего из этого не сработало.