स्ट्रीम और फ़ाइल संलग्नक

स्ट्रीम और फ़ाइल संलग्नक

स्ट्रीम और फ़ाइल संलग्नक

बेसिक Document.Open/Document.Save ओवरलोड्स से आगे, Aspose.PDF FOSS for .NET आपको बाइट्स के दस्तावेज़ में अंदर-और-बाहर जाने पर अधिक सूक्ष्म नियंत्रण देता है — बहुत बड़ी फ़ाइलों के लिए बढ़ने योग्य इन-मेमोरी बफ़र्स, और FileSpecification और EmbeddedFileCollection के माध्यम से फ़ाइल अटैचमेंट्स को एम्बेड, निरीक्षण और निकालने के लिए एक समर्पित API।


2GB से अधिक इन-मेमोरी बफ़र्स को बढ़ाना

MemoryStream अपना डेटा एक एकल लगातार एरे में संग्रहीत करता है, जिसकी सीमा लगभग 2GB है। OptimizedMemoryStream डेटा को निश्चित आकार के टुकड़ों में संग्रहीत करता है, इसलिए जब आप पूरी तरह मेमोरी में PDF सहेजते या बनाते हैं तो यह बहुत बड़े दस्तावेज़ रख सकता है।

using Aspose.Pdf;

using var doc = Document.Open("large-input.pdf");
using var buffer = new OptimizedMemoryStream();

doc.Save(buffer);

buffer.Seek(0, SeekOrigin.Begin);
byte[] allBytes = buffer.ToArray();
Console.WriteLine($"Buffer length: {buffer.Length}");

आप इसे सीधे भी लिख सकते हैं, बिलकुल उसी तरह जैसे आप किसी भी Stream के साथ करेंगे:

using var buffer = new OptimizedMemoryStream();
byte[] chunk = System.Text.Encoding.UTF8.GetBytes("raw content chunk");

buffer.Write(chunk, 0, chunk.Length);
buffer.WriteByte(0x0A);
buffer.SetLength(buffer.Length);

स्ट्रीम से सीधे फ़ाइल एम्बेड करना

FileSpecification एक Stream को रैप कर सकता है, बजाय इसके कि आपको अटैचमेंट को पहले एक byte[] में बफ़र करना पड़े। यह तब उपयोगी होता है जब अटैचमेंट स्रोत स्वयं एक स्ट्रीम हो, जैसे कि खुला फ़ाइल हैंडल।

using Aspose.Pdf;

using var doc = Document.Open("input.pdf");
using var attachmentStream = File.OpenRead("report.csv");
using var spec = new FileSpecification(attachmentStream, "report.csv", "Quarterly report data");

spec.MimeType = "text/csv";
spec.AFRelationship = AFRelationship.Data;
spec.Encoding = FileEncoding.Zip;

doc.EmbeddedFiles.Add(spec);
doc.Save("with-attachment.pdf");

कच्चे बाइट्स से फ़ाइल को एम्बेड करना

Document.AddEmbeddedFile एक सुविधा विधि है जो फ़ाइल को सीधे बाइट एरे से एम्बेड करती है, बिना सीधे FileSpecification का निर्माण किए।

using Aspose.Pdf;

using var doc = Document.Open("input.pdf");
byte[] fileData = File.ReadAllBytes("appendix.docx");

doc.AddEmbeddedFile(
    "appendix.docx",
    fileData,
    "Supporting appendix",
    "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
    true,
    DateTime.Now,
    DateTime.Now);

doc.Save("with-appendix.pdf");

एंबेडेड फ़ाइलों को सूचीबद्ध करना और निकालना

Document.EmbeddedFiles एक EmbeddedFileCollection है जिसे आप सूचीबद्ध कर सकते हैं। प्रत्येक प्रविष्टि एक FileSpecification है, और GetData() अटैचमेंट के कच्चे बाइट्स लौटाता है।

using Aspose.Pdf;

using var doc = Document.Open("with-attachment.pdf");

if (doc.HasEmbeddedFiles)
{
    foreach (FileSpecification file in doc.EmbeddedFiles)
    {
        Console.WriteLine($"{file.Name} ({file.Size} bytes, {file.MimeType})");
        byte[] contents = file.GetData();
        File.WriteAllBytes(file.Name, contents);
    }
}

अटैचमेंट खोजना, निरीक्षण करना और हटाना

एकल अटैचमेंट को खोजने के लिए FindByName का उपयोग करें, उसका मेटाडेटा पढ़ने के लिए Params, और उसे हटाने के लिए Delete/DeleteByKey का उपयोग करें।

using Aspose.Pdf;

using var doc = Document.Open("with-attachment.pdf");

FileSpecification? found = doc.EmbeddedFiles.FindByName("report.csv");
if (found?.Params is FileParams info)
{
    Console.WriteLine($"{found.Name}: {info.Size} bytes, checksum {info.CheckSum}, modified {info.ModDate}");
}

doc.EmbeddedFiles.Delete("report.csv");
Console.WriteLine($"Remaining attachments: {doc.EmbeddedFiles.Count}");
doc.Save("cleaned.pdf");

