有没有“/ Rect”在PdfSharp中获取AcroField位置的方法?

时间:2016-09-05 15:02:41

标签: c# pdf pdfsharp

我正在使用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中获取Field的位置,或以任何方式激活“/ Rect”和“/ P”标志?

谢谢,RBrNx

2 个答案:

答案 0 :(得分:3)

Mihai发布的内容符合我通过PdfSharp对PDF进行逆向工程所发现的内容。如果同一文档中有多个字段,它们嵌套在父容器下,并且它是对使用AcroForm.Fields访问器时PdfSharp将为您提供的此父容器的引用。要获取每个字段的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”元素中获得。

答案 1 :(得分:2)

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

在您的场景中,您必须查找/ Kids键,它是一个数组。深入了解/ Kids阵列(孩子可以拥有自己的孩子等等),直到最后一级/孩子不再存在。在这个级别你应该找到/ Rect和/ P键 每个小部件都可以有自己的/ Rect和/ P键,因为它们可以出现在不同位置的不同页面上。