0

我正在使用pdfstamper水印添加到现有的 pdf 中。当我保持标志setRotateContent(true)时,水印出现在正确的位置,但是当我保持为假时,水印放错了位置。由于某些限制,我无法共享代码。

我正在分享案例。

原始 PDF 在此处输入图像描述

使用 setRotateContent(false)

在此处输入图像描述

使用 setRotateContent(true)

在此处输入图像描述

所以我的问题是setRotateContent()究竟是如何工作的。我也尝试过 Api 页面。但是所有的例子都是setRotateContent(false)

4

1 回答 1

1

所以我的问题是 setRotateContent() 究竟是如何工作的

作为背景知识,您需要知道每个 PDF 页面都包含一个属性Rotate ,该属性指定为“显示或打印时页面应顺时针旋转的度数。该值应为 90 的倍数。默认值:0。”

因此,如果您想向具有重要Rotate值(即 360 的倍数)的页面添加内容,则有两种不同的情况:

  • 无论页面最终如何旋转,您都想在相对于页面坐标系的位置和方向添加一些东西,
  • 或者您想在与页面显示方式相关的位置添加一些内容。

虽然前者很简单,您只需使用给定的坐标和方向,后者需要您读取Rotate值并将其计算为您的坐标和角度。

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属性控制是否将这些转换添加到内容过多和内容不足,但该属性无法禁用类似的注释机制,参见。这个答案

于 2017-01-23T10:54:32.207 回答