0

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

为什么这对复选框会失败而对文本框工作正常......?

4

1 回答 1

1

正如 mkl 解释的那样,“。” 在字段名称中不是名称的一部分,它在那里表示层次结构。

假设您有一个名为“parent”的父字段,其中包含两个孩子“kid1”和“kid2”。在这种情况下,孩子字段的完全限定名称是“parent.kid1”和“parent.kid2”。

使用 iText,您可以重命名字段,但不能更改层次结构。例如:您可以将完全限定名称“mybox”更改为“hisbox”,您可以将完全限定名称“parent.kid1”更改为“parent.child1”,将“parent.kid2”更改为“parent.child2”。

如果这些字段是文本字段、复选框字段或任何其他类型的字段,则无关紧要!

换句话说:你的问题是错误的!您遇到的问题是您没有尝试重命名字段。相反,您尝试将“parent.kid1”更改为“parentkid1”,将“parent.kid2”更改为“parentkid2”。这和改名不一样!那就是消除等级制度,将一个父母和两个孩子变成两个没有父母的孩子!您不能使用重命名功能来执行此操作。

如果你真的想丢弃层次结构,你需要添加两个新字段“parentkid1”和“parentkid2”,它们复制“parent.kid1”和“parent.kid2”的属性。获得这些副本后,您需要删除“parent”、“kid1”和“kid2”。

这是更多的工作。我建议不要这样做,因为这是一个容易出错的操作。

于 2013-04-17T12:14:35.950 回答