2013-08-06 2 views
0

При размещении объектов на странице pdf с использованием абсолютного позиционирования (в пределах PdfContentByte, я угадываю?), Он расположен в системе координат, которая начинается в левом нижнем углу.Как перевернуть систему координат в iText?

Я хотел бы перевернуть координаты таким образом, чтобы система начиналась в верхнем левом углу. Я бы сделал flipping перед добавлением любого контента на страницу.

Я попытался с помощью этого

cb.concatCTM(1f, 0f, 0f, -1f, 0f, PageSize.A4.getHeight());

, но объекты, добавленные позже переворачивали (то, что я не хотел бы случиться).

+0

Если вы переверните системы координат в PDF-файлах, вы также автоматически переверните содержимое. Если вы просто хотите получить начало в левом верхнем углу и можете работать с отрицательными координатами y, простой перевод выполнит эту работу. – mkl

ответ

2

В случаях, когда вам необходимо, чтобы система координат находилась в верхнем левом углу, пользователь может использовать простую математику для изменения координат. Использование другой CTM для этой цели является более сложным и может привести ко всем видам побочных эффектов, как вы себя пережили. Например: вращение CTM также поворачивает содержимое (текст может быть перевернутым, зеркальным, ...).

Почему бы просто не использовать метод, который пересчитывает координаты. Например: вы хотите иметь координаты (10, 10), считая от верхней части страницы, а затем используйте преобразование (размер_страницы, у), где метод преобразования определяются следующим образом:

public float transform(Rectangle pagesize, float y) { 
    return pagesize.top() - y; 
} 

Таким образом, вы можете делать такие вещи, как:

float x = 50; 
float y = transform(pagesize, 50); 
table.writeSelectedRows(0, 10, x, y, canvas); 

Лично я считаю, что это плохая идея, чтобы не уважать систему координат, как это определено в ISO-32000-1, потому что вы предпочитаете работать с нечетным системе координат, где все большее значение Y указывают вниз, а (это настолько противоречиво), но если вы настаиваете на этом, вы не должны вмешиваться в CTM, если ваш PDF-файл действительно большой.

+1

Спасибо! Я закончил делать это ... Ну, это все для моего маленького проекта, и поскольку я читаю сверху вниз, а не наоборот, исходные настройки были непротиворечивыми (для такого любителя, как я) ... Кроме того, я не верьте, что кто-то будет читать мой код, кроме меня. : D – Karlovsky120

+0

Все, что лучше всего подходит для вас, все в порядке ;-) –

3

Любое преобразование применить к PDF системе координат не только изменить способ вы можете поставить координаты некоторой точки на странице; вместо этого он также изменяет систему координат, в которую обращается объект PDF Viewer. Например.

Figure 13 - Effects of Coordinate Transformations

(раздел 8.3.3 Общие Трансформации в ISO 32000-1)

Если вы флип координаты в каком-то смысле система начинается в верхнем левом углу, поэтому, вы также flip предметы dra шп. В случае текстовых объектов вы можете локально отменить переворачивание с помощью текстовых матриц, отбрасываемых на месте.

Это означает, что это довольно хлопот. Если бы вместо этого было достаточно иметь начало в верхнем левом углу с отрицательными координатами y на странице, я бы предложил вам просто перевести систему координат.

0

Прежде всего: простите мой английский.Я ИСПАНСКИЙ GUY XD

Вот мое решение:

Я искал то же самое. Я хотел, чтобы точка начала в верхнем левом углу.

Ну, вы не можете изменить его, но вы можете сделать другое.

Если вы хотите, чтобы высота каждой страницы, вы должны получить обрезку страницы из класса PdfReader.

Так, например, если вы хотите получить вертикальное положение «у = 60» considerating начало координат в левом верхнем углу вы должны сделать это:

PdfReader reader = new PdfReader("yourFile.pdf"); 
Float y = reader.getCropBox(pageNumber).getHeight()-60; 

Это очень полезно в случае, если имеют документ pdf с разной высотой страниц.

Смежные вопросы