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

我正在分享案例。

原始PDF
java - itext setRotateContent标志用法不明确-LMLPHP

使用setRotateContent(false)

java - itext setRotateContent标志用法不明确-LMLPHP

使用setRotateContent(true)

java - itext setRotateContent标志用法不明确-LMLPHP

所以我的问题是setRotateContent()到底如何工作。我也尝试过Api页面。但是所有示例都带有setRotateContent(false)。

最佳答案

所以我的问题是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属性控制是否将这些转换添加到内容过多和不足的内容中,但对于无法通过该属性禁用的注释,存在类似的机制,请参见。 this answer

关于java - itext setRotateContent标志用法不明确,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41799726/

10-12 04:52