2011-06-10 15 views
5

मेरे पास एक बड़ी संख्या में पीडीएफ दस्तावेज हैं जो उनके साथ जुड़ी एक्सएमएल फाइलें हैं। मैं उन संलग्न एक्सएमएल फाइलों को निकालना और उन्हें पढ़ना चाहता हूं। मैं .NET का उपयोग करके प्रोग्रामिक रूप से यह कैसे कर सकता हूं?मैं पीडीएफ फ़ाइल से अनुलग्नक कैसे निकालूं?

+0

महान प्रश्न, यह बहुत मददगार है, लेकिन क्या मैं जावास्क्रिप्ट या jquery –

उत्तर

6

iTextSharp संलग्नक निकालने में भी काफी सक्षम है ... उह ... हालांकि आपको ऐसा करने के लिए निम्न स्तर की वस्तुओं का उपयोग करना पड़ सकता है।

  1. एक फ़ाइल एनोटेशन
  2. दस्तावेज़ स्तर "EmbeddedFiles" पर में:

    वहाँ एक पीडीएफ में फ़ाइलों को एम्बेड करने के लिए दो तरीके हैं।

एक बार आपके पास स्रोत से फ़ाइल विनिर्देश शब्दकोश होने के बाद, फ़ाइल स्वयं "ईएफ" (एम्बेडेड फ़ाइल) लेबल वाली स्ट्रीम में होगी।

तो दस्तावेज़ स्तर पर सभी फाइलों को सूचीबद्ध करने के लिए, एक कोड (जावा में) लिखते थे thusly:

Map<String, byte[]> files = new HashMap<String,byte[]>(); 

PdfReader reader = new PdfReader(pdfPath); 
PdfDictionary root = reader.getCatalog(); 
PdfDictionary names = root.getAsDict(PdfName.NAMES); // may be null 
PdfArray embeddedFiles = names.getAsArray(PdfName.EMBEDDEDFILES); //may be null 
int len = embeddedFiles.size(); 
for (int i = 0; i < len; i += 2) { 
    PdfName name = embeddedFiles.getAsName(i); // should always be present 
    PdfDictionary fileSpec = embeddedFiles.getAsDict(i+1); // ditto 
    PRStream stream = (PRStream)fileSpec.getAsStream(PdfName.EF); 
    if (stream != null) { 
    files.put(PdfName.decodeName(name.toString()), stream.getBytes()); 
    } 
} 
+0

धन्यवाद। मैं इसे आज़माउंगा। कोड नमूना के लिए +1। – gyurisc

+0

मुझे इस लाइन के साथ परेशानी है PdfArray एम्बेडेडफ़ाइल = names.getAsDictionary (PdfName.EMBEDDEDFILES); कंपाइलर का कहना है कि यह PdfDictionary को PdfArray – gyurisc

+0

ओप्स में परिवर्तित नहीं कर सकता है। जब आप ब्राउज़र में कोड लिखते हैं तो यही होता है। इसे 'getAsArray() 'कॉल करना चाहिए। –

2

ABCpdf -Library, मेरी राय में बहुत आसान और तेज़ के लिए देखो।

+1

का उपयोग करके पीडीएफ फ़ाइल से अनुलग्नक निकाल सकता हूं, सुझाव के लिए धन्यवाद, मैं इसे आज़मा दूंगा। सुझाव के लिए – gyurisc

1

आप Aspose.Pdf.Kit for .NET कोशिश कर सकते हैं। PdfExtractor क्लास आपको दो विधियों की सहायता से अनुलग्नक निकालने की अनुमति देता है: एक्स्ट्रेक्ट एटैचमेंट और GetAttachment। कृपया example of attachment extraction देखें।

प्रकटीकरण: मैं Aspose पर डेवलपर प्रचारक के रूप में काम करता हूं।

1

जो कुछ मैं काम कर रहा हूं वह थोड़ा अलग है, फिर मैंने ऑनलाइन देखा है।

तो, बस मामले में, मैंने सोचा कि मैं इसे किसी और की मदद के लिए यहां पोस्ट करूंगा। मुझे पता लगाने के लिए कई अलग-अलग पुनरावृत्तियों से गुज़रना पड़ा - कठिन तरीका - मुझे इसे काम करने के लिए क्या चाहिए।

