当前位置: 首页 > 知识库问答 >
问题:

使用Itext检索Pdf表单字段位置

柳星晖
2023-03-14

我使用Adobe acrobat reader编辑PDF,在我看到的地方,每个字段都有一个position属性,表示PDF字段在表单中的位置。

所以我的问题是,我能读到那个值吗?

现在我用下面的代码检索表单字段:

string pdfTemplate = @"D:\abc.pdf";
PdfReader reader = new PdfReader(pdfTemplate);

var fields = reader.AcroFields;

int ffRadio = 1 << 15;      //Per spec, 16th bit is radio button
int ffPushbutton = 1 << 16; //17th bit is push button
int ff;

//Loop through each field
foreach (var f in fields.Fields)
{
    String type = "";
    String name = f.Key.ToString();
    String value = fields.GetField(f.Key);

    //Get the widgets for the field (note, this could return more than 1, this should be checked)
    PdfDictionary w = f.Value.GetWidget(0);

    //See if it is a button-like object (/Ft == /Btn)
    if (!w.Contains(PdfName.FT) || !w.Get(PdfName.FT).Equals(PdfName.BTN))
    {
        type = "T";
    }
    else
    {
        //Get the optional field flags, if they don't exist then just use zero
        ff = (w.Contains(PdfName.FF) ? w.GetAsNumber(PdfName.FF).IntValue : 0);

        if ((ff & ffRadio) == ffRadio)
        {
            //Is Radio
            type = "R";
        }
        else if (((ff & ffRadio) != ffRadio) && ((ff & ffPushbutton) != ffPushbutton))
        {
            //Is Checkbox
            type = "C";
        }
        else
        {
            //Regular button
            type = "B";
        }
    }

    //MessageBox.Show(type + "=>" + name + "=>" + value);
    FormFields fld = new FormFields(name, type, value, "inputfield" +form_fields.Count);

    form_fields.Add(fld);

    if (type.Equals("T"))
        addContent(form_fields.Count);
}

共有1个答案

马沛
2023-03-14

我正准备以acrokey的Find field absolute position and dimension的副本结束这个问题,但这是Java的答案,尽管大多数开发人员将Java转换为C#没有问题,但对一些开发人员来说,获得C#的答案可能会有帮助。

PDF中的字段使用小部件注释可视化。一个字段可以对应于这些注释中的不同。例如,您可以有一个名为name的字段,该字段在每个页面上都可视化。在这种情况下,该字段的值将显示在每个页面上。

有一个getFieldPositions()方法返回多个位置的列表,每个小部件注释一个位置。

这是我从问题iTextSharp GetFieldPositions的答案中复制到SetSimpleColumn的一些代码

IList<AcroFields.FieldPosition> fieldPositions = fields.GetFieldPositions("fieldNameInThePDF");
if (fieldPositions == null || fieldPositions.Count <= 0) throw new ApplicationException("Error locating field");
AcroFields.FieldPosition fieldPosition = fieldPositions[0];
left = fieldPosition.position.Left;
right = fieldPosition.position.Right;
top = fieldPosition.position.Top;
bottom = fieldPosition.position.Bottom;

如果一个字段对应于一个小部件注释,则leftrighttopbottom将给出字段的左、右、顶和底坐标。字段的宽度可以这样计算:right-left;高度如下所示:top-bottom。这些值以用户单位表示。默认情况下,一英寸中有72个用户单元。

如果文档包含多个页面,则fieldposition.page将给出找到该字段的页码。

所有这些都记录在http://developers.itextpdf.com/

 类似资料:
  • 我有一个要求,我必须使用Itext在PDF表单中填充值。 表单i具有多个具有相同字段名的字段。概念是在PDF表单字段名称通用的情况下填充相同的值。 因此,如果有两个或更多名为txtSysTime的字段,那么代码应该在所有字段中填充系统时间。 我的问题基本上是 Itext是否支持这种功能? 如果可能的话,我们怎么能做同样的事情呢 我正在使用以下代码进行相同的尝试: 使用此代码,第一个同名字段中的值将

  • 我们有一个包含现有字段的PDF表单,我们正在尝试使用默认值向表单添加新字段,但没有成功。基本上,我们正在做以下工作: 字段idClient使用新值更新,但新字段idDocTrackType没有内容。我做错了什么?

  • 在我的Android应用程序中,我从pdffile中填充表单字段,使用itextg如下: 我可以看到,在调试和检查压模时,模板字段的值实际上是设置的。但是一旦我打开目标文件,我所有的字段都是空的。 如果我不平整我的窗体,这些值会保留在字段中,这让我相信这些值也会存在于fladedpdf中,但不会显示。 顺便说一句,在itext演示中使用FormFiller表单(http://itextpdf.co

  • 我试图在PDF中创建一个表单字段,用户可以在其中插入图像文件并保存文档,以便图像是持久的(在新的PDF文档中,而不是更改现有文档)。我知道这是可能的,因为我在其他PDF中看到过这样做,但我不知道在iText7 for.NET/C#中应该如何这样做。 使用创建按钮并替换图像的想法,到目前为止我已经尝试了: 希望足以覆盖按钮的外观。但我得到一个错误出现在指示行(不幸的是,它并不比这更具体),并且Sta

  • 我假设有两个表t_document和t_employee。表t_document有两个字段,id和owner_id,owner_id与t_employee有外键关系。表t_employee有两个字段,id和name。我的难题是,如何设置一个JPA实体(使用1. x版),以便以下NamedNativeQuery获取一个文档以及所有者的姓名并正确填充实体? 首先,我介绍了文档类的基本开头。

  • 本文向大家介绍sharepoint清单。从网站检索列表字段,包括了sharepoint清单。从网站检索列表字段的使用技巧和注意事项,需要的朋友参考一下 示例