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

时间:2011-06-17 09:12:54

标签: java pdf itext

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

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

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

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

1 个答案:

答案 0 :(得分:2)

有3种不同的方式可以使用横向页面,并且所有这三种方法都被使用(我在这里使用8.5x11作为基础,YMMV):

  1. 11x8.5(这些是“看起来正确”的页面。
  2. 顺时针方向8.5x11 90
  3. 逆时针旋转8.5x11 90
  4. 所以你需要检查页面的旋转。

    int rot = PdfReader.getPageRotation(pageNum);
    

    如果你想让你的印章“偶数”出来,你需要根据那个轮换来改变它。基本的变换是这样的:

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

    旋转发生在原点附近 <0>。您需要xoffyoff将邮票移回您想要的位置。因为你可以组合转换,一个常见的技巧是:

    1. 移动您的对象,使其居中于原点。
    2. 旋转
    3. 将其移回。
    4. 当您按照正确的顺序组合这三个单独的转换时,最终会得到一个可以满足您想要的转换。

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