我正在使用pdfstamper将水印添加到现有的pdf中。当我保留标志 setRotateContent(true) 时,水印位于正确的位置,但当我保留它 false 时,水印放错了位置。 由于某些限制,我无法共享代码。
我正在分享案例。
使用 setRotateContent(false)
使用 setRotateContent(true)
所以我的问题是 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/