【问题标题】:Pdf form fields position retrieval with Itext使用 Itext 检索 Pdf 表单字段位置
【发布时间】:2016-08-07 12:52:22
【问题描述】:

使用 iTextSharp,我可以检索 PDF 表单中存在的所有表单字段。我正在使用 Adob​​e acrobat 阅读器编辑 PDF,我看到,每个字段都有一个位置属性,表示 PDF 字段的位置驻留在表单中。

所以我的问题是,我可以读取那个值吗?

比如我在PDF表单中有一个表单域名称,我能不能得到这个域的位置值,比如左0.5英寸,右2.5英寸,上2英寸,下2英寸?

现在我正在使用以下代码检索表单字段:

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);
}

【问题讨论】:

    标签: c# pdf itext


    【解决方案1】:

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

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

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

    这是我从iTextSharp GetFieldPositions to 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;
    

    如果一个字段对应一个widget注解,那么leftrighttopbottom会给你这个字段的左、右、上、下坐标。字段的宽度可以这样计算:right - left;像这样的高度:top - bottom。这些值以用户单位表示。默认情况下,一英寸有 72 个用户单位。

    如果您的文档包含多页,那么fieldPosition.page 将为您提供您可以在其中找到该字段的页码。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-09
      • 2011-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多