iText setRotateContents (false) странное поведение в альбомной ориентации PDF? - PullRequest
3 голосов
/ 17 июня 2011

Я объединил несколько файлов PDF, некоторые из которых были альбомными.Сейчас я проштампую каждую страницу окончательного PDF.

Я понял, что если вы не используете setRotateContents(false), ваша модификация будет добавлена ​​при -90 градусах к ожидаемому значению.За исключением того, что некоторые из моих альбомных страниц фактически корректно позиционируют модификацию на этом этапе в 0 градусов.

Если я использую setRotateContents(false), то все эти модификации поворачиваются по часовой стрелке на 90 градусов, что означает, что большинство моих модификаций страниц на альбомных страницахтеперь исправьте в 0 градусов, но некоторые из моих альбомных страниц теперь в +90 градусах.

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

1 Ответ

2 голосов
/ 20 июня 2011

Существует 3 различных способа создания альбомной страницы, и используются все три (здесь я использую 8.5x11, YMMV):

  1. 11x8,5 (это страницы, которые "выглядят правильно".
  2. 8,5x11 90 по часовой стрелке
  3. 8,5x11 90 против часовой стрелки

Так что вам нужно проверить поворот страницы.

int rot = PdfReader.getPageRotation(pageNum);

Если вы хотите, чтобы ваш штамп получился «четным», вам нужно преобразовать его на основе этого вращения. Базовое преобразование выглядит примерно так:

cos(rot), sin(rot), -sin(rot), cos(rot), xoff, yoff

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

  1. Переместите ваш объект так, чтобы он был в центре источника.
  2. Поворот
  3. Переместить его назад.

Когда вы объединяете эти три отдельных преобразования в правильном порядке, вы получаете одно преобразование, которое делает именно то, что вы хотите.

Или вы могли бы обмануть и использовать AffineTransform.getRotateInstance( theta, centerX, centerY), но где в этом удовольствие? PdfContentByte.transform(AffineTransform) будет высасывать массив за вас, но все элементы расположены в правильном порядке, чтобы просто передать их любой из байтовых функций содержимого, которые принимают преобразование в виде шести операций с плавающей запятой (параметры обычно называются чем-то вроде «a, b»). , c, d, h, v ").

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...