添加注释与获取字段位置时,Itext旋转调整是不同的

我正在尝试更新注释的坐标,并注意到当获得场位置与首先添加注释时,位置调整iText对于旋转270和90是相反的 . 这不是我的预期 .

内部void AddAnnotation(PdfAnnotation annot,PdfDictionary pageN)

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

虚拟公共IList GetFieldPositions(字符串名称)

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

任何人都知道这是为什么以及如何解决这个问题?我基本上需要更新添加注释的位置,并运行iText在首次添加注释时所做的相同转换 . 我自己可以做这个调整但是如果有一个干净的方式则不愿意 .

我的尝试是

  • 添加注释

  • 直接更新注释矩形

  • 获取注释的字段位置

  • 使用从GetFieldPositions调用的变换坐标重新设置字段的矩形

这适用于180度的页面旋转,但90和270不起作用,因为变换是翻转的 .

回答(1)

2 years ago

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

为什么会这样

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

这背后的基本原理是,对于旋转页面,iText试图解除将旋转和平移添加到绘制直立文本所需的页面内容的负担,并使坐标系原点位于用户肩膀页面的左下角,因此用户根本不必处理页面轮换 . 因此,它也适用于注释 .

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

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

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

Adobe creates ellipse outside annotation rectangle

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

Adobe draws provided appearance inside annotation rectangle

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

如何解决这个问题

由于iText中矩形注释旋转校正的实现有限(两者都只适用于注释创建和非典型方式),我建议在你的情况下,关闭iText旋转校正完全代码并自己完成所有轮换 .

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