Насколько я понимаю требования здесь, ОП работает в системе координат с началом координат в верхнем левом углу видимой страницы (с учетом поворота страницы), x координаты увеличиваются досправа, y координаты увеличиваются вниз, а единицами измерения являются единицы пространства пользователя по умолчанию в формате PDF (обычно 1 / 72 дюйм).
В этой системе координат ему нужно извлечь (горизонтальные или вертикальные) линии в виде
- координат левой / верхней конечной точки и
- ширина / высота.
Преобразование LineCatcher
результаты
Вспомогательный класс LineCatcher
, полученный им от Тилмана, с другой стороны, не учитывает ротацию страниц.Кроме того, он возвращает нижнюю конечную точку для вертикальных линий, а не верхнюю конечную точку.Таким образом, преобразование координат должно применяться к результатам LineCatcher
.
. Для этого просто замените
for(Rectangle2D rect:rectList) {
String pageNum = Integer.toString(n + 1);
String x = Double.toString(rect.getX());
String y = Double.toString(page_height - rect.getY()) ;
String w = Double.toString(rect.getWidth());
String h = Double.toString(rect.getHeight());
writeToFile(pageNum, x, y, w, h, osw);
}
на
int pageRotation = page.getRotation();
PDRectangle pageCropBox = page.getCropBox();
for(Rectangle2D rect:rectList) {
String pageNum = Integer.toString(n + 1);
String x, y, w, h;
switch(pageRotation) {
case 0:
x = Double.toString(rect.getX() - pageCropBox.getLowerLeftX());
y = Double.toString(pageCropBox.getUpperRightY() - rect.getY() + rect.getHeight());
w = Double.toString(rect.getWidth());
h = Double.toString(rect.getHeight());
break;
case 90:
x = Double.toString(rect.getY() - pageCropBox.getLowerLeftY());
y = Double.toString(rect.getX() - pageCropBox.getLowerLeftX());
w = Double.toString(rect.getHeight());
h = Double.toString(rect.getWidth());
break;
case 180:
x = Double.toString(pageCropBox.getUpperRightX() - rect.getX() - rect.getWidth());
y = Double.toString(rect.getY() - pageCropBox.getLowerLeftY());
w = Double.toString(rect.getWidth());
h = Double.toString(rect.getHeight());
break;
case 270:
x = Double.toString(pageCropBox.getUpperRightY() - rect.getY() + rect.getHeight());
y = Double.toString(pageCropBox.getUpperRightX() - rect.getX() - rect.getWidth());
w = Double.toString(rect.getHeight());
h = Double.toString(rect.getWidth());
break;
default:
throw new IOException(String.format("Unsupported page rotation %d on page %d.", pageRotation, page));
}
writeToFile(pageNum, x, y, w, h, osw);
}
( ExtractLinesWithDir test testExtractLineRotationTestWithDir
)
Отношение к TextPosition.get?DirAdj()
координатам
OP описывает координаты, ссылаясь на методы класса TextPosition
getXDirAdj()
и getYDirAdj()
.Действительно, эти методы возвращают координаты в системе координат с началом координат в верхнем левом углу страницы, а координаты y увеличиваются вниз после поворота страницы, так что текст рисуется вертикально .
В случае примера документа весь текст рисуется так, чтобы он был в вертикальном положении после применения поворота страницы.Из этого было получено мое понимание требования, написанного вверху.
Проблема с использованием значений TextPosition.get?DirAdj()
в качестве координат в глобальном масштабе, однако, заключается в том, что в документах со страницами, текст которых нарисован в разных направлениях,собранные текстовые координаты внезапно относятся к разным системам координат.Таким образом, общее решение не должно собирать координаты так дико.Вместо этого он должен сначала определить ориентацию страницы (например, ориентацию, заданную поворотом страницы или ориентацию, разделяемую большей частью текста) и использовать координаты в фиксированной системе координат, заданной этой ориентацией, плюс указание направления письма текстакусок в вопросе.