【问题标题】:Any way to get the position of an AcroField in PdfSharp without "/Rect"?有什么方法可以在没有“/Rect”的情况下在 PdfSharp 中获取 AcroField 的位置?
【发布时间】:2016-09-05 15:02:41
【问题描述】:

我正在使用 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

【问题讨论】:

    标签: c# pdf pdfsharp


    【解决方案1】:

    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”元素中获得。

    【讨论】:

    • 这几乎就是我最终使用的代码!除了使用 PdfSharp 的 1.50.4000 Beta3 构建外,我设法使用 if (imageField.HasKids) { for (int i = 0; i &lt; imageField.Fields.Elements.Count; ++i) { rect = imageField.Fields[i].Rectangle; PdfPage page = imageField.Fields[i].Page; DrawImage(inImagePath, page, rect); } } 使它稍微短一些
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2018-12-25
      • 2017-07-20
      • 2017-10-22
      • 1970-01-01
      • 1970-01-01
      • 2018-05-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多