Metin Ayıkla PDF csharp

PDF dosya formatı popülerdir çünkü diğer kelime işlemci dosya formatlarına kıyasla dosya içerikleri kolayca değiştirilemez. Ancak C#’ta Aspose.PDF for .NET API ile PDF belgelerinden metin çıkarabilirsiniz. Bu makalede, C# kullanarak PDF dosyalarından metin aramak ve ayıklamak için birçok olasılıktan birkaçını keşfedelim. Aşağıda, bu blogda tartışacağımız özelliklerin bir listesi bulunmaktadır:

C# kullanarak Bütün Bir PDF Belgesinden Metin Çıkarma

Metin içeriklerini bir PDF belgesinden okumak, sık kullanılan bir özelliktir. C# kullanarak, aşağıdaki adımları izleyerek belgenin tüm sayfalarından tüm metni çıkarabilirsiniz:

  1. PDF belgesini yükle
  2. TextAbsorber nesnesi oluşturun
  3. Tüm sayfalar için emiciyi kabul edin
  4. Ayıklanan metni bir dosyaya yazın ve kaydedin

Aşağıdaki kod parçacığı şu adımları izler ve C# kullanarak tüm bir PDF belgesinden nasıl metin çıkarılacağını gösterir:

// PDF belgesini aç
Document pdfDocument = new Document(dataDir + "ExtractTextAll.pdf");
// Metni çıkarmak için TextAbsorber nesnesi oluşturun
TextAbsorber textAbsorber = new TextAbsorber();
// Tüm sayfalar için emiciyi kabul edin
pdfDocument.Pages.Accept(textAbsorber);
// Ayıklanan metni al
string extractedText = textAbsorber.Text;
// Bir yazar oluşturun ve dosyayı açın
TextWriter tw = new StreamWriter(dataDir + "extracted-text.txt");
// Dosyaya bir metin satırı yazın
tw.WriteLine(extractedText);
// akışı kapat
tw.Close();

C# ile PDF’de Belirli Bir Sayfadan Metin Arayın ve Çıkarın

Belge düzeyinde metin ayıklamayı keşfettikten sonra, bir PDF belgesinin belirli bir sayfasından metin çıkaralım. Gereksinimlerinize ulaşmak için aşağıdaki adımları uygulamanız yeterlidir:

  1. PDF belgesini yükle
  2. TextAbsorber nesnesi oluşturun
  3. Emiciyi belirli bir sayfa için kabul edin
  4. Ayıklanan metni bir dosyaya yazın ve kaydedin

Aşağıdaki kod parçacığı, C# kullanarak bir PDF dosyasının herhangi bir sayfasından metin okumak için şu adımları izler:

// PDF belgesini aç
Document pdfDocument = new Document(dataDir + "ExtractTextAll.pdf");
// PDF belgesindeki gerekli sayfaya erişin
Page page = pdfDocument.Pages[1];
// Metni çıkarmak için TextAbsorber nesnesi oluşturun
TextAbsorber textAbsorber = new TextAbsorber();
// Belirtilen sayfa için yutucuyu kabul edin
page.Accept(textAbsorber);
// Ayıklanan metni al
string extractedText = textAbsorber.Text;
// Bir yazar oluşturun ve dosyayı açın
TextWriter tw = new StreamWriter(dataDir + "extracted-text.txt");
// Dosyaya bir metin satırı yazın
tw.WriteLine(extractedText);
// akışı kapat
tw.Close();

C#’ta PDF Sayfasının Belirli Bölgesinden Metin Arayın ve Çıkarın

Bu metin çıkarımını bir adım daha ileri götürelim. Sayfanın belirli bir alanından metin bulmayı düşünün. Burada, Aspose.PDF for .NET’teki temel ölçüm biriminin nokta olduğunu anlamak önemlidir, burada 72 nokta 1 inç’e eşittir. Ayrıca sol alt köşe sayfanın başlangıç noktası (0,0) olarak kabul edilir. Sayfanın belirli bir alanından veya bölümünden metni PDF belgesinde okumak için izlenecek adımlar şunlardır:

  1. Kaynak PDF belgesini yükle
  2. TextAbsorber nesnesi oluşturun
  3. TextSearchOptions‘ü ayarlayın ve dikdörtgen koordinatları belirtin
  4. Belirli bir sayfa için emiciyi kabul edin
  5. Ayıklanan metni bir dosyaya yaz

Aşağıdaki kod parçacığı, C# kullanarak belirli bir bölgeden metin ayıklamak için şu adımları gösterir:

// Belgeyi aç
Document pdfDocument = new Document(dataDir + "ExtractTextAll.pdf");
// Metni çıkarmak için TextAbsorber nesnesi oluşturun
TextAbsorber absorber = new TextAbsorber();
absorber.TextSearchOptions.LimitToPageBounds = true;
absorber.TextSearchOptions.Rectangle = new Aspose.Pdf.Rectangle(100, 200, 250, 350);
// İlk sayfa için emiciyi kabul edin
pdfDocument.Pages[1].Accept(absorber);
// Ayıklanan metni al
string extractedText = absorber.Text;
// Bir yazar oluşturun ve dosyayı açın
TextWriter tw = new StreamWriter(dataDir + "extracted-text.txt");
// Dosyaya bir metin satırı yazın
tw.WriteLine(extractedText);
// akışı kapat
tw.Close();

