2010-04-09 11 views
6

के साथ पीडीएफ फॉर्म फ़ाइल विलय/भरना मान लें कि मेरे पास एक पीडीएफ फॉर्म फ़ाइल है जो वेबसाइट पर उपलब्ध है जो सर्वर द्वारा भरती है और सर्वर पर सबमिट की जाती है। सर्वर साइड (Asp.Net) पर मैं उस डेटा को मर्ज करना चाहता हूं जो मुझे एक्सएमएल प्रारूप में खाली पीडीएफ फॉर्म के साथ प्राप्त होता है जो इसे भरकर सहेजता था।एक्सएमएल डेटा

मैं पाया है वहाँ यह कर के कई संभव तरीके हैं:

  1. का उपयोग एडोब एक्रोबेट द्वारा बनाई गई पीडीएफ फार्म और iTextSharp के साथ इसे भरने।
  2. एडोब एक्रोबैट द्वारा बनाए गए पीडीएफ फॉर्म का उपयोग करके और इसे एफडीएफ टूलकिट .net (जो आंतरिक रूप से itextsharp का उपयोग कर रहा है) के साथ भर रहा है
  3. फॉर्म भरने के लिए usd pdfkt।
  4. उपयोग पीडीएफ प्रपत्र फ़ाइल Adobe LiveCycle साथ बनाया है और Form Data Integration Service

का उपयोग करके डेटा को मर्ज मैं काम आपको सलाह कौन-सा विकल्प बेहतर/आसान होगा कर सकते हैं और कुछ अतिरिक्त सुझाव देने के इस प्रकार के साथ कोई अनुभव नहीं है के रूप में?

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

उत्तर

0

आप इस 'LiveCycle' टैग किए गए के बाद से, मैं इसे ले आप कहीं चल Adobe LiveCycle की एक अधिष्ठापन है (वैकल्पिक रूप से, इसे कहीं स्थापित कर सकते हैं)।

उस स्थिति में, मैं संख्या 4 के लिए जाऊंगा (एडोब लाइवसाइकल फॉर्म ES मॉड्यूल का उपयोग करने के संशोधन के साथ)। अन्य तीन निस्संदेह लंबे समय तक संगतता मुद्दों को उत्पन्न करेंगे। LiveCycle सर्वर (फॉर्म मॉड्यूल चलाना) के साथ, आप किसी भी पीडीएफ को संभालने में सक्षम होंगे, भले ही यह पुराना, नया, स्थैतिक, गतिशील, संपीड़ित, एक्रोबैट-आधारित या लाइवसाइकल आधारित हो।

आपको चीजों को सेट करने में सक्षम होना चाहिए, फॉर्म को अपना डेटा LiveCycle सर्वर पर भेजना चाहिए, और उस डेटा का उपयोग फॉर्म को पॉप्युलेट करने के लिए करें। भरने को सर्वर के डेटाबेस में संग्रहीत किया जा सकता है, या पीडीएफ फॉर्म (या किसी अन्य रूप में) में घुमाया जा सकता है और क्लाइंट को वापस स्ट्रीम किया जा सकता है।

LiveCycle Designer का उपयोग कर फ़ॉर्म बनाएं।

त्वरित और गंदे विकल्प निम्न होंगे: फ़ॉर्म को http-post पर सेट करें (उदाहरण के लिए एक xfdf, अधिक जानकारी के लिए एक्रोबैट देखें) और अपने सर्वर पर प्रकाशित करें (इसे बनाएं सुनिश्चित करें कि आपके उपयोगकर्ता इसे खोलने से पहले फॉर्म डाउनलोड नहीं करते हैं, अन्यथा यह काम नहीं करेगा। फ़ॉर्म को वेब ब्राउज़र में खोला जाना है)। फिर बस सबमिशन को कैप्चर करें क्योंकि आप किसी वेब पेज से http-Post को कैप्चर करेंगे। वैकल्पिक रूप से, डेटाबेस को भरें सहेजें। फिर कब्जा कर लिया गया xfdf स्ट्रीम क्लाइंट को वापस भरें (जिसे बाद में एक http-link के माध्यम से भी बुलाया जा सकता है)। एक्सएफडीएफ स्ट्रीम में इसे भरने के लिए प्रयुक्त फॉर्म का यूआरएल होगा। क्लाइंट वेब ब्राउज़र xfdf स्ट्रीम को संभालने के लिए एक्रोबैट/एडोब रीडर प्लग से पूछेगा, और प्लग एक्सएफडीएफ द्वारा इंगित फॉर्म को ढूंढ, डाउनलोड और पॉप्युलेट करेगा।

उपयोगकर्ता अब फ़ॉर्म को सहेजने में सक्षम होना चाहिए और यह भरना है - कोई पाठक एक्सटेंशन की आवश्यकता नहीं है!

+0

@Christian - मैं उपयोगकर्ता पक्ष में नहीं, सर्वर पर पीडीएफ फ़ाइल को सहेजना होगा। – Giorgi

3

यदि संभव हो तो मैं चौथे दृष्टिकोण का उपयोग करने का सुझाव दूंगा क्योंकि यह क्लीनर होगा। आप जो समाधान करना चाहते हैं उसके लिए विशेष रूप से तैयार समाधानों का उपयोग करेंगे, लेकिन यदि आपके पास ऐसे समाधान के लिए उपलब्ध संसाधन नहीं हैं तो मैं पहले विकल्प का उपयोग करने का सुझाव दूंगा।

पहला विकल्प वह है जो मैंने हाल ही में किया है। मैंने इसे कार्यान्वित करने के लिए अपेक्षाकृत दर्द रहित पाया है।

