2013-05-10 32 views
3

嘗試爲包含兩個英鎊符號的字段名稱設置值時,我遇到了iText的奇怪錯誤。問題是我無法控制原始表單字段名稱。iText當字段名稱有兩英鎊符號時投擲XML錯誤

任何人都知道如何解決這個問題?我嘗試重命名這些字段,但它沒有將字段重命名。

這將報錯了

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。 at System.Xml.XmlDocument.CheckName(String name) at System.Xml.XmlElement..ctor(XmlName name,Boolean empty,XmlDocument doc) at System.Xml.XmlDocument.CreateElement(String prefix,String localName,String的namespaceURI) 在System.Xml.XmlDocument.CreateElement(字符串名稱) 在iTextSharp.text.pdf.XfaForm.Xml2SomDatasets.InsertNode(XmlNode的N,字符串SHORTNAME) 在iTextSharp.text.pdf.AcroFields.SetField(字符串名稱,字符串值,字符串顯示) at iTextSharp.text.pdf.AcroFields.SetField(String name,String value)

這是來自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(); 

}

+0

您正在填寫一個XFA表單,就好像它是一個AcroForm。這個問題的答案可能需要5到10頁。不幸的是,我現在沒有時間在這個主題上寫5到10頁。 – 2013-05-10 08:26:39

+0

感謝布魯諾。這是一個很好的提示/信息。在與AcroForms合作這麼久之後,我已經忘記了這種形式的風格。現在,我必須同時處理這兩個問題。 – jon333 2013-05-10 15:39:08

回答

0

我哈得同樣的問題,我曾在我的方式,對於該領域屬於(中的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(); 
1

我知道這個問題太舊了。但也許我的回答會幫助別人。 在問題ReplaceField函數不起作用,因爲它只能更改名稱的最後部分(全部在字段名稱中的最後一個之後)。 對於這種情況下面的代碼將工作:

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]); 
} 
+0

它的工作原理! :D謝謝你! – Nicolocodev 2017-04-27 21:35:11