C# 当字段名包含句点时,如何使用iTextSharp重命名PDF表单字段

C# 当字段名包含句点时,如何使用iTextSharp重命名PDF表单字段,c#,forms,pdf,itext,field,C#,Forms,Pdf,Itext,Field,我使用iTextSharp重命名PDF表单字段。在文本框中输入旧字段名和新替换名(逗号分隔)。然后,我的代码循环遍历每一行,获取旧字段名,在PDF中查找该字段并将其重命名为新字段。最后,从旧PDF创建一个新PDF,新PDF中的所有字段都将具有新名称 我的问题是,我似乎无法重命名字段名中包含句点的PDF字段(例如First.name)。有没有办法使用iTextSharp重命名此类PDF字段?我到处找,找不到清晰的答案或代码示例 以下是我目前使用的代码: //source PDF file stri

我使用iTextSharp重命名PDF表单字段。在文本框中输入旧字段名和新替换名(逗号分隔)。然后,我的代码循环遍历每一行,获取旧字段名,在PDF中查找该字段并将其重命名为新字段。最后,从旧PDF创建一个新PDF,新PDF中的所有字段都将具有新名称

我的问题是,我似乎无法重命名字段名中包含句点的PDF字段(例如First.name)。有没有办法使用iTextSharp重命名此类PDF字段?我到处找,找不到清晰的答案或代码示例

以下是我目前使用的代码:

//source PDF file
string src = PDFFile.Text;

//destination PDF file
string dest = @"Renamed_" + DateTime.Now.ToString("yyyymmddhhss") + ".pdf";

//open source PDF
PdfReader reader = new PdfReader(src);

using (FileStream fs = new FileStream(dest, FileMode.Create))
{
PdfStamper stamper = new PdfStamper(reader, fs);
AcroFields fields = stamper.AcroFields;

//read each line from the txtOldAndNewFieldNames text box
//each line contains <old field name>,<new field name>
//the two values are then put in an array
//finally, the PDF field with <old field name> is renamed to <new field name>

foreach (string line in txtOldAndNewFieldNames.Lines)
{

    string[] namePair = new string[2];
    namePair = line.Split(',');

    try
    {
        fields.RenameField(namePair[0], namePair[1]);
    }
    catch(Exception ex)
    {
        MessageBox.Show(ex.ToString());
    }
}
stamper.Close();
reader.Close();
}
//源PDF文件
字符串src=PDFFile.Text;
//目标PDF文件
字符串dest=@“重命名的\”+DateTime.Now.ToString(“yyyymmddhhss”)+“.pdf”;
//开源PDF
PdfReader读取器=新PdfReader(src);
使用(FileStream fs=newfilestream(dest,FileMode.Create))
{
PdfStamper压模=新的PdfStamper(读卡器,fs);
AcroFields=stamper.AcroFields;
//从txtOldAndNewFieldNames文本框中读取每一行
//每行包含,
//然后将这两个值放入一个数组中
//最后,带有的PDF字段重命名为
foreach(txtOldAndNewFieldNames.Lines中的字符串行)
{
字符串[]名称对=新字符串[2];
namePair=line.Split(',');
尝试
{
字段。重命名字段(名称对[0],名称对[1]);
}
捕获(例外情况除外)
{
Show(例如ToString());
}
}
压模关闭();
reader.Close();
}

这在iText(Sharp)源代码中有描述:

/**
 * Renames a field. Only the last part of the name can be renamed. For example,
 * if the original field is "ab.cd.ef" only the "ef" part can be renamed.
 * @param oldName the old field name
 * @param newName the new field name
 * @return <CODE>true</CODE> if the renaming was successful, <CODE>false</CODE>
 * otherwise
 */    
virtual public bool RenameField(String oldName, String newName)
因此,使用此方法,您可以将First.Name重命名为First.Name或empty或类似的名称,但不能重命名为EmptyOrFirst.Name

背景是PDF中的表单字段不仅排列为具有全名的对象列表,而是排列为一棵树,其中节点的全名是其祖先的部分名称与节点本身由点分隔的部分名称的串联

因此,在最后一个点之后更改除零件以外的任何内容(或更改该零件但引入新点)实际上意味着将树中的字段移动到另一个父节点,该节点可能必须在过程中创建,也可能不必创建

另一方面,
RenameField
方法只支持更改最终字段树元素本身的本地名称


这是明智的。表单字段可以从其父级继承许多属性。因此,如果重命名字段,是否希望结果字段从新父级继承?还是所有继承的属性都要显式添加到节点?还是仅与各自的新继承信息不同?或者你还有别的想法吗?

到目前为止,我还没有真正考虑过继承问题。我基本上只想通过编程来重命名字段。我知道点在对象树中具有特殊意义,但如果我进入PDF(例如使用Adobe),我可以将字段重命名为其他名称(没有任何点),并且没有特殊的副作用。如果我能用iTextSharp做同样的事情,那就太好了,但据我所知,iTextSharp没有提供这样的方法。而且我还没有找到任何其他库提供这种功能。大多数解决方法都建议创建一个新字段,以任何需要的方式命名,然后删除旧字段。这在许多其他层面上都存在问题。所以这有点令人费解,因为我认为像将字段重命名为我选择的任何内容这样简单的事情不应该如此麻烦(毕竟Adobe和所有其他PDF编辑软件都这么做了)。当然可以重命名,但只要名称包含点,因此,我们必须编辑AcroForm字段树的多个成员,包括解析继承,这不再简单。可视化PDF编辑器通常以任何方式实现这一点,因为用户可以立即看到效果,然后可以更改不需要的副作用,但编程重命名例程的情况并非如此。