Akışlar ve Dosya Ekleri

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 MemoryStream yerine OptimizedMemoryStream tercih 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çin EmbeddedFiles‘i yinelemeden önce kontrol edin.
  • Her FileSpecification üzerinde MimeType ve AFRelationship ayarlayı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.FindByName kullanın.

Yaygın Sorunlar

SorunNedenDüzeltme
OutOfMemoryException büyük bir belgeyi akışa kaydetmeMemoryStream tek bir ~2GB arka plan dizisiyle sınırlıdırBunun yerine OptimizedMemoryStream‘a kaydedin
FileSpecification.GetData() boş bir dizi döndürürKaynak 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ürEk 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ırBirden fazla ek aynı adı paylaşıyorBelirsiz 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 / MetotAçıklama
OptimizedMemoryStream2GB sınırını MemoryStream aşan büyütülebilir bellek içi akış
OptimizedMemoryStream.WriteBaytları tampon içine yaz
OptimizedMemoryStream.ToArrayTamponlanmış baytları bayt dizisi olarak döndür
FileSpecificationAkış ya da bayt verisiyle desteklenen gömülü dosya eki tanımlayıcısı
FileSpecification.GetDataGömülü bir dosyanın ham baytlarını al
FileSpecification.ParamsGömülü dosya için meta veriler (boyut, sağlama, tarihler)
EmbeddedFileCollectionDocument üzerindeki FileSpecification eklerin koleksiyonu
EmbeddedFileCollection.FindByNameEki ada göre ara
EmbeddedFileCollection.DeleteEk’i adla kaldır
Document.AddEmbeddedFileHam baytlardan bir dosyayı gömmek için kullanışlı yöntem
Document.EmbeddedFilesBelgenin gömülü dosya koleksiyonu
Document.HasEmbeddedFilesBelgenin gömülü dosya içerip içermediği
FileParamsGömülü bir dosya akışı için boyut/sağlama/kontrol toplamı/tarih meta verilerini sarar

Ayrıca Bakınız

 Türkçe