2013-02-13 30 views
6

मैं अपने एक्सएफए फॉर्म में सभी क्षेत्रों की एक साधारण सूची प्राप्त करने की कोशिश कर रहा हूं। मैं इस कोड का उपयोग कर रहा हूं:एक एक्सएफए फॉर्म में फ़ील्ड की सूची कैसे प्राप्त करें?

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

लेकिन मुझे जो भी मिल रहा है वह एक्सएफए फॉर्म है और कोई फ़ील्ड नहीं है। कोई आइडिया है कि मैं क्या गलत कर रहा हूँ?

अग्रिम धन्यवाद

उत्तर

11

आप मेरी किताब के 8 अध्याय से एक कोड नमूना लिया है "नीली लपटें लड़ाई में।" कि कोड नमूने के परिणाम मैं पेज 273 पर क्या लिखा है के साथ संगत है:

रनिंग संसाधन के रूप में इस फार्म के साथ लिस्टिंग 8.18 आप निम्नलिखित परिणाम दे देंगे:

AcroForm

यदि आपका प्रश्न कोई विचार है कि मैं क्या गलत कर रहा हूं? तो उत्तर सरल है: आपने पृष्ठ 270 पर पढ़ना बंद कर दिया है, या आपने साथ में दस्तावेज़ों को पढ़े बिना कोड नमूना का उपयोग किया है। इसे कैसे ठीक करें? दस्तावेज पढ़ें!

यदि आपका प्रश्न है तो मुझे फ़ील्ड के बारे में कोई जानकारी क्यों नहीं मिली? (जो आपका प्रश्न नहीं है, लेकिन मान लीजिए कि यह है), जवाब है: आप AcroForm फ़ील्ड को पुनर्प्राप्त करने के लिए कोड का उपयोग कर रहे हैं, लेकिन आपके फॉर्म में ऐसे कोई फ़ील्ड नहीं हैं। आपका फॉर्म एक शुद्ध एक्सएफए फॉर्म है, जिसका अर्थ है कि सभी फ़ील्ड जानकारी केवल एक्सएमएल और एक्सएमएल के रूप में संग्रहीत की जाती है!

मान लीजिए कि अब आप जानना चाहते हैं: मैं उस 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> टैग देखें; इसमें एक subtag <xfa:data> होगा (संभवतः खाली है अगर फॉर्म खाली है) और एक subtag <dd:dataDescription> होगा। dataDescription टैग के अंदर, आपको एक्सएसडी जैसा कुछ मिल जाएगा। इस बारे में आपको यह जानने की जरूरत है कि फ़ॉर्म में फ़ील्ड किस बारे में हैं।

मैं अनुमान लगाने के प्रश्नों पर जा सकता हूं, जैसे: मैं इस तरह का फॉर्म कैसे भरूं? विधि fillXfaForm() का उपयोग करके; मैं इस तरह के फॉर्म को कैसे फ़्लैट कर सकता हूं? XFA वर्कर का उपयोग करके (जो iTextSharp के शीर्ष पर लिखी गई एक बंद स्रोत लाइब्रेरी है), लेकिन चलिए उन प्रश्नों को किसी अन्य थ्रेड के लिए रखें ;-)