iTextSharp。如何从 AcroFields 获取特定类型?像 PushButtonField、RadioCheckField 等

2 c# pdf-generation itextsharp

我正在尝试转换AcroFields为特定类型,以便我可以为它们设置属性。

当我打电话时,AcroFields.GetField(string name);我得到的只是一个字符串。

当我打电话时,AcroFields.GetFieldItem(string name);我得到一个对象,但无法将其转换为特定类型。

我也试过:

AcroFields.SetFieldProperty("myfield", "CheckType", RadioCheckField.TYPE_STAR, null);

每次都返回false。

为了更好地解释我的场景:

我有一个现有的 PDF(我没有生成这个文件)。

里面有一个复选框。我想像这样更改“CheckType”:myRadioCheckField.CheckType = RadioCheckField.TYPE_STAR

但是由于我无法将 AcroField 转换为特定类型,因此我无法访问该属性“CheckType”。

有没有办法实现这一目标?

如果可能,请提供工作样本。

谢谢你。

Bru*_*gie 7

您的帖子包含两个不同的问题。一个问题很容易回答。另一个问题是无法回答的。

让我们从简单的问题开始:

如何从 AcroFields 获取特定类型?像 PushButtonField、RadioCheckField 等

这在FormInformation示例中进行了解释,该示例是我书第 6 章的一部分:

PdfReader reader = new PdfReader(datasheet);
// Get the fields from the reader (read-only!!!)
AcroFields form = reader.AcroFields;
// Loop over the fields and get info about them 
StringBuilder sb = new StringBuilder();       
foreach (string key in form.Fields.Keys) {
    sb.Append(key);
    sb.Append(": ");
    switch (form.GetFieldType(key)) {
        case AcroFields.FIELD_TYPE_CHECKBOX:
            sb.Append("Checkbox");
            break;
        case AcroFields.FIELD_TYPE_COMBO:
            sb.Append("Combobox");
            break;
        case AcroFields.FIELD_TYPE_LIST:
            sb.Append("List");
            break;
        case AcroFields.FIELD_TYPE_NONE:
            sb.Append("None");
            break;
        case AcroFields.FIELD_TYPE_PUSHBUTTON:
            sb.Append("Pushbutton");
            break;
        case AcroFields.FIELD_TYPE_RADIOBUTTON:
            sb.Append("Radiobutton");
            break;
        case AcroFields.FIELD_TYPE_SIGNATURE:
            sb.Append("Signature");
            break;
        case AcroFields.FIELD_TYPE_TEXT:
            sb.Append("Text");
            break;
        default:
            sb.Append("?");
            break;
    }
    sb.Append(Environment.NewLine);
} 
// Get possible values for field "CP_1"
sb.Append("Possible values for CP_1:");
sb.Append(Environment.NewLine);
string[] states = form.GetAppearanceStates("CP_1");
for (int i = 0; i < states.Length; i++) {
    sb.Append(" - ");
    sb.Append(states[i]);
    sb.Append(Environment.NewLine);
}
// Get possible values for field "category"
sb.Append("Possible values for category:");
sb.Append(Environment.NewLine);
states = form.GetAppearanceStates("category");
for (int i = 0; i < states.Length - 1; i++) {
    sb.Append(states[i]);
    sb.Append(", ");
}
sb.Append(states[states.Length - 1]);
Run Code Online (Sandbox Code Playgroud)

此代码片段将字段的类型存储在 a 中StringBuilder,以及单选字段和复选框的可能值。

如果你在datasheet.pdf上执行它,你会得到form_info.txt结果。

到目前为止一切顺利,但随之而来的难题是:

如何找到支票类型?我该如何更改?

这个问题揭示了对PDF缺乏理解。当我们在上一个答案中寻找复选框(或单选按钮)的可能值时,我们询问了不同的外观状态。这些外观状态是用 PDF 语法表示的小块内容。

例如:看看buttons.pdf表单。

当我们在外面看它时,我们看到:

在此处输入图片说明

“English”旁边的复选框可以是一个空方块或一个带有粉红色背景和十字的方块。现在让我们来看看内部:

在此处输入图片说明

我们看到这是表格复选框,我们看到有两种外观状态:/Yes/Off。这些状态在被选中时的样子在流中进行了描述。

/Off状态流相当简单:

在此处输入图片说明

您会立即看到我们正在构建一个矩形 ( re) 并绘制它而不填充它 ( S)。

/Yes状态是稍微复杂一些:

在此处输入图片说明

我们看到填充颜色正在改变 ( rg),我们用黑色描边矩形并使用定义的填充颜色 ( B)填充它。然后我们使用 moveTo ( m) 和 lineTo ( l) 操作定义两条线,然后对它们进行描边 ( S)。

如果您精通 PDF 语法,很容易看出我们正在彩色矩形内画一个十字。这样就可以在您精通 PDF 的情况下回答您的问题...

如果要替换外观,则必须替换绘制矩形和十字的流。这并非不可能,但这与您发布的问题不同。

总结:TYPE_STAR在 PDF 参考 (ISO-32000-1) 和任何 PDF 中都没有 a 这样的东西。如果您有现有的 PDF,则无法将复选框或单选按钮投射到RadioCheckField. 您可以尝试重建RadioCheckField对象,但如果你想知道一个复选框用复选标记,星显现,...那么你必须解释PDF语法。如果您不想这样做,RadioCheckField由于 PDF 中缺少现成的信息,您将无法创建用于创建 PDF的“原始”对象。