我正在尝试将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"。
有没有办法实现这个目标?
如果可能,请提供工作样本。
谢谢。
答案 0 :(得分:4)
您的帖子包含两个不同的问题。一个问题很容易回答。另一个问题是无法回答的。
让我们从简单的问题开始:
如何从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表格。
当我们在外面看时,我们看到:
“英语”旁边的复选框可以是空白正方形或带有粉红色背景和十字形的正方形。现在让我们来看看内部:
我们看到这是表复选框,我们看到有两种状态:/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语法。如果您不想这样做,则由于PDF中缺少可立即使用的信息,您无法创建用于创建PDF的“原始”RadioCheckField
对象。
答案 1 :(得分:1)
经过一番研究后,我得出的结论是,目前版本的iTextSharp v5.5.7.0:
无法抓取AcroField并将其强制转换回用于首先生成字段的原始类(RadioCheckField)。
因此,PushButtonField和RadioCheckField等特定类仅对生成新PDF有用,但不适用于编辑现有PDF。
答案 2 :(得分:0)
这不可能。
据我所知,iTextSharp不支持从AcroField转换回用于生成字段的原始类(RadioCheckField)。
您必须编写自己的代码来解析和检查PDF才能实现此目的。