itext setRotateContent Использование флага не ясно
Я использую pdfstamper, чтобы добавить водяной знак в существующий PDF. Когда я сохраняю флаг setRotateContent(true), водяной знак находится в правильном положении, но когда я оставляю его ложным, водяной знак неуместен. Я не могу поделиться кодом из-за некоторых ограничений.
Я делюсь делами.
С setRotateContent(false)
С setRotateContent(true)
Поэтому мой вопрос заключается в том, как именно работает setRotateContent(). Я также попробовал страницу Api. Но все примеры с setRotateContent(false).
1 ответ
Итак, мой вопрос, как именно работает setRotateContent()
В качестве фона вам нужно знать, что каждая страница PDF содержит атрибут Rotate, который указан как "Число градусов, на которое страница должна поворачиваться по часовой стрелке при отображении или печати. Значение должно быть кратным 90. Значение по умолчанию: 0."
Если вы хотите добавить что-то на страницу с нетривиальным значением поворота (т. Е. Кратным 360), существует две разные ситуации:
- Либо вы хотите добавить что-то в позиции и ориентации относительно системы координат страницы, независимо от того, как страница будет в конечном итоге повернута,
- или вы хотите добавить что-то в позиции относительно того, как будет отображаться страница.
В то время как первое является тривиальным, вы просто используете данные координаты и ориентацию, второе требует, чтобы вы прочитали значение поворота и вычислили его по вашим координатам и углам.
iText здесь пытается помочь вам и, для setRotateContent(true)
, сначала добавляет преобразование в избыточное и недостаточное содержание, позволяя вам просто выбирать координаты и углы, как если бы не было никакого поворота страницы.
По-видимому, последняя ситуация воспринимается чаще, чем первая. Таким образом, по умолчанию RotateContent
значение true
, Следовательно, в первом случае вам действительно нужно отключить его, используя setRotateContent(false)
,
Поскольку вопрос заключается в том, как именно это работает: это метод, выполняемый для инициализации недостаточного или избыточного содержания. 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
Атрибут контролирует, будут ли эти преобразования добавлены к избыточному или недостаточному содержанию или нет, существует аналогичный механизм для аннотаций, который не может быть отключен этим атрибутом, ср. этот ответ