【问题标题】:Itext rotation adjustment is different when adding annotation vs getting field postion添加注释与获取字段位置时,Itext旋转调整不同
【发布时间】:2017-04-10 18:30:17
【问题描述】:

我正在尝试更新注释的坐标,并注意到在获取字段位置与首先添加注释时,iText 所做的位置调整会反转 270 和 90 的旋转。这不是我所期望的。

internal void AddAnnotation(PdfAnnotation annot, PdfDictionary pageN)

https://github.com/itext/itextsharp/blob/develop/src/core/iTextSharp/text/pdf/PdfStamperImp.cs#L1428

virtual public IList GetFieldPositions(String name)

https://github.com/itext/itextsharp/blob/develop/src/core/iTextSharp/text/pdf/AcroFields.cs#L1639

有人知道这是为什么以及如何解决这个问题吗?我基本上需要更新添加的注释的位置,并运行 iText 在首次将其添加为注释时所做的相同转换。我可以自己进行此调整,但如果有干净的方法,我不希望这样做。

我的尝试是

  1. 添加注释
  2. 直接更新注解矩形
  3. 获取注释的字段位置
  4. 使用从调用 GetFieldPositions 转换的坐标重新设置字段的矩形

这对于 180 度的页面旋转非常有效,但 90 和 270 则不起作用,因为转换是翻转的。

【问题讨论】:

  • 你能通过提供一些示例代码来解释一下吗?
  • 我添加了指向 itextsharp 源的链接,它在添加注释时转换坐标,然后获取字段位置。我真正想做的是更新字段的位置,并让 itextsharp 进行与最初添加注释时相同的矩形调整:github.com/itext/itextsharp/blob/develop/src/core/iTextSharp/…
  • 我看到您添加了指向现有 iTextSharp 代码的链接。我没有(并且仍然不)理解的是您期望的行为。我希望我要求的示例代码可以证明这一点。
  • 大概我想在旋转的页面上添加注释,稍后更新注释的位置,让它看起来不旋转。我将添加一个粗略的示例,但我正在寻找类似于 UpdateAnnotation() 的东西,它会采用一个矩形,然后在这里运行完全相同的 case 语句:github.com/itext/itextsharp/blob/develop/src/core/iTextSharp/…
  • 我认为这是大致相同的问题:stackoverflow.com/questions/40878364/…,我想在更新注释的位置时简单地进行相同的旋转调整,就像它最初添加到页面时发生的那样,但是没有进行任何调整,因为我只是更新了注释的矩形。

标签: c# pdf itext


【解决方案1】:

有人知道这是为什么以及如何解决这个问题吗?

为什么会这样

正如您在 cmets 中所写,您同时在相关主题上找到了 this stack overflow answer。引用它:

这背后的基本原理是,对于旋转的页面,iText 试图减轻为绘制直立文本所需的页面内容添加旋转和平移的负担,并且坐标系原点位于用户肩膀页面的左下方,这样用户就不必处理页面旋转了。因此,它也适用于注解。

不幸的是,对于您的用例,iText 仅在 添加新注释时旋转注释矩形;如果您稍后尝试读取注释矩形,iText 返回旋转的矩形,它不会撤消其“更正”;如果您稍后尝试设置注释矩形,iText 不会旋转它。

更糟糕的是,iText 用于旋转矩形的代码会创建一个 Rect 数组,其中坐标出现的顺序不是从左下角到右上角。虽然规范不要求从左下到右上的顺序,但某些程序在其他顺序上存在问题。

例如如果使用 iText 向旋转页面添加椭圆注释而不提供外观,Adobe Reader(9.5 和 DC)会在注释矩形之外绘制椭圆:

但如果提供外观,Adobe Reader 会在注释矩形内绘制该外观:

CreateEllipse.testCreateEllipseOnRotated()CreateEllipse.testCreateCorrectEllipseAppearanceOnRotated() 测试的输出屏幕截图,并选择了相应的注释)

如何解决这个问题

由于在 iText 中实现矩形注释旋转校正的局限性(它仅适用于注释创建以及它这样做的非典型方式),我也建议在您的情况下关闭iText 旋转校正代码完全和自己做所有的旋转。

不幸的是,没有简单的属性可以关闭它。相反,您需要使用已在相关主题上引用的stack overflow answer 中解释的解决方法:首先删除页面 Rotate 条目,然后将注释添加到页面,然后恢复 轮换条目。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-19
    • 2014-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多