विकल्प 1 संभव है यदि निम्न लागू होगा:

  1. आप पीडीएफ रूपों के विकास के नियंत्रण है।
  2. आप formating एक्सएमएल डेटा का नियंत्रण है
  3. आप असम्पीडित (Fastweb = false) पीडीएफ फाइलों

कार्यान्वयन का उदाहरण होने के साथ रह सकते हैं है

  1. एडोब एक्रोबेट का उपयोग करते हुए एक उत्पन्न करने के लिए पीडीएफ फॉर्म युक्ति: फ़ॉर्म उत्पन्न करते समय एडोब मूल फ़ॉन्ट का उपयोग करें। प्रत्येक नियंत्रण के लिए आप जोड़ते हैं कि यह देशी फ़ॉन्ट नहीं है, यह इस्तेमाल किए गए फ़ॉन्ट को आयात करेगा और फ़ाइल को संपीड़ित होने पर ब्लोट करेगा, और मेरे ज्ञान के लिए ITextSharp वर्तमान में संकुचित पीडीएफ का उत्पादन नहीं करता है।

  2. पॉपक्टेड दस्तावेज़ उत्पन्न करने के लिए पीडीएफ फॉर्म के साथ XML डेटा को गठबंधन करने के लिए ITextSharp लाइब्रेरी का उपयोग करना। युक्ति: एक्सएमएल से पीडीएफ फॉर्म को मैन्युअल रूप से पॉप्युलेट करने के लिए आपको पीडीएफ फॉर्म में नामों को नियंत्रित करने के लिए एक्सएमएल मानों को मैप करना होगा और नीचे दिए गए उदाहरण में दिखाए गए पृष्ठ से मिलान करना होगा।

    using (MemoryStream stream = GeneratePDF(m_FormsPath, oXmlData)) 
    { 
         byte[] bytes = stream.ToArray(); 
         Response.ContentType = "application/pdf"; 
         Response.BinaryWrite(bytes); 
         Response.End(); 
    } 
    
    // <summary> 
    // This method combines pdf forms with xml data 
    // </summary> 
    // <param name="m_FormName">pdf form file path</param> 
    // <param name="oData">xml dataset</param> 
    // <returns>memory stream containing the pdf data</returns> 
    private MemoryStream GeneratePDF(string m_FormName, XmlDocument oData) 
    { 
    PdfReader pdfTemplate; 
    PdfStamper stamper; 
    PdfReader tempPDF; 
    Document doc; 
    MemoryStream msTemp; 
    PdfWriter pCopy; 
    MemoryStream msOutput = new MemoryStream(); 
    
    pdfTemplate = new PdfReader(m_FormName); 
    
    doc = new Document(); 
    pCopy = new PdfCopy(doc, msOutput); 
    
    pCopy.AddViewerPreference(PdfName.PICKTRAYBYPDFSIZE, new PdfBoolean(true)); 
    pCopy.AddViewerPreference(PdfName.PRINTSCALING, PdfName.NONE); 
    
    doc.Open(); 
    
    for (int i = 1; i < pdfTemplate.NumberOfPages + 1; i++) 
    { 
        msTemp = new MemoryStream(); 
        pdfTemplate = new PdfReader(m_FormName); 
    
        stamper = new PdfStamper(pdfTemplate, msTemp); 
    
        // map xml values to pdf form controls (element name = control name) 
        foreach (XmlElement oElem in oData.SelectNodes("/form/page" + i + "/*")) 
        { 
         stamper.AcroFields.SetField(oElem.Name, oElem.InnerText); 
        } 
    
        stamper.FormFlattening = true; 
        stamper.Close(); 
        tempPDF = new PdfReader(msTemp.ToArray()); 
        ((PdfCopy)pCopy).AddPage(pCopy.GetImportedPage(tempPDF, i)); 
        pCopy.FreeReader(tempPDF); 
    } 
    
    doc.Close(); 
    
    return msOutput; 
    } 
    
  3. फ़ाइल सहेजें या अपने ASP.Net पेज की प्रतिक्रिया

0

तुम भी iTextSharp उपयोग कर सकते हैं एक रीडर एक्सटेंशन सक्षम रूप में XML डेटा को भरने के लिए करने के लिए फ़ाइल को पोस्ट ।

  1. सेट PdfReader.unethicalreading = trueBadPasswordException को रोकने के लिए: वहाँ दो चीजें आप सही तरीके से निर्धारित करने की आवश्यकता है। PdfStamper के निर्माता में
  2. सेट संलग्न मोड, अन्यथा Adobe Reader एक्सटेंशन हस्ताक्षर टूटा हुआ हो जाता है और Adobe Reader निम्न संदेश प्रदर्शित करेगा: "यह दस्तावेज Adobe Reader में विशेष सुविधाओं को सक्षम करने कुछ अधिकार निहित दस्तावेज़ किया गया है। इसे बनाया गया था क्योंकि यह बनाया गया था और ये अधिकार अब मान्य नहीं हैं। कृपया इस दस्तावेज़ के मूल संस्करण के लिए लेखक से संपर्क करें। "

तो तुम सब करने की जरूरत है यह है:

PdfReader.unethicalreading = true; 
using (var pdfReader = new PdfReader("form.pdf")) 
{ 
    using (var outputStream = new FileStream("filled.pdf", FileMode.Create, FileAccess.Write)) 
    { 
     using (var stamper = new iTextSharp.text.pdf.PdfStamper(pdfReader, outputStream, '\0', true)) 
     { 
      stamper.AcroFields.Xfa.FillXfaForm("data.xml"); 
     } 
    } 
} 

देखें How to fill XFA form using iText?

संबंधित मुद्दे