java - itext setRotateContent 标志用法不清楚

标签 java itext pdfstamper

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

我正在分享案例。

原始 PDF enter image description here

使用 setRotateContent(false)

enter image description here

使用 setRotateContent(true)

enter image description here

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

最佳答案

So my question is how exactly does the setRotateContent() works

作为一点背景知识,您需要知道每个 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 .

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

相关文章:

java - 使用 Java API 从 Hive 中获取表属性

java - 在 servlet 的 init-param 类中使用 spring Autowiring

java - 您可以根据输入(例如字符串)确定 iText 中的列宽吗?

java - IText Stamper 为特定文本添加下划线

c# - 让 PdfStamper 与 MemoryStreams 一起工作(c#,itextsharp)

java - 通过equals & hashcode区分子类

java - 在 Java 生产代码中使用 Junit Assert API 可以吗

c# - 如何设置基本字体颜色?

java - 在背景不透明的 PDF 上创建条形码叠加层 (iText)