C# kullanarak Normal İfadelerle PDF dosyasından Belirli Metni Arayın veya Çıkarın

Bir kalıpla eşleşen bir PDF belgesinden belirli bir metni çıkarabilirsiniz. Örneğin, bazı belirli kelimeleri veya sayıları çıkarmak isteyebilirsiniz. Bu amaçla, düzenli bir ifade tasarlamanız gerekir. API, PDF belgesinde eşleşen metni bulmak için bu normal ifadeyi kullanır. Aşağıdaki adımlar, PDF dosyalarından belirli metinleri aramak ve ayıklamak için yönergelerdir:

  • Giriş PDF belgesini yükle
  • TextAbsorber nesnesi oluşturun
  • Bazı metinlerle eşleşecek bir normal ifade tasarlayın ve ayarlayın
  • Ayıklanan her metin parçasında döngü

Aşağıdaki C# kod parçacığı, belgenin tüm sayfalarında örneğin 1999,2000 vb. gibi 4 basamak içeren metni arayan bir normal ifade kullanır.

// belgeyi aç
Document pdfDocument = new Document(dataDir + @"Test.pdf");
// giriş arama ifadesinin tüm örneklerini bulmak için TextAbsorber nesnesi oluşturun
TextFragmentAbsorber textFragmentAbsorber = new TextFragmentAbsorber(@"\d{4}"); //like 1999-2020                                                                                                                // set text search option to specify regular expression usage
TextSearchOptions textSearchOptions = new TextSearchOptions(true);
textFragmentAbsorber.TextSearchOptions = textSearchOptions;
// emiciyi tüm sayfalar için kabul et
pdfDocument.Pages.Accept(textFragmentAbsorber);
// çıkarılan metin parçalarını al
TextFragmentCollection textFragmentCollection = textFragmentAbsorber.TextFragments;     
// parçalar arasında döngü
foreach (TextFragment textFragment in textFragmentCollection)
{
    Console.WriteLine(textFragment.Text);
}

C# kullanarak PDF Belgesindeki Tablo Hücrelerinden Metin Çıkarma

Bir PDF sayfasındaki Tablolardan metin çıkarmak biraz farklıdır. Önceki örneklerde TextAbsorber sınıfıyla çalışıyorduk, ancak bir Tablodan metin çıkarmak biraz farklı. Bu nedenle, Tablo nesnelerinden metin çıkarmak için aşağıdaki adımları izlemeniz gerekir:

  1. Kaynak PDF dosyasını yükle
  2. TableAbsorber sınıfından bir nesne oluşturun
  3. AbsorbedTable aracılığıyla yineleyin
  4. Tablonun her satırındaki her hücrede döngü yapın

Aşağıdaki kod parçacığı şu adımları izler ve metni C# kullanarak PDF belgesindeki Tablo hücrelerinden verimli bir şekilde çıkarır:

Document pdfDocument = new Document(dataDir + "Test.pdf");
TableAbsorber absorber = new TableAbsorber();
absorber.Visit(pdfDocument.Pages[1]);
foreach (AbsorbedTable table in absorber.TableList)
{
    foreach (AbsorbedRow row in table.RowList)
    {
        foreach (AbsorbedCell cell in row.CellList)
        {
            TextFragment textfragment = new TextFragment();
            TextFragmentCollection textFragmentCollection = cell.TextFragments;
            foreach (TextFragment fragment in textFragmentCollection)
            {
                Console.WriteLine(fragment.Text);
            }
        }
    }
}

Vurgulanan Metni C# kullanarak PDF Belgesinden Arayın ve Çıkarın

Vurgulanan metin, PDF dosyalarında Ek Açıklama olarak bulunur. Bir belgedeki geleneksel metinden farklı kılan İşaretli Metin içerirler. Aşağıdaki adımlarda vurgulanan metnin C# kullanılarak nasıl okunacağı açıklanmaktadır:

  1. Kaynak belgeyi yükle
  2. Tüm ek açıklamalar arasında dolaşın
  3. Filtrele TextMarkupAnnotation
  4. Vurgulanan metin parçalarını al

Aşağıda, yukarıdaki adımlara dayanan bir kod parçacığı bulunmaktadır ve PDF dosyalarından vurgulanan metni almak için kullanılabilir:

Document doc = new Document(dataDir + "ExtractHighlightedText.pdf");
// Tüm ek açıklamalar arasında dolaşın
foreach (Annotation annotation in doc.Pages[1].Annotations)
{
    // TextMarkupAnnotation'ı Filtrele
    if (annotation is TextMarkupAnnotation)
    {
        TextMarkupAnnotation highlightedAnnotation = annotation as TextMarkupAnnotation;
        // Vurgulanan metin parçalarını al
        TextFragmentCollection collection = highlightedAnnotation.GetMarkedTextFragments();
        foreach (TextFragment tf in collection)
        {
            // Vurgulanan metni göster
            Console.WriteLine(tf.Text);
        }
    }
}

