2017-01-23 8 views
0

Я использую pdfstamper, чтобы добавить водяной знак в существующий pdf. Когда я держу флаг setRotateContent (true), водяной знак появляется в правильном положении, но когда я держу его ложным, водяной знак неуместен. Я не могу поделиться кодом из-за некоторых ограничений.itext setRotateContent Использование флагов не ясен

Я делюсь случаями.

ORIGINAL PDF enter image description here

С setRotateContent (ложной)

enter image description here

С setRotateContent (истина)

enter image description here

Так что мой вопрос в том, как именно работает setRotateContent(). Я также попробовал страницу Api. Но все примеры: setRotateContent (false).

+0

Можете добавить упрощенную версию кода? Начните новый проект и добавьте только один класс с достаточным количеством кода, чтобы показать, что вы делаете и видите. Это должно привести вас к ограничениям, потому что в противном случае вам не удастся публиковать вопросы о переполнении стека в первую очередь ... –

ответ

1

Так что мой вопрос, как именно делает 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.