Существует 3 различных способа создания альбомной страницы, и используются все три (здесь я использую 8.5x11, YMMV):
- 11x8,5 (это страницы, которые "выглядят правильно".
- 8,5x11 90 по часовой стрелке
- 8,5x11 90 против часовой стрелки
Так что вам нужно проверить поворот страницы.
int rot = PdfReader.getPageRotation(pageNum);
Если вы хотите, чтобы ваш штамп получился «четным», вам нужно преобразовать его на основе этого вращения. Базовое преобразование выглядит примерно так:
cos(rot), sin(rot), -sin(rot), cos(rot), xoff, yoff
Вращение происходит вокруг начала координат , 0,0. Вам нужно xoff
и yoff
, чтобы переместить штамп обратно туда, куда вы хотите. Поскольку вы можете комбинировать преобразования, один общий трюк:
- Переместите ваш объект так, чтобы он был в центре источника.
- Поворот
- Переместить его назад.
Когда вы объединяете эти три отдельных преобразования в правильном порядке, вы получаете одно преобразование, которое делает именно то, что вы хотите.
Или вы могли бы обмануть и использовать AffineTransform.getRotateInstance( theta, centerX, centerY)
, но где в этом удовольствие? PdfContentByte.transform(AffineTransform)
будет высасывать массив за вас, но все элементы расположены в правильном порядке, чтобы просто передать их любой из байтовых функций содержимого, которые принимают преобразование в виде шести операций с плавающей запятой (параметры обычно называются чем-то вроде «a, b»). , c, d, h, v ").