我如何使用iText/Sharp从AcroFields获得一个文本字段

本文关键字:一个 字段 文本 iText 何使用 Sharp AcroFields | 更新日期: 2023-09-27 18:17:45

我使用iTextSharp来循环AcroFields集合中的字段,这样我就可以在注释上设置各种属性。我已经弄清楚了如何为每个注释字段拉出大多数属性,但希望能够将单个注释转换为正确的字段对象(即TextField, PushButtonField, RadioCheckField等)。

如果不创建一个新的TextField,读取并设置与之相关的所有设置/属性,是否有一种简洁的方法:

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

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

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

我如何使用iText/Sharp从AcroFields获得一个文本字段

不幸的是,TextField, PushButtonField和其他都是ittext的抽象文档创建的一部分,并且没有内置的方法将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;