3

尝试为包含两个井号的字段名称设置值时,我遇到了 iText 的一个奇怪错误。问题是我无法控制原始表单字段名称。

有人碰巧知道如何解决这个问题吗?我试过重命名字段,但它没有重命名字段。

这将出错

form.SetField("form1[0].#subform[8].#area[12].Line4_FirstName3[4]", "Bill");

但是,如果字段名称相似但只有一个井号,则不会

form.SetField("form1[0].#subform[8].Line4_FirstName3[4]", "Bill");

引发了“System.Web.HttpUnhandledException”类型的异常。---> System.Xml.XmlException: '#' 字符,十六进制值 0x23,不能包含在名称中。在 System.Xml.XmlDocument.CheckName(String name) 在 System.Xml.XmlElement..ctor(XmlName name, Boolean empty, XmlDocument doc) 在 System.Xml.XmlDocument.CreateElement(String prefix, String localName, String namespaceURI) 在System.Xml.XmlDocument.CreateElement(String name) at iTextSharp.text.pdf.XfaForm.Xml2SomDatasets.InsertNode(XmlNode n, String shortName) at iTextSharp.text.pdf.AcroFields.SetField(String name, String value, String display)在 iTextSharp.text.pdf.AcroFields.SetField(字符串名称,字符串值)

这是来自 iText 4.1.2.0。

当我尝试重命名该字段以删除围绕“#area [12]”的第二个井号类型测试时,它不会重命名。

PdfReader reader2 = new PdfReader(pdfTemplate);
using (FileStream fs = new FileStream(TemporaryFile, FileMode.Create)) {
PdfStamper stamper = new PdfStamper(reader2, fs);
AcroFields pdfForm = stamper.AcroFields;
//Dim de As New DictionaryEntry
foreach (DictionaryEntry de in pdfForm.Fields) {
    pdfForm.RenameField(de.Key.ToString(), Guid.NewGuid().ToString("N"));
}

stamper.Close();

}

4

2 回答 2

1

我知道这个问题很老了。但也许我的回答会对某人有所帮助。在问题中 ReplaceField 函数不起作用,因为它只能更改名称的最后一部分(都在字段名称的最后一个 doth 之后)。对于这种情况,以下代码将起作用:

Dictionary<string, string> changedFields = new Dictionary<string, string>();
foreach (string fieldName in formFields.Fields.Keys)
{
    if (fieldName.Contains("#"))
    {
        if (fieldName.Contains("."))
        {
            string[] names = fieldName.Split(new string[] { "." }, StringSplitOptions.RemoveEmptyEntries);
            if (names.Last().Contains("#"))
            {
                changedFields.Add(fieldName, String.Format("{0}.{1}", String.Join(".", names, 0, names.Length - 1), names.Last().Replace("#", "")));
            }
        }
        else
        {
            changedFields.Add(fieldName, fieldName.Replace("#", ""));
        }
    }
}
foreach (string oldName in changedFields.Keys)
{
    stamper.AcroFields.RenameField(oldName, changedFields[oldName]);
}
于 2015-02-11T14:42:40.690 回答
0

我遇到了同样的问题,我想办法解决,为该字段所属的 MasterPage 设置一个名称(在 LiveCycle 中)。这样我在字段名称上不再有第二个“#”,所以我更改了名称问题不再存在。

在您的情况下,请尝试获取该字段的全名。

PdfReader reader2 = new PdfReader(pdfTemplate);
using (FileStream fs = new FileStream(TemporaryFile, FileMode.Create)) 
{
   PdfStamper stamper = new PdfStamper(reader2, fs);
   AcroFields pdfForm = stamper.AcroFields;

   //Dim de As New DictionaryEntry
   foreach (DictionaryEntry de in pdfForm.Fields) {
       //try this...
       var fullname= fields.GetTranslatedFieldName(de.Key.ToString());
       pdfForm.RenameField(fullname, Guid.NewGuid().ToString("N"));
   }

   stamper.Close();
于 2014-07-08T09:36:05.157 回答