2013-02-13 49 views
6

我想獲得我的XFA表單中所有字段的簡單列表。我正在使用此代碼:如何獲取XFA表單中的字段列表?

private void ListFieldNames() 
{ 
    string pdfTemplate = @"C:\Projects\iTextSharp\SReport.pdf"; 
    MemoryStream m = new MemoryStream(); 

    // title the form 
    this.Text += " - " + pdfTemplate; 

    // create a new PDF reader based on the PDF template document 
    PdfReader pdfReader = new PdfReader(pdfTemplate); 
    PdfStamper pdfStamper = new PdfStamper(pdfReader, m); 
    AcroFields formFields = pdfStamper.AcroFields;   
    AcroFields form = pdfReader.AcroFields; 
    XfaForm xfa = form.Xfa; 
    StringBuilder sb = new StringBuilder(); 
    sb.Append(xfa.XfaPresent ? "XFA form" : "AcroForm"); 
    sb.Append(Environment.NewLine); 

    foreach (string key in form.Fields.Keys) 
    { 
     sb.Append(key); 
     sb.Append(Environment.NewLine); 
     txtFields.Text = sb.ToString(); 
    } 

    txtFields.Text = sb.ToString(); 
} 

但我得到的只是XFA表單而不是任何字段。任何想法我做錯了什麼?

在此先感謝

回答

11

你從我的書的第八章採取了代碼示例「在行動iText的。」該代碼示例的結果是什麼,我273頁上寫道一致:

運行清單8.18這一形式的資源會給你以下結果:

AcroForm

如果你的問題是任何想法我做錯了什麼?那麼答案很簡單:您停止閱讀第270頁,或者您使用了代碼示例,但未閱讀隨附的文檔。如何解決這個問題?閱讀文檔!

如果你的問題是爲什麼我沒有得到關於這些領域的任何信息?(這不是你的問題,但我們假設它是),答案是:你使用代碼來檢索AcroForm字段,但是你的表單不包含任何這樣的字段。你的表單是一個純粹的XFA表單,這意味着所有的字段信息都只存儲爲XML和XML!

假設您現在想知道:如何提取該XML?那麼你應該去你找到你複製/粘貼的例子的地方。

這可能是在這裏: http://itextpdf.com/examples/iia.php?id=164

或者,也許在這裏:http://sourceforge.net/p/itextsharp/code/HEAD/tree/trunk/book/iTextExamplesWeb/iTextExamplesWeb/iTextInAction2Ed/Chapter08/XfaMovie.cs

甚至在這裏:http://kuujinbo.info/iTextInAction2Ed/index.aspx?ch=Chapter08&ex=XfaMovie

此代碼片段將返回完整XFA流:

public string ReadXfa(PdfReader reader) { 
    XfaForm xfa = new XfaForm(reader); 
    XmlDocument doc = xfa.DomDocument; 
    reader.Close(); 

    if (!string.IsNullOrEmpty(doc.DocumentElement.NamespaceURI)) { 
    doc.DocumentElement.SetAttribute("xmlns", ""); 
    XmlDocument new_doc = new XmlDocument(); 
    new_doc.LoadXml(doc.OuterXml); 
    doc = new_doc; 
    } 

    var sb = new StringBuilder(4000); 
    var Xsettings = new XmlWriterSettings() {Indent = true}; 
    using (var writer = XmlWriter.Create(sb, Xsettings)) { 
    doc.WriteTo(writer); 
    } 
    return sb.ToString();  
} 

現在查找<xfa:datasets>標籤;它將有一個子標籤<xfa:data>(如果表單爲空,可能爲空)和子標籤<dd:dataDescription>。在dataDescription標籤內,您會發現類似於XSD的內容。這就是你需要知道表單中的字段是關於什麼的。

我可以繼續猜測問題,例如:我該如何填寫這樣的表單?通過使用方法fillXfaForm(); 我該如何扁平這種形式?通過使用XFA Worker(這是一個在iTextSharp上編寫的封閉源代碼庫),但讓我們爲其他線程保留這些問題;-)

相關問題