C# kullanarak Düşük Bellek Tüketimi ile PDF Metnini Çıkarın

Aşağıda, C# dilini kullanarak PDF belgelerinden metin ayıklarken bellek tüketimini optimize etmek için iki farklı yaklaşım bulunmaktadır.

i) Reset() ve FreeMemory() Yöntemini Kullanma

Bazen metin çıkarma işlemi çok büyük bellek ve işlemci tüketebilir. Muhtemelen giriş dosyası çok büyük olduğunda ve çok fazla metin içerdiğinde. Çünkü TextFragmentAbsorber nesnesi, bulunan tüm metin parçalarını bellekte saklar.

Bu nedenle burada önerdiğimiz çözüm her sayfayı işledikten sonra absorber.Reset() metodunu çağırmaktır. Ayrıca sadece okuma işlemi yapıyorsanız page.FreeMemory() metodu ile sayfa nesnelerinin tuttuğu hafızayı da boşaltabilirsiniz. Bu nedenle, minimum kaynakları kullanmak için aşağıdaki adımları izlemeniz gerekir:

  1. Kaynak PDF belgesini yükle
  2. TextEditOptions belirtin
  3. TextFragment‘i okuyun
  4. Reset() yöntemini çağırın
  5. FreeMemory() yöntemini çağırın

Aşağıdaki kod parçacığı, C# kullanarak PDF belgelerinden metin çıkarmayı gösterir:

Document pdfDocument = new Document(dataDir + @"ITF-TTF Manual.pdf");
TextFragmentAbsorber absorber = new TextFragmentAbsorber(new TextEditOptions(TextEditOptions.FontReplace.RemoveUnusedFonts));
foreach (Page page in pdfDocument.Pages)
{
    page.Accept(absorber);
    //Parçalardan bir şeyler oku
    count += absorber.TextFragments.Count;
    absorber.Reset();
    page.FreeMemory();
    //GC.Collect();        
}

Bu kod parçacığını 450 sayfa, 24500 metin parçası ve çok sayıda raster ve vektör görüntü içeren devasa bir örnek dosyayla test ettik. İşlem yalnızca 500 MB bellek tüketti. Buradaki başka bir ipucu da, maksimum bellek tüketimini yaklaşık 250 MB’a düşürmek için .NET çöp toplayıcısını 10 saniyelik ek bir işlem süresi maliyetiyle ücretlendirebileceğinizdir.

ii) MemorySaving listesini kullanma

Aspose.PDF for .NET API, bir PDF dosyasından metin okurken bellek tasarrufu modunun yapılandırılmasını destekler. TextExtractionOptions.TextFormattingMode numaralandırması, kaynakların optimal tüketimi amacına hizmet eder. Aşağıdaki adımlar, bu yaklaşım için izlemeniz gereken adımları özetlemektedir:

  1. Kaynak PDF dosyasını yükle
  2. TextDevice nesnesi oluştur
  3. TextExtractionOptions Ayarlayın
  4. Metni ayıklayın ve bir dosyaya metin yazın

Aşağıdaki kod parçacığı, C# kullanarak bellek tasarrufu yaklaşımını gösterir:

// Belgeyi aç
Document pdfDocument = new Document(dataDir + "Test.pdf");
System.Text.StringBuilder builder = new System.Text.StringBuilder();
// Ayıklanan metni tutmak için dize
string extractedText = "";
foreach (Page pdfPage in pdfDocument.Pages)
{
    using (MemoryStream textStream = new MemoryStream())
    {
        // Metin cihazı oluştur
        TextDevice textDevice = new TextDevice();

        // Metin çıkarma seçeneklerini ayarlayın - metin çıkarma modunu ayarlayın (Ham veya Saf)
        TextExtractionOptions textExtOptions = new
        TextExtractionOptions(TextExtractionOptions.TextFormattingMode.MemorySaving);
        textDevice.ExtractionOptions = textExtOptions;
        // Belirli bir sayfayı dönüştürün ve metni akışa kaydedin
        textDevice.Process(pdfPage, textStream);
        // Belirli bir sayfayı dönüştürün ve metni akışa kaydedin
        textDevice.Process(pdfDocument.Pages[1], textStream);
        // Bellek akışını kapat
        textStream.Close();
        // Bellek akışından metin al
        extractedText = Encoding.Unicode.GetString(textStream.ToArray());
    }
    builder.Append(extractedText);
}
dataDir = dataDir + "Memory_Text_Extracted.txt";
// Ayıklanan metni metin dosyasına kaydedin
File.WriteAllText(dataDir, builder.ToString());

Çözüm

Bu makaledeki pek çok faydalı kullanım durumundan birkaçını inceledik. Aspose.PDF for .NET API ile C# kullanarak PDF belgelerinden metin ayıklamak için sonsuz olasılık var. API belgeleri aracılığıyla daha fazla bilgi edinebilirsiniz. Herhangi bir sorunuz olması durumunda lütfen Ücretsiz Destek Forumları adresinden bize ulaşın.

Ayrıca bakınız