我正在尝试重命名itext中的字段。我可以成功重命名文本字段,但我在重命名复选框时遇到错误。这是迄今为止的代码:
try {
pdfReader = new PdfReader(s_pdfread);
} catch (Exception ex) {
Console.WriteLine("Can't create Filestream from " + s_pdfread);
Console.WriteLine(ex.Message);
ShowHelp();
Environment.Exit(-1);
}
List <renameJob> jobsToDo = new List<renameJob> ();
try {
using (FileStream fs = new FileStream(s_pdfwrite, FileMode.Create)) {
PdfStamper stamper = new PdfStamper(pdfReader, fs);
AcroFields fields = stamper.AcroFields;
foreach (var field in stamper.AcroFields.Fields) {
Console.WriteLine("fieldKeySRC: " + field.Key);
string newFieldname = field.Key.Replace(s_searchFor, s_replaceWith);
newFieldname = newFieldname.Replace(".", "");
// special name for checkbox
/*switch (stamper.AcroFields.GetFieldType(field.Key)) {
case AcroFields.FIELD_TYPE_CHECKBOX:
newFieldname = newFieldname + ".0";
break;
} planned for future. In finaly version i need to add this .0 */
if (field.Key != newFieldname) {
renameJob job = new renameJob();
job.oldName = field.Key;
job.newName = newFieldname;
jobsToDo.Add(job);
}
}
foreach (renameJob job in jobsToDo) {
if (fields.RenameField(job.oldName, job.newName) == true) {
Console.WriteLine("renameField: " + job.oldName + " to " + job.newName);
}
else {
Console.WriteLine("!!! failed: renameField: " + job.oldName + " to " + job.newName);
}
}
stamper.Close();
为什么复选框失败并且文本框工作正常....?
答案 0 :(得分:1)
正如mkl解释的那样,“。”在字段名称中不是名称的一部分,它表示层次结构。
假设您有一个名为“parent”的父字段,其中包含两个孩子“kid1”和“kid2”。在这种情况下,kid字段的完全限定名称是“parent.kid1”和“parent.kid2”。
使用iText,您可以重命名字段,但无法更改层次结构。例如:您可以将完全限定名称“mybox”更改为“hisbox”,您可以将完全限定名称“parent.kid1”更改为“parent.child1”,将“parent.kid2”更改为“parent.child2”。< / p>
IT并不重要如果这些字段是文本字段,复选框字段或任何其他类型的字段!
换句话说:你的问题是错的!您遇到的问题是,您不是要重命名字段。相反,你试图将“parent.kid1”更改为“parentkid1”,将“parent.kid2”更改为“parentkid2”。这与重命名不一样!这正在消除层次结构,将父母和两个孩子变成两个无父母的孩子!您不能使用重命名功能来执行此操作。
如果你真的想扔掉层次结构,你需要添加两个新的字段“parentkid1”和“parentkid2”来复制“parent.kid1”和“parent.kid2”的属性。获得这些副本后,您需要删除“parent”,“kid1”和“kid2”。
这是更多的工作。我建议反对它,因为这是一个容易出错的操作。