2013-02-13 11 views
6

Próbuję uzyskać prostą listę wszystkich pól w moim formularzu XFA. Używam tego kodu:Jak uzyskać listę pól w formularzu 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(); 
} 

Ale wszystko, co otrzymuję, to formularz XFA, a nie pola. Każdy pomysł, co robię źle?

góry dzięki

Odpowiedz

11

Wziąłeś próbki kodu z rozdziału 8 mojej książce „iText w działaniu”. Wynikiem tej próbki kodu jest zgodny z tym, co napisałem na stronie 273:

Running listingu 8.18 z tej formy jako zasobu daje następujący wynik:

AcroForm

Jeśli masz pytanie: Czy wiesz, co robię źle? to odpowiedź jest prosta: przestałeś czytać na stronie 270 lub użyłeś próbki kodu bez czytania załączonej dokumentacji. Jak to naprawić? Przeczytaj dokumentację!

Jeśli twoje pytanie to Dlaczego nie otrzymam informacji o polach? (co nie jest twoje pytanie, ale załóżmy, że tak), odpowiedź brzmi: używasz kodu do pobierania pól AcroForm, ale twój formularz nie zawiera takich pól. Twoja forma jest czystym formularzem XFA, co oznacza, że ​​wszystkie informacje pola są przechowywane tylko w formacie XML i XML!

Załóżmy, że chcesz teraz wiedzieć: Jak mogę wyodrębnić ten XML? następnie powinieneś udać się do miejsca, w którym znalazłeś przykład skopiowany/wklejony.

To może być tutaj: http://itextpdf.com/examples/iia.php?id=164

Albo tutaj: http://sourceforge.net/p/itextsharp/code/HEAD/tree/trunk/book/iTextExamplesWeb/iTextExamplesWeb/iTextInAction2Ed/Chapter08/XfaMovie.cs

Albo nawet tu: http://kuujinbo.info/iTextInAction2Ed/index.aspx?ch=Chapter08&ex=XfaMovie

Ten fragment kodu zwróci pełny strumień 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();  
} 

Teraz poszukaj tagu <xfa:datasets>; będzie zawierał podtag <xfa:data> (prawdopodobnie pusty, jeśli formularz jest pusty) i podtag <dd:dataDescription>. Wewnątrz tagu dataDescription znajdziesz coś, co przypomina XSD. Trzeba wiedzieć, jakie są pola w formularzu.

Mogę kontynuować pytania dotyczące odgadywania, takie jak: Jak wypełnić taki formularz? Stosując metodę fillXfaForm(); Jak mogę spłaszczyć taki formularz? Używając XFA Worker (który jest biblioteką zamkniętego źródła napisaną na iTextSharp), ale pozostawmy te pytania dla innego wątku ;-)

Powiązane problemy