iText setRotateContents(false)在Landscape PDF上的奇怪行为?

我已经连接了几个PDF文件,其中一些是横向的。 我现在正在标记最终PDF的每一页。

我已经意识到不使用setRotateContents(false)会导致您的修改在-90度添加到您期望的位置。 除了我的一些风景页面实际上正确地将修改在这个阶段定位在0度。

如果我使用setRotateContents(false)那么所有这些修改都会顺时针旋转90度,这意味着我在横向页面上的大多数页面修改现在都在0度正确,但我的一些横向页面现在处于+90度。

问题是我无法解决导致我的网页出现这种奇怪行为的原因? 他们都使用非常相似的代码来生成报告。 以前有没有人见过类似的问题?

有三种不同的方式来做一个横向页面,所有三个都被使用(我在这里使用8.5×11作为基础,YMMV):

  1. 11×8.5(这些是“看起来正确”的页面。
  2. 顺时针方向8.5×11 90
  3. 逆时针旋转8.5×11 90

所以你需要检查页面的旋转。

 int rot = PdfReader.getPageRotation(pageNum); 

如果你想让你的印章“均匀”出来,那么你需要根据这种旋转来改变它。 基本的变换是这样的:

 cos(rot), sin(rot), -sin(rot), cos(rot), xoff, yoff 

旋转发生在原点 0,0 周围 。 你需要yoffyoff将标记移回你想要的位置。 因为你可以组合转换,一个常见的技巧是:

  1. 移动对象使其居中于原点。
  2. 旋转
  3. 把它移回去。

当您按正确顺序组合这三个单独的转换时,您最终会得到一个可以满足您需求的转换。

或者你可以欺骗并使用AffineTransform.getRotateInstance( theta, centerX, centerY) ,但那里的乐趣在哪里? PdfContentByte.transform(AffineTransform)将为您输出数组,但是所有元素都按照正确的顺序将它们简单地传递给任何接受转换为6个浮点数的内容字节函数(参数通常称为“ a,b,c,d,h,v“)。