使用iTextSharp重命名复选框字段

时间:2013-04-17 10:41:15

标签: c# itextsharp

我正在尝试重命名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();

为什么复选框失败并且文本框工作正常....?

1 个答案:

答案 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”。

这是更多的工作。我建议反对它,因为这是一个容易出错的操作。