2017-01-23 42 views
0

我正在使用pdfstamper水印添加到现有pdf。当我保持国旗setRotateContent(true),水印来到正确的位置,但是当我保持它的假,水印错位。 由于某些限制,我无法共享代码。itext setRotateContent标志使用不明确

我在分享个案。

原始PDF enter image description here

随着setRotateContent(假)

enter image description here

随着setRotateContent(真)

enter image description here

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

+0

您可以添加简码的代码吗?开始一个新项目,只添加足够的代码来显示你在做什么和看到什么。这应该让你围绕你的限制,因为否则你将不被允许在Stack Overflow上发布问题...... –

回答

1

所以我的问题是,究竟怎样的setRotateContent()的作品

由于有点背景的,你需要知道每个PDF页面包含一个属性旋转被指定为“的显示或打印时页面顺时针旋转的度数,其值应为90的倍数。默认值:0。

如果你想添加一些具有非平凡旋转值(即360倍数)的网页,因此,有两种不同的情况:

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

前者是微不足道的,只需要使用指定的坐标和方向,后者要求您阅读旋转值,并将其计入你的坐标和角度。

iText在这里试图帮助你,并为setRotateContent(true),首先添加一个变换overcontent和undercontent,让您只需继续选择坐标和角度,就好像没有页面旋转涉及。

看起来后一种情况已经被认为比前者更频繁地发生。因此,默认RotateContent值是true。因此,在前一种情况下,您实际上必须使用setRotateContent(false)将其关闭。


由于问题是如何工作的准确:这是执行以初始化undercontent和overcontent 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属性控制这些转换是否被添加到该overcontent和undercontent与否,存在一种用于注释类似的机制不能由被禁用该属性,比照。 this answer