【问题标题】:iText setRotateContents(false) strange behaviour on Landscape PDF's?iText setRotateContents(false) Landscape PDF 的奇怪行为?
【发布时间】:2011-06-17 09:12:53
【问题描述】:

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

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

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

问题是我无法弄清楚是什么导致我的页面出现这种奇怪的行为?他们都使用非常相似的代码来生成报告。有没有人见过类似的问题?

【问题讨论】:

    标签: java pdf itext


    【解决方案1】:

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

    1. 11x8.5(这些是“看起来正确”的页面。
    2. 8.5x11 90 顺时针
    3. 8.5x11 90 逆时针

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

    int rot = PdfReader.getPageRotation(pageNum);
    

    如果您希望您的印章“均匀”出现,则需要根据该旋转对其进行转换。基本的转换是这样的:

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

    旋转发生在围绕原点,0,0。您需要 xoffyoff 将图章移回您想要的位置。因为您可以组合转换,所以一个常见的技巧是:

    1. 移动对象,使其以原点为中心。
    2. 旋转
    3. 将其移回。

    当您以正确的顺序组合这三个单独的转换时,您最终会得到一个符合您需要的转换。

    或者你可以作弊并使用AffineTransform.getRotateInstance( theta, centerX, centerY),但这有什么乐趣呢? PdfContentByte.transform(AffineTransform) 将为您吸出数组,但所有元素都以正确的顺序简单地传递给任何接受转换为六个浮点数的内容字节函数(参数通常称为“a,b , c, d, h, v")。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多