Bir PDF içinde başka dosyalar barındırabilir. Bu, sözleşmeler ve elektronik tabloları bir araya getiren bir portföy ya da kaynak verileri ekli bir rapor olabilir. Kod içinde bu dosyaları çıkardığınızda, her birinin yazarının verdiği adla kaydedilmesini istersiniz, attachment1.bin gibi bir adla değil. Bu öğreticide, Aspose.PDF for .NET kullanarak C# içinde gömülü dosyaları orijinal adlarıyla PDF’ten nasıl çıkaracağınızı gösterir. Bir PDF açacak, gömülü dosyaları döngüyle gezerek her dosyanın adını FileSpecification.GetFileName ile çözecek ve içeriği bir klasöre yazacaksınız.

PDF’de gömülü bir dosyanın adının nerede saklandığı

Her gömülü dosya bir dosya spesifikasyonu ile tanımlanır ve bir dosya spesifikasyonu ismi birden fazla yerde kaydedebilir. Unicode dosya adı, standart dosya adı ve dosyanın belgenin gömülü dosyalar koleksiyonunda listelendiği anahtar vardır. PDF üreticileri bunları tutarlı bir şekilde doldurmaz ve bazıları ismi tamamen bırakır.

Aspose.PDF for .NET, bu durumla başa çıkmak için FileSpecification.GetFileName proprty özelliğini sağlar. İsim, Unicode adından, normal dosya adından veya koleksiyon anahtarından, hangisi mevcutsa, çözülür, böylece Unicode adı eksik olduğunda bile kullanılabilir bir ad elde edersiniz. Hiç adı olmayan dosyalar için bir yedek ad geçirebilirsiniz. İsteğe bağlı ikinci parametre, dosya adı mevcut olmadığında boş bir adın izin verilip verilmeyeceğini kontrol eder. PDF sözlüklerini okuma için kendi mantığınız yerine tek bir çağrı alırsınız.

Not: Bu makaledeki örnekler yalnızca geri dönüş argümanını kullanır.

Document.EmbeddedFiles belge düzeyindeki ekleri tutar, bu PDF portföyündeki dosyaları da içerir. Belirli bir sayfaya dosya ekleme açıklaması (genellikle bir ataç simgesi olarak gösterilir) aracılığıyla eklenen dosyalar açıklama üzerinde saklanır; Sayfalara eklenmiş dosyaları çıkar bunları kapsar.

Aspose.PDF kullanarak bir PDF’ten gömülü dosyaları çıkarmak

Install-Package Aspose.PDF

Veya .NET CLI ile:

dotnet add package Aspose.PDF
  • Gömülü dosyalar içeren bir PDF. Örnek, PDFPortfolio.pdf adlı bir portföy kullanır.

Bir lisans olmadan, Aspose.PDF değerlendirme modunda çalışır. Değerlendirme kısıtlamaları olmadan test etmek için, bir ücretsiz geçici lisans isteyin.

Orijinal adıyla her gömülü dosyayı çıkar

Aşağıdaki yöntem PDF’yi açar, gömülü her dosyayı çözümlenmiş adıyla bir çıktı klasörüne kaydeder ve yazdığı her dosyanın yolunu yazdırır.

using System;
using System.IO;
using Aspose.Pdf;

public static class EmbeddedFileExtractor
{
    public static void ExtractEmbeddedFiles(string inputPdf, string outputDir)
    {
        Directory.CreateDirectory(outputDir);

using (var document = new Document(inputPdf))
        {
            foreach (FileSpecification fileSpec in document.EmbeddedFiles)
            {
                // Resolve the stored name, then keep only the file name part.
                string fileName = Path.GetFileName(fileSpec.GetFileName("attachment.bin"));
                string outputPath = Path.Combine(outputDir, fileName);

using (var output = new FileStream(outputPath, FileMode.Create))
                {
                    fileSpec.Contents.CopyTo(output);
                }

Console.WriteLine($"Saved: {outputPath}");
            }
        }
    }
}

PDF yolunu ve dosyaları istediğiniz klasörü belirterek çağırın:

