如何使用 iText/Sharp 从 AcroFields 获取 TextField?

How do I get a TextField from AcroFields using iText/Sharp?

我正在使用 iTextSharp 循环遍历 AcroFields 集合中的字段,因此我可以在注释上设置各种属性。我已经弄清楚如何为每个注释字段提取大部分属性,但希望能够将单个注释转换为正确的字段对象(即 TextFieldPushButtonFieldRadioCheckField, 等等).

除了创建新的 TextField、读取并设置与之关联的所有 settings/properties 之外,是否有一种简洁的方法可以到达:

int index = 0;
AcroFields acroFields = stamper.AcroFields;
TextField tf = acroFields.GetTextField(acroField.Key.ToString(), index);

我使用的是非常旧版本的 iTextSharp (4.0.6.0)。我无法升级到最新版本,因为 4 和 5 之间有重大变化。

附加信息: 我的 PDF 文件有多个重复字段(例如,两个页面都有客户名称),因此仅使用键名称设置 属性 可能会产生意想不到的副作用。一个字段可能左对齐,而另一个字段居中。

很遗憾,没有,TextFieldPushButtonField 和其他都是 iText 对文档创建的抽象的一部分,并且没有内置的方法可以将 AcroFields.Item 对象反转回其中一个这些。

您可以在迭代 AcroFields 的同时使用 GetFieldType()。但并非所有属性都可以更改。如果有任何问题,请告诉我。

AcroFields acroFields = reader.AcroFields;
foreach (KeyValuePair<String, AcroFields.Item> field in acroFields.Fields)
{
    // Check to see if it is the type we want.
    Boolean isTextField = (AcroFields.FIELD_TYPE_TEXT == acroFields.GetFieldType(field.Key));

    if (isTextField)
    {
        // Change the text.
        acroFields.SetField(field.Key, "new  string");
    }
}

可用的常量 int 字段类型有:

public const int FIELD_TYPE_CHECKBOX = 2;
public const int FIELD_TYPE_COMBO = 6;
public const int FIELD_TYPE_LIST = 5;
public const int FIELD_TYPE_NONE = 0;
public const int FIELD_TYPE_PUSHBUTTON = 1;
public const int FIELD_TYPE_RADIOBUTTON = 3;
public const int FIELD_TYPE_SIGNATURE = 7;
public const int FIELD_TYPE_TEXT = 4;