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 ;-)