EmbeddedFileExtractor.ExtractEmbeddedFiles("PDFPortfolio.pdf", "ExtractedFiles");

Her adımın ne yaptığı

Belgeyi açın. new Document(inputPdf) PDF’yi yükler. using bloğu, işlem tamamlandığında, bir istisna atılsa bile dosya tutamacını serbest bırakır.

Ekleri döngüyle işleyin. document.EmbeddedFiles her belge düzeyindeki gömülü dosya için bir FileSpecification döndürür.

Adı çözümleyin. fileSpec.GetFileName("attachment.bin") saklanan adı döndürür, PDF hiçbir şey sağlamazsa attachment.bin döner. Uygulamanız için mantıklı bir yedekleme seçin.

Klasör bölümlerini kaldırın. Depolanan bir ad, reports/2026/q3.xlsx gibi bir yol içerebilir veya ..\..\startup.bat gibi oluşturulmuş bir değer olabilir. Sonucu Path.GetFileName ile geçirerek q3.xlsx veya startup.bat haline getirirsiniz, böylece dosya outputDir dışına yazılamaz. Bugün işlediğiniz PDF’lere güvenseniz bile bu adımı sürdürün.

İçeriği yazın. fileSpec.Contents gömülü dosyanın verilerinin bir akışıdır. CopyTo bunu herhangi bir dönüşüm yapmadan yeni dosyaya yazar.

Beklenen sonuç

Çıktı klasörü, PDF’de depolandığı gibi adlandırılmış, belge düzeyindeki her ek için bir dosya içerir. Bir elektronik tablo ve bir Word belgesi içeren bir portföy için, konsol çıktısı aşağıdaki gibi görünür:

Saved: ExtractedFiles\budget-2026.xlsx
Saved: ExtractedFiles\service-agreement.docx

Dosya adları PDF’nize bağlıdır. Çıkarılan dosyalar gömülü olan aynı verileri içerir, bu nedenle her biri formatını işleyen uygulamada açılır.

Yinelenen ve güvensiz adları işleyin

Temel örnek, gerçek dünyadaki PDF’lerde karşılaşacağınız üç zayıf noktaya sahiptir:

  • İki ek aynı adı paylaşabilir ve FileMode.Create ilkini sessizce üzerine yazar. Bu aynı zamanda birkaç ekin adı olmadığında ve hepsi attachment.bin olarak geri döndüğünde de olur.
  • Bir işletim sisteminde geçerli olan bir ad, başka bir sistemde geçersiz karakterler içerebilir; örneğin Windows’ta :.
  • Bir yol ayırıcıyla biten saklanan bir ad, Path.GetFileName‘i boş bir dizeyle bırakır.

Bu yardımcı, üçünün de üstesinden gelir. Geçersiz karakterleri değiştirir, ad boş olduğunda geri dönüş yapar ve dosya zaten mevcut olduğunda bir sayaç ekler:

private static string GetSafeOutputPath(string outputDir, string resolvedName, string fallbackName)
{
    string fileName = Path.GetFileName(resolvedName);

foreach (char c in Path.GetInvalidFileNameChars())
    {
        fileName = fileName.Replace(c, '_');
    }

if (string.IsNullOrWhiteSpace(fileName))
    {
        fileName = fallbackName;
    }

string baseName = Path.GetFileNameWithoutExtension(fileName);
    string extension = Path.GetExtension(fileName);
    string outputPath = Path.Combine(outputDir, fileName);

int counter = 1;
    while (File.Exists(outputPath))
    {
        outputPath = Path.Combine(outputDir, $"{baseName} ({counter}){extension}");
        counter++;
    }

return outputPath;
}

Çıkarma döngüsünde, fileName ve outputPath oluşturulan iki satırı şunlarla değiştirin:

string outputPath = GetSafeOutputPath(outputDir, fileSpec.GetFileName("attachment.bin"), "attachment.bin");

Yardımcı, mevcut dosyaları kontrol ettiğinden, aynı klasöre iki kez çıkarım yapıldığında üzerine yazmak yerine numaralı kopyalar oluşturur. Her çalıştırmada yeni bir sonuç istiyorsanız, önce klasörü temizleyin.

