Akışlar ve Dosya Ekleri
Akışlar ve Dosya Ekleri
Temel Document.Open/Document.Save aşırı yüklemelerinin ötesinde, Aspose.PDF FOSS for .NET, belgelerde baytların nasıl içeri ve dışarı hareket ettiğini daha ince bir kontrol sağlar – çok büyük dosyalar için büyütülebilir bellek içi tamponlar ve FileSpecification ve EmbeddedFileCollection aracılığıyla dosya eklerini gömmek, incelemek ve çıkarmak için özel bir API.
2GB’nin üzerindeki bellek içi tamponları büyütme
MemoryStream, verilerini tek bir bitişik dizi içinde depolar ve bu yaklaşık 2GB’de sınırlanır. OptimizedMemoryStream ise verileri sabit boyutlu parçalar halinde depolar, böylece PDF’yi tamamen bellekte kaydettiğinizde veya oluşturduğunuzda çok daha büyük belgeleri tutabilir.
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}");Aynı Stream ile yaptığınız gibi, ona doğrudan da yazabilirsiniz:
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);Bir dosyayı doğrudan bir akıştan gömme
FileSpecification, ek’i önce bir byte[]‘ye tamponlamanızı gerektirmek yerine bir Stream sarabilir. Bu, ek kaynağı kendisi bir akış olduğunda, örneğin açık bir dosya tutamağı gibi, kullanışlıdır.
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");Ham baytlardan bir dosya ekleme
Document.AddEmbeddedFile, bir FileSpecification doğrudan oluşturmadan, bir bayt dizisinden doğrudan bir dosya eklemek için bir kolaylık yöntemidir.
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");Eklenmiş dosyaları listeleme ve çıkarma
Document.EmbeddedFiles, listeleyebileceğiniz bir EmbeddedFileCollectiondir. Her giriş bir FileSpecificationdır ve GetData(), ekin ham baytlarını döndürür.
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);
}
}Ekleri bulma, inceleme ve kaldırma
Tek bir eki bulmak için FindByName, meta verilerini okumak için Params ve kaldırmak için Delete/DeleteByKey kullanın.
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");İpuçları ve En İyi Uygulamalar
- Bellekteki bir belge 2GB’ı aşabilecek durumlarda
MemoryStreamyerineOptimizedMemoryStreamtercih edin —MemoryStream, tek destekleyici dizisi bu sınıra ulaştığında bir istisna fırlatır. - Dispose
FileSpecificationörneklerini (ve onlar için manuel olarak açtığınız herhangi bir akışı) serbest bırakın –FileSpecification,IDisposable‘yi uygular. Document.HasEmbeddedFiles‘ı, ekleri olmayan belgelerde gereksiz enumerasyonu atlamak içinEmbeddedFiles‘i yinelemeden önce kontrol edin.- Her
FileSpecificationüzerindeMimeTypeveAFRelationshipayarlayın, böylece aşağı akış PDF tüketicileri ekleri doğru şekilde sınıflandırabilir. - Manuel bir döngü yazmak yerine tek bir adlandırılmış arama için
EmbeddedFileCollection.FindByNamekullanın.
Yaygın Sorunlar
| Sorun | Neden | Düzeltme |
|---|---|---|
OutOfMemoryException büyük bir belgeyi akışa kaydetme | MemoryStream tek bir ~2GB arka plan dizisiyle sınırlıdır | Bunun yerine OptimizedMemoryStream‘a kaydedin |
FileSpecification.GetData() boş bir dizi döndürür | Kaynak akış konumu, FileSpecification oluşturulmadan önce sıfırlanmadı | Akışı konum 0’a (veya yeniden açarak) FileSpecification‘a geçirmeden önce konumlandırın |
EmbeddedFiles.FindByName null döndürür | Ek adı tam olarak eşleşmiyor (arama isim temelli) | doc.EmbeddedFiles‘ı yineleyin ve Name değerlerini karşılaştırın, ya da Keys‘yi kontrol edin |
| Bir eki silmek yanlış girdiyi kaldırır | Birden fazla ek aynı adı paylaşıyor | Belirsiz olmayan bir kaldırma için DeleteByKey‘ı Keys‘den alınan tam anahtarla kullanın |
FAQ
MemoryStream ile OptimizedMemoryStream arasındaki fark nedir?
MemoryStream, baytlarını yaklaşık 2GB’lık bir sınırla tek bir bitişik dizi içinde depolar. OptimizedMemoryStream ise verileri sabit boyutlu parçalar halinde depolar, böylece bu sınırlamayı aşabilir — çok büyük dosyalar üzerinde tamamen bellek içinde gerçekleştirilen Document.Save işlemleri için faydalıdır.
Bir dosyayı önce bir byte[]’e yüklemeden gömebilir miyim?
Evet. FileSpecification(stream, name, description) bir Stream‘ı doğrudan kabul eder, böylece File.OpenRead(...)‘den veya başka herhangi bir akıştan, kendiniz belleğe tamponlamadan gömebilirsiniz.
Bir belgede gömülü dosyayı nasıl geri çıkarabilirim?
doc.EmbeddedFiles‘ı yineleyin ve her FileSpecification üzerinde GetData() çağırarak ham baytları alın.
EmbeddedFileCollection.Delete(name) o isimdeki tüm ekleri kaldırır mı?
Hayır — aynı ada sahip birden fazla ek varsa, DeleteByKey ile tam olarak bir eki ve Keys‘den belirli anahtarı hedefleyin.
FileSpecification birden çok belgede yeniden kullanmak için güvenli mi?
Hayır. FileSpecification, IDisposable‘i uygular ve tek bir gömülü dosya akışını sarar; belge başına ek başına yeni bir örnek oluşturun.
API Reference Özeti
| Sınıf / Metot | Açıklama |
|---|---|
OptimizedMemoryStream | 2GB sınırını MemoryStream aşan büyütülebilir bellek içi akış |
OptimizedMemoryStream.Write | Baytları tampon içine yaz |
OptimizedMemoryStream.ToArray | Tamponlanmış baytları bayt dizisi olarak döndür |
FileSpecification | Akış ya da bayt verisiyle desteklenen gömülü dosya eki tanımlayıcısı |
FileSpecification.GetData | Gömülü bir dosyanın ham baytlarını al |
FileSpecification.Params | Gömülü dosya için meta veriler (boyut, sağlama, tarihler) |
EmbeddedFileCollection | Document üzerindeki FileSpecification eklerin koleksiyonu |
EmbeddedFileCollection.FindByName | Eki ada göre ara |
EmbeddedFileCollection.Delete | Ek’i adla kaldır |
Document.AddEmbeddedFile | Ham baytlardan bir dosyayı gömmek için kullanışlı yöntem |
Document.EmbeddedFiles | Belgenin gömülü dosya koleksiyonu |
Document.HasEmbeddedFiles | Belgenin gömülü dosya içerip içermediği |
FileParams | Gömülü bir dosya akışı için boyut/sağlama/kontrol toplamı/tarih meta verilerini sarar |