मैं दो पीडीएफ को तीसरे पीडीएफ में विलय कर रहा हूं, जहां पहले दो पीडीएफ में से एक फ़ाइल संलग्नक हो सकता है जिसे तीसरे पीडीएफ में ले जाने की आवश्यकता है। मैं पूरी तरह से एएसपी.नेट, सी # 4.0, आईटीक्स्टशर्प 5.1.2.0 के साथ धाराओं में काम कर रहा हूं।

 // Extract Files from Submit PDF 
     Dictionary<string, byte[]> files = new Dictionary<string, byte[]>(); 

     PdfDictionary names; 
     PdfDictionary embeddedFiles; 
     PdfArray fileSpecs; 
     int eFLength = 0; 


     names = writeReader.Catalog.GetAsDict(PdfName.NAMES); // may be null, writeReader is the PdfReader for a PDF input stream 
     if (names != null) 
     { 
      embeddedFiles = names.GetAsDict(PdfName.EMBEDDEDFILES); //may be null 
      if (embeddedFiles != null) 
      { 
       fileSpecs = embeddedFiles.GetAsArray(PdfName.NAMES); //may be null 
       if (fileSpecs != null) 
       { 
        eFLength = fileSpecs.Size; 

        for (int i = 0; i < eFLength; i++) 
        { 
         i++; //objects are in pairs and only want odd objects (1,3,5...) 
         PdfDictionary fileSpec = fileSpecs.GetAsDict(i); // may be null 
         if (fileSpec != null) 
         { 
          PdfDictionary refs = fileSpec.GetAsDict(PdfName.EF); 
          foreach (PdfName key in refs.Keys) 
          { 
           PRStream stream = (PRStream)PdfReader.GetPdfObject(refs.GetAsIndirectObject(key)); 

           if (stream != null) 
           { 
            files.Add(fileSpec.GetAsString(key).ToString(), PdfReader.GetStreamBytes(stream)); 
           } 
          } 
         } 
        } 
       } 
      } 
     } 
2

यह एक पुरानी सवाल, फिर भी मुझे लगता है कि मेरी वैकल्पिक समाधान (PDF Clown का प्रयोग करके) के रूप में कुछ रुचि का हो सकता है कि यह तरीका अधिक स्वच्छ (और अधिक पूर्ण, के रूप में यह दस्तावेज़ और पृष्ठ के स्तर पर दोनों iterates) है से कोड के टुकड़े पहले से प्रस्तावित:

using org.pdfclown.bytes; 
using org.pdfclown.documents; 
using org.pdfclown.documents.files; 
using org.pdfclown.documents.interaction.annotations; 
using org.pdfclown.objects; 

using System; 
using System.Collections.Generic; 

void ExtractAttachments(string pdfPath) 
{ 
    Dictionary<string, byte[]> attachments = new Dictionary<string, byte[]>(); 

    using(org.pdfclown.files.File file = new org.pdfclown.files.File(pdfPath)) 
    { 
    Document document = file.Document; 

    // 1. Embedded files (document level). 
    foreach(KeyValuePair<PdfString,FileSpecification> entry in document.Names.EmbeddedFiles) 
    {EvaluateDataFile(attachments, entry.Value);} 

    // 2. File attachments (page level). 
    foreach(Page page in document.Pages) 
    { 
     foreach(Annotation annotation in page.Annotations) 
     { 
     if(annotation is FileAttachment) 
     {EvaluateDataFile(attachments, ((FileAttachment)annotation).DataFile);} 
     } 
    } 
    } 
} 

void EvaluateDataFile(Dictionary<string, byte[]> attachments, FileSpecification dataFile) 
{ 
    if(dataFile is FullFileSpecification) 
    { 
    EmbeddedFile embeddedFile = ((FullFileSpecification)dataFile).EmbeddedFile; 
    if(embeddedFile != null) 
    {attachments[dataFile.Path] = embeddedFile.Data.ToByteArray();} 
    } 
} 

ध्यान दें कि आप नल पॉइंटर अपवादों के साथ परेशान करने के लिए नहीं है के रूप में पीडीएफ जोकर चिकनी मॉडल ट्रेवर्सल सुनिश्चित करने के लिए सभी आवश्यक अमूर्त और स्वचालन प्रदान करता है।

पीडीएफ क्लाउन एक एलजीपीएल 3 लाइब्रेरी है, जिसे जावा और .NET प्लेटफॉर्म दोनों में लागू किया गया है (मैं इसका मुख्य डेवलपर हूं): यदि आप इसे आज़माकर देखना चाहते हैं, तो मैं आपको स्रोत फोर्ज पर अपनी एसवीएन रिपॉजिटरी जांचने का सुझाव देता हूं। नेट के रूप में यह विकसित रहता है।

+0

अपना समाधान जोड़ने के लिए धन्यवाद। यह बहुत उपयोगी है! – gyurisc

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