有什么方法可以在没有“/Rect”的情况下获得 AcroField 在 PdfSharp 中的位置?

Any way to get the position of an AcroField in PdfSharp without "/Rect"?

我正在使用 C# 和库 PDFSharp 开发一个程序。 我目前正在使用以下代码获取 PDF 文档中特定 AcroField 的 X 和 Y 坐标:

PdfTextField imageField = (PdfTextField)inForm.Fields[elementName];
PdfRectangle rect = imageField.Elements.GetRectangle(PdfAnnotation.Keys.Rect);

如果 PDF 文档中只有 1 个具有相同名称的字段,则此方法工作正常。但是,如果有两个字段都命名为 "FirstName",即使它们在不同的页面上,这似乎也删除了“/Rect”和“/P”标志,因此我无法使用它们来查找位置或与该领域相关的页面。

有没有其他方法可以获取字段在 PDF 中的位置,或者有任何方法可以激活“/Rect”和“/P”标志?

谢谢,RBrNx

我不熟悉 PDFSharp API 但它在 PDF 中是这样工作的:
- 表单字段具有文档范围而不是页面范围。
- 具有相同名称的 2 个或更多字段实际上是具有 2 个或更多小部件(小部件注释,字段的可视化表示)的单个字段。 /Rect 和 /P 条目存储在小部件级别。当该字段有一个小部件时,该小部件将与该字段合并,因此 /Rect 和 /P 条目似乎是该字段的一部分。

在您的方案中,您必须查找数组形式的 /Kids 键。向下钻取 /Kids 数组(child 可以有自己的孩子等等)直到 /Kids 不再存在的最后一层。在此级别,您应该找到 /Rect 和 /P 键。
每个小部件都可以有自己的 /Rect 和 /P 键,因为它们可以出现在不同页面的不同位置。

Mihai 发布的内容符合我通过 PdfSharp 从 PDF 逆向工程中发现的内容。如果同一个文档中有多个字段,它们嵌套在一个父容器下,它是对这个父容器的引用,PdfSharp 在使用 AcroForm.Fields 访问器时会给你。要获取每个字段的 Page 和 Rectangle 元素,您必须查看该容器的子项。

要获得您正在寻找的值,您需要执行以下操作:

    PdfTextField imageField = (PdfTextField)inForm.Fields[elementName];
    var fieldRectangles = new List<PdfRectangle>();

    if( imageField.HasKids )
    {
      PdfArray kids = (PdfArray) Elements[Keys.Kids];
      foreach( var kid in kids )
      {
        var kidValues = ((PdfReference) kid).Value as PdfDictionary;
        var rectangle = kidValues.Elements.GetRectangle(PdfAnnotation.Keys.Rect);
        fieldRectangles.Add(rectangle);        
      }
    }

页面引用元素(“/P”标签)也可从这些 "Kid" 元素中获得。