टिप्स और सर्वोत्तम प्रथाएँ

  • जब भी इन-मे़मरी दस्तावेज़ 2GB से अधिक हो सकता है, तो MemoryStream की बजाय OptimizedMemoryStream को प्राथमिकता दें — MemoryStream तब अपवाद फेंकता है जब उसकी एकल बैकिंग एरे उस सीमा तक पहुँचती है।
  • Dispose FileSpecification instances (और कोई भी स्ट्रीम जिसे आपने उनके लिए मैन्युअल रूप से खोला है) – FileSpecification implements IDisposable.
  • Document.HasEmbeddedFiles जांचें before iterating EmbeddedFiles to skip unnecessary enumeration on documents without attachments.
  • प्रत्येक FileSpecification पर MimeType और AFRelationship सेट करें ताकि डाउनस्ट्रीम PDF उपभोक्ता अटैचमेंट्स को सही ढंग से वर्गीकृत कर सकें।
  • एकल नामित लुकअप के लिए EmbeddedFileCollection.FindByName का उपयोग करें, बजाय मैन्युअल लूप लिखने के।

सामान्य समस्याएँ

समस्याकारणसमाधान
OutOfMemoryException बड़े दस्तावेज़ को स्ट्रीम में सहेजनाMemoryStream केवल एक ~2GB बैकिंग एरे तक सीमित हैइसके बजाय OptimizedMemoryStream में सहेजें
FileSpecification.GetData() एक खाली एरे लौटाता हैस्रोत स्ट्रीम स्थिति FileSpecification बनने से पहले रीसेट नहीं की गई थीस्ट्रीम को पोजीशन 0 पर ले जाएँ (या इसे पुनः खोलें) इससे पहले कि इसे FileSpecification को पास करें
EmbeddedFiles.FindByName वापस देता है nullसंलग्नक का नाम ठीक-ठीक मेल नहीं खाता (खोज नाम-आधारित है)doc.EmbeddedFiles को इटरेट करें और Name मानों की तुलना करें, या Keys जांचें
संलग्नक को हटाने से गलत प्रविष्टि हट जाती हैएकाधिक संलग्नकों का एक ही नाम हैअस्पष्टता रहित हटाने के लिए Keys से सटीक कुंजी के साथ DeleteByKey का उपयोग करें

FAQ

MemoryStream और OptimizedMemoryStream में क्या अंतर है?

MemoryStream अपने बाइट्स को लगभग 2GB के निकट सीमित एक निरंतर एरे में संग्रहीत करता है। OptimizedMemoryStream डेटा को स्थिर-आकार के टुकड़ों में संग्रहीत करता है, इसलिए यह उस सीमा से आगे बढ़ सकता है — यह Document.Save संचालन के लिए उपयोगी है जो पूरी तरह मेमोरी में बहुत बड़ी फाइलों पर किए जाते हैं।

क्या मैं फ़ाइल को पहले byte[] में लोड किए बिना एंबेड कर सकता हूँ?

हाँ। FileSpecification(stream, name, description) सीधे एक Stream स्वीकार करता है, इसलिए आप File.OpenRead(...) या किसी अन्य स्ट्रीम से बिना स्वयं मेमोरी में बफ़र किए एंबेड कर सकते हैं।

मैं किसी दस्तावेज़ से एंबेड की गई फ़ाइल को वापस कैसे प्राप्त करूं?

doc.EmbeddedFiles को इटरेट करें और प्रत्येक FileSpecification पर GetData() कॉल करें ताकि कच्चे बाइट प्राप्त कर सकें।

क्या EmbeddedFileCollection.Delete(name) उस नाम वाले सभी अटैचमेंट को हटा देता है?

नहीं — यदि कई अटैचमेंट का नाम समान है तो DeleteByKey से ठीक एक अटैचमेंट को लक्षित करें और Keys से विशिष्ट कुंजी का उपयोग करें।

क्या FileSpecification को कई दस्तावेज़ों में पुन: उपयोग करना सुरक्षित है?

नहीं। FileSpecification IDisposable को लागू करता है और एक एकल एंबेडेड-फ़ाइल स्ट्रीम को रैप करता है; प्रत्येक अटैचमेंट के लिए प्रत्येक दस्तावेज़ में नया इंस्टेंस बनाएं।


API Reference सारांश

क्लास / मेथडविवरण
OptimizedMemoryStreamबढ़ने योग्य इन-मेमोरी स्ट्रीम जो MemoryStream की 2GB सीमा से अधिक है
OptimizedMemoryStream.Writeबफ़र में बाइट्स लिखें
OptimizedMemoryStream.ToArrayबफ़र किए गए बाइट्स को बाइट एरे के रूप में लौटाएँ
FileSpecificationएम्बेडेड फ़ाइल अटैचमेंट डिस्क्रिप्टर, जो स्ट्रीम या बाइट डेटा द्वारा समर्थित है
FileSpecification.GetDataएम्बेडेड फ़ाइल के कच्चे बाइट्स प्राप्त करें
FileSpecification.Paramsएम्बेडेड फ़ाइल के लिए मेटाडेटा (आकार, चेकसम, तिथियाँ)
EmbeddedFileCollectionएक Document पर FileSpecification अटैचमेंट्स का संग्रह
EmbeddedFileCollection.FindByNameनाम के आधार पर अटैचमेंट खोजें
EmbeddedFileCollection.Deleteनाम द्वारा अटैचमेंट हटाएँ
Document.AddEmbeddedFileकच्चे बाइट्स से फ़ाइल को एंबेड करने की सुविधा विधि
Document.EmbeddedFilesदस्तावेज़ एंबेडेड फ़ाइल संग्रह
Document.HasEmbeddedFilesक्या दस्तावेज़ में कोई एंबेडेड फ़ाइलें हैं या नहीं
FileParamsएम्बेडेड फ़ाइल स्ट्रीम के लिए आकार/चेकसम/तारीख मेटाडेटा को रैप करता है

यह भी देखें

 हिन्दी