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

iTextSharp. How to get specific types from AcroFields? Like PushButtonField, RadioCheckField, etc

我正在尝试将 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"。

有办法实现吗?

如果可能,请提供工作示例。

谢谢。

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

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

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

这在FormInformation example, which is part of chapter 6 of my book中有解释:

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

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

如果你在 datasheet.pdf, you get form_info.txt 上执行结果。

到目前为止一切顺利,但问题来了:

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

这个问题说明对PDF缺乏理解。当我们在前面的答案中查找复选框(或单选按钮)的可能值时,我们要求提供不同的外观状态。这些外观状态是用PDF语法表达的小块内容。

例如:看一下 buttons.pdf 表格。

从外面看,我们看到:

"English" 旁边的复选框可以是一个空方块,也可以是一个带有粉红色背景和十字的方块。现在让我们看看里面:

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

/Off状态的流很简单:

您立即看到我们正在构造一个矩形 (re) 并在不填充的情况下绘制它 (S)。

/Yes状态稍微复杂一点:

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

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

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

总结:PDF 参考 (ISO-32000-1) 和任何 PDF 中都没有 TYPE_STAR 这样的东西。如果您有现有的 PDF,则不能将复选框或单选按钮投射到 RadioCheckField。您可以尝试 重建 RadioCheckField 对象,但是如果您想知道复选框是否使用复选标记、星号...可视化,那么您必须解释 PDF 语法。如果您不想这样做,则无法创建用于创建 PDF 的 "original" RadioCheckField 对象,因为 PDF 中缺少现成可用的信息。

经过一些研究,我得出的结论是,在这个时间点,当前版本的 iTextSharp v5.5.7.0:

无法获取 AcroField 并将其转换回最初用于生成字段的原始 class ( RadioCheckField )。

所以像 PushButtonField 和 RadioCheckField 这样的特定 classes 只对生成新的 PDF 有用,对编辑现有的 PDF 没有用。

这是不可能的。

据我所知,iTextSharp 不支持从 AcroField 转换回用于生成字段的原始 class ( RadioCheckField )。

您必须编写自己的代码来解析和检查 PDF 才能实现此目的。