itext setRotateContent Использование флага не ясно

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

Я делюсь делами.

ОРИГИНАЛЬНЫЙ PDF введите описание изображения здесь

С 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 Атрибут контролирует, будут ли эти преобразования добавлены к избыточному или недостаточному содержанию или нет, существует аналогичный механизм для аннотаций, который не может быть отключен этим атрибутом, ср. этот ответ

Другие вопросы по тегам