我正在尝试将AcroFields转换为特定类型,以便在它们上设置属性。
当我调用AcroFields.GetField(string name);时,我得到的只是一个字符串。
当我调用AcroFields.GetFieldItem(string name);时,我会得到一个对象,但不能将它转换为特定的类型。
我也尝试过:
AcroFields.SetFieldProperty("myfield", "CheckType", RadioCheckField.TYPE_STAR, null);
每次都是假的。
为了更好地解释我的场景:
我有一个现有的PDF (我不生成这个文件)。
里面有个复选框。我想这样修改"CheckType“:myRadioCheckField.CheckType = RadioCheckField.TYPE_STAR
但是,由于不能将AcroField转换为特定类型,所以无法访问该属性"CheckType“。
有办法做到这一点吗?
如果可能的话,请提供一个工作样本。
谢谢。
发布于 2015-10-22 15:44:41
这是做不到的。
据我所知,iTextSharp不支持从AcroField转换回用于生成字段的原始类( RadioCheckField )。
为了实现这一点,您必须编写自己的代码来解析和检查PDF。
发布于 2015-10-20 18:48:42
你的帖子包含两个不同的问题。一个问题很容易回答。另一个问题是无法回答的。
让我们从一个简单的问题开始:
如何从AcroFields中获取特定类型?如PushButtonField,RadioCheckField等
这将在FormInformation示例中解释,该示例是我书的第六章的一部分。
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上执行它,就会得到info.txt。
到目前为止还不错,但接下来是一个难题:
怎样才能找到支票类型?我该怎么改呢?
这个问题暴露了对PDF的缺乏理解。当我们在前面的答案中查找复选框(或单选按钮)的可能值时,我们询问不同的外观状态。这些外观状态是用PDF语法表示的小部分内容。
例如:查看buttons.pdf表单。
当我们从外面看它时,我们看到:

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

我们看到这是表复选框,我们看到有两种外观状态:/Yes和/Off。当选择这些状态时,会在流中描述这些状态是什么样子的。
/Off状态的流非常简单:

您会立即看到,我们正在构造一个矩形(re),并在不填充它的情况下绘制它(S)。
/Yes状态稍微复杂一些:

我们看到填充颜色正在被更改(rg),我们用黑色笔划矩形并使用定义的填充颜色(B)填充它。然后,我们用moveTo (m)和lineTo (l)操作定义了两行代码,并绘制了它们(S)。
如果你精通PDF语法,很容易看出我们在一个彩色矩形内画一个十字。所以如果你精通PDF就能回答你的问题.
如果要替换外观,则必须替换绘制矩形和十字的流。这不是不可能的,但这是一个不同于你发布的问题。
概述:在PDF引用(ISO-32000-1)中没有像TYPE_STAR这样的东西,在任何PDF中也没有。如果您有现有的PDF,则无法将复选框或单选按钮投给RadioCheckField。您可以尝试重新构造RadioCheckField对象,但是如果您想知道复选框是否使用复选标记(星号)可视化,则.然后,您必须解释PDF语法。如果您不想这样做,您就不能创建“原始”的RadioCheckField对象,该对象用于创建PDF,因为在PDF中缺少现成的可用信息。
发布于 2015-10-22 15:39:15
经过一些研究,我得出的结论是,在当前版本的iTextSharp 5.5.7.0中,此时:
不可能获取一个AcroField并将其转换回最初用于生成字段的原始类( RadioCheckField ).
因此,像PushButtonField和RadioCheckField这样的特定类仅用于生成新的PDF,而不用于编辑现有的PDF。
https://stackoverflow.com/questions/33243667
复制相似问题