Sayfalara eklenen dosyaları çıkar

Eğer EmbeddedFiles boşsa ancak bir PDF görüntüleyicide ataç simgesi görüyorsanız, dosya muhtemelen bir sayfadaki dosya ekleme açıklaması aracılığıyla eklenmiştir. Açıklama, File özelliğinde kendi FileSpecification nesnesini tutar, bu yüzden aynı ad çözümlemesi ve aynı yardımcı uygulanır. Bu yöntem her sayfayı kontrol eder ve ekli her dosyayı çıktı klasörüne kaydeder:

using Aspose.Pdf.Annotations;

public static void ExtractPageAttachments(string inputPdf, string outputDir)
{
    Directory.CreateDirectory(outputDir);

using (var document = new Document(inputPdf))
    {
        foreach (Page page in document.Pages)
        {
            foreach (Annotation annotation in page.Annotations)
            {
                if (annotation is FileAttachmentAnnotation attachment && attachment.File != null)
                {
                    string outputPath = GetSafeOutputPath(outputDir, attachment.File.GetFileName("attachment.bin"), "attachment.bin");

using (var output = new FileStream(outputPath, FileMode.Create))
                    {
                        attachment.File.Contents.CopyTo(output);
                    }

Console.WriteLine($"Saved: {outputPath}");
                }
            }
        }
    }
}

Bir PDF’deki tüm ekleri toplamak için, her iki yöntemi aynı çıkış klasörüyle çalıştırın. Eğer bir PDF aynı dosyaya iki yerden referans veriyorsa, GetSafeOutputPath ikinci kopyayı numaralı bir adla kaydeder ve ilkini üzerine yazmaz.

Sonraki adımlar

Ek dosyalarla daha ileri gitmek, ekleme, kaldırma veya çıkarma yapmadan listeleme gibi işlemler için, Aspose.PDF for .NET belgeleri adresine bakın. FileSpecification sınıf referansı gömülü her dosyadan okuyabileceğiniz diğer ad ve açıklama özelliklerini listeler. PDF beklenildiği gibi çıkarılamıyorsa, bir örnek gönderin Aspose.PDF destek forumu.

FAQs

  1. FileSpecification.GetFileName nasıl bir ad seçer? Gömülü dosyanın Unicode adı, normal dosya adı veya koleksiyon anahtarından, mevcut olanı kullanarak adı çözer. Hiçbiri mevcut değilse, sağladığınız yedek adı döndürür. Bu yöntem Aspose.PDF for .NET 26.9’da eklendi.

  2. Bu, portföy olmayan PDF’ler için çalışır mı? Evet, belge seviyesinde eklenmiş dosyalar için. Belirli bir sayfaya dosya ekleme açıklaması (genellikle bir ataç simgesi olarak gösterilir) aracılığıyla eklenen dosyalar açıklamanın içinde depolanır, bu yüzden bunları FileAttachmentAnnotation.File üzerinden okuyun, Sayfalara eklenmiş dosyaları çıkar bölümünde gösterildiği gibi.

  3. GetFileName sonucunu neden Path.GetFileName içinde sarmalısınız? PDF içinde depolanan ad, dosyayı oluşturan kişi tarafından ayarlanır ve klasör bölümleri içerebilir. Path.GetFileName yalnızca dosya adını tutar, bu yüzden her ek dosya çıkış klasörünüz içinde yazılır.

  4. İki ek aynı ada sahipse ne olur? FileMode.Create ile ikinci dosya birincisini üzerine yazar. Yolun zaten var olup olmadığını kontrol edin ve sayısal bir ek ekleyin, Yinelenen ve güvensiz adları ele al bölümünde gösterildiği gibi.

  5. Bir eki diske kaydetmeden işleyebilir miyim? Evet. Contents özelliği bir Stream olduğundan, onu bir MemoryStream‘e kopyalayabilir, yükleyebilir veya FileStream‘e yazmak yerine başka bir kütüphaneye geçirebilirsiniz.