Itext Sharp:将文本框添加到旋转PDF中的正确位置

Itext Sharp:将文本框添加到旋转PDF中的正确位置,pdf,textbox,rotation,itextsharp,Pdf,Textbox,Rotation,Itextsharp,我想添加一个文本框到旋转的pdf(270度)。当我使用函数GetPageSizeWithRotation(pageNum)时,它返回一个位置不正确的矩形。因此,添加的文本框也处于不正确的位置。 我的问题如下图所示: 请建议我一些解决方案,以获得PDF的位置准确。谢谢 根据您的评论您发现问题仅出现在裁剪框与媒体框不同的页面上。因此,您应该根据裁剪框而不是媒体框进行计算 GetPageSizeWithRotation基本上是这样实现的: virtual public Rectangle GetPag

我想添加一个文本框到旋转的pdf(270度)。当我使用函数GetPageSizeWithRotation(pageNum)时,它返回一个位置不正确的矩形。因此,添加的文本框也处于不正确的位置。 我的问题如下图所示:
请建议我一些解决方案,以获得PDF的位置准确。谢谢

根据您的评论您发现问题仅出现在裁剪框与媒体框不同的页面上。因此,您应该根据裁剪框而不是媒体框进行计算

GetPageSizeWithRotation
基本上是这样实现的:

virtual public Rectangle GetPageSizeWithRotation(PdfDictionary page) {
    Rectangle rect = GetPageSize(page);
    int rotation = GetPageRotation(page);
    while (rotation > 0) {
        rect = rect.Rotate();
        rotation -= 90;
    }
    return rect;
}
GetPageSize(page)
从这里调用基本上返回媒体框

因此,您应该有基于裁剪框的模拟代码


根据新结果编辑很明显,问题与CropBox条目的存在无关,但更可能是框的左下角不是坐标系的原点

在这种情况下,iText(Sharp)和Adobe Acrobat以不同方式执行长方体的旋转:

  • iText(Sharp)旋转长方体尺寸并保持左下偏移
  • Adobe Acrobat也会旋转左下角的偏移
造成差异的原因是:PDF规范对旋转项的描述如下:

virtual public Rectangle GetPageSizeWithRotation(PdfDictionary page) {
    Rectangle rect = GetPageSize(page);
    int rotation = GetPageRotation(page);
    while (rotation > 0) {
        rect = rect.Rotate();
        rotation -= 90;
    }
    return rect;
}
显示或打印时页面顺时针旋转的度数

也就是说,旋转项根本不是指定为改变坐标系的东西,而只是指定为改变输出方向的东西。因此,这些结果同样正确


因此,要模拟Adobe Acrobat坐标转换,需要编写一个显式方法。对于这些示例结果,它应该很容易实现。

GetPageSizeWithRotation(pageNum),它返回一个位置不正确的矩形-返回的矩形值是正确的,但不是您所期望的。。。不幸的是,您没有呈现PDF本身,因此只能猜测。一种可能性是页面定义了裁剪框,Adobe Acrobat返回相对于裁剪框的值,而iText方法作为文档返回相对于媒体框的值。不过,正如前面提到的,这只是猜测,因为您没有提供有问题的PDF。@mkl:谢谢您的回复。实际上,在我的PDF文件中定义了一个裁剪框,但我不知道如何通过使用Itext Sharp获得与裁剪框相关的值。我还提到了与我的问题相关的其他主题,例如:。然而,到目前为止,我还没有找到任何解决这个问题的方法。我感谢你的支持。非常感谢@mkl:我还检查了另一个没有定义任何裁剪框的PDF文件。因此,上述问题不会发生。此外,当我将PDF从270度旋转到0度并重新测试时,问题也不会出现。所以,我的问题与旋转角度和裁剪框有关。很抱歉,我不能给你看我的PDF文件。我会稍后再看,也许在周一。您能同时提供介质盒和裁剪盒的值吗?这是我的结果,谢谢您的支持!关于您的结果:
GetCropBox
GetPageSize
忽略页面旋转条目;因此,它们显然总是返回相同的值
GetPageSizeWithRotation
和Adobe Acrobat Mediabox输出都考虑了Rotate条目。不同的结果是由于该值的规格不明确旋转应围绕哪个点进行。