itext setRotateContent标记用法不清楚

时间:2017-01-23 05:26:24

标签: java itext pdfstamper

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

我正在分享案件。

原始PDF enter image description here

使用setRotateContent(false)

enter image description here

使用setRotateContent(true)

enter image description here

所以我的问题是 setRotateContent()的确切运作方式。我也尝试过Api页面。但所有示例都是 setRotateContent(false)

1 个答案:

答案 0 :(得分:1)

  

所以我的问题是setRotateContent()的工作原理是什么

作为一些背景知识,您需要知道每个PDF页面都包含一个属性旋转,该属性指定为"页面顺时针旋转的度数显示或打印时该值应为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属性控制是否将这些转换添加到过度内容和内容不足中,但是有一种类似的注释机制无法禁用通过该属性, cf. this answer