Так что мой вопрос, как именно делает setRotateContent() работает
Как немного фона вы должны знать, что каждая страница PDF содержит атрибут Rotate, который указан в качестве «The количество градусов, по которым страница должна поворачиваться по часовой стрелке при отображении или печати. Значение должно быть кратно 90. Значение по умолчанию: 0. "
Если вы хотите что-то добавить к странице, которая имеет значение нетривиальных Rotate (т.е. кратен 360), таким образом, существует две различных ситуации:
- Либо вы хотите добавьте что-то в положение и ориентацию относительно системы координат страницы, независимо от того, как страница будет в конечном счете повернута,
- или вы хотите добавить что-то в положение относительно того, как страница будет отображаться.
В то время как бывший тривиальна, вы просто использовать данные координаты и ориентацию, последний требует, чтобы прочитать Rotate значение и вычислить его в свои координаты и углы.
iText здесь пытается вам помочь, и для setRotateContent(true)
сначала добавляет преобразование в недооценку и недооценку, что позволяет вам просто выбирать координаты и углы, как если бы не было поворота страницы.
Похоже, что последняя ситуация воспринимается чаще, чем первая. Таким образом, значение по умолчанию RotateContent
равно true
. Поэтому в прежней ситуации вам действительно нужно отключить его, используя setRotateContent(false)
.
Поскольку вопрос заключается в том, что работает именно: Этот метод выполняется для инициализации undercontent и overcontent ByteBuffer
представления:
void applyRotation(PdfDictionary pageN, ByteBuffer out) {
if (!rotateContents)
return;
Rectangle page = reader.getPageSizeWithRotation(pageN);
int rotation = page.getRotation();
switch (rotation) {
case 90:
out.append(PdfContents.ROTATE90);
out.append(page.getTop());
out.append(' ').append('0').append(PdfContents.ROTATEFINAL);
break;
case 180:
out.append(PdfContents.ROTATE180);
out.append(page.getRight());
out.append(' ');
out.append(page.getTop());
out.append(PdfContents.ROTATEFINAL);
break;
case 270:
out.append(PdfContents.ROTATE270);
out.append('0').append(' ');
out.append(page.getRight());
out.append(PdfContents.ROTATEFINAL);
break;
}
}
(PdfStamperImp
)
с
static final byte ROTATE90[] = DocWriter.getISOBytes("0 1 -1 0 ");
static final byte ROTATE180[] = DocWriter.getISOBytes("-1 0 0 -1 ");
static final byte ROTATE270[] = DocWriter.getISOBytes("0 -1 1 0 ");
static final byte ROTATEFINAL[] = DocWriter.getISOBytes(" cm\n");
(PdfContents
)
PS: В то время как атрибут RotateContent
контролирует ли или нет, добавляются в overcontent эти преобразования и undercontent или нет, есть аналогичный механизм для аннотации , которые не могут быть отключены этот атрибут, ср. this answer.
Можете добавить упрощенную версию кода? Начните новый проект и добавьте только один класс с достаточным количеством кода, чтобы показать, что вы делаете и видите. Это должно привести вас к ограничениям, потому что в противном случае вам не удастся публиковать вопросы о переполнении стека в первую очередь ... –