我正在尝试更新注释的坐标,并注意到当获得场位置与首先添加注释时,位置调整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 回答
为什么会这样
正如您在评论中所写,您同时在相关主题上找到了this stack overflow answer . 引用它:
不幸的是,对于您的用例,iText仅在添加新注释时旋转注释矩形;如果您稍后尝试读取注释矩形,iText将返回旋转的矩形,它不会撤消其"correction";如果您稍后尝试设置注释矩形,iText不会旋转它 .
更糟糕的是,用于旋转矩形的iText代码会创建一个 Rect 数组,其中坐标不会按左下角,右上角的顺序出现 . 虽然规范要求左下角,然后右上角,但某些程序与其他订单有问题 .
例如 . 如果使用iText将椭圆注释添加到旋转页面而不提供外观,Adobe Reader(9.5和DC)将在绘制矩形外部绘制椭圆:
但是,如果提供外观,Adobe Reader会在注释矩形内绘制该外观:
(选择了相应注释的CreateEllipse.testCreateEllipseOnRotated()和CreateEllipse.testCreateCorrectEllipseAppearanceOnRotated()测试输出的屏幕截图)
如何解决这个问题
由于iText中矩形注释旋转校正的实现有限(两者都只适用于注释创建和非典型方式),我建议在你的情况下,关闭iText旋转校正完全代码并自己完成所有轮换 .
不幸的是,没有简单的属性来关闭它 . 相反,您需要使用解决方法,如相关主题中已经引用的stack overflow answer中所述:首先删除页面 Rotate 条目,然后将注释添加到页面,然后恢复 Rotate 条目 .