gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 19:56:27 24 4
gpt4 key购买 nike

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

有什么办法可以实现吗?

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

谢谢。

最佳答案

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

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

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

这在 FormInformation 中有解释示例,它是 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 上执行它, 你得到 form_info.txt结果。

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

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

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

例如:看看 buttons.pdf形式。

当我们从外面看时,我们会看到:

enter image description here

“英语”旁边的复选框可以是空方 block ,也可以是带粉红色背景和十字的方 block 。现在让我们看看里面:

enter image description here

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

/Off 状态的流很简单:

enter image description here

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

/Yes 状态稍微复杂一些:

enter image description here

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

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

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

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

关于c# - iTextSharp。如何从 AcroFields 获取特定类型?像 PushButtonField、RadioCheckField 等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33243667/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com