स्ट्रीम और फ़ाइल संलग्नक
स्ट्रीम और फ़ाइल संलग्नक
बेसिक 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
FileSpecificationinstances (और कोई भी स्ट्रीम जिसे आपने उनके लिए मैन्युअल रूप से खोला है) –FileSpecificationimplementsIDisposable. Document.HasEmbeddedFilesजांचें before iteratingEmbeddedFilesto 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 | एम्बेडेड फ़ाइल स्ट्रीम के लिए आकार/चेकसम/तारीख मेटाडेटा को रैप करता है |