テキストPDFを抽出

PDFファイル形式は、他のワードプロセッシングファイル形式と比較して、ファイルの内容を簡単に変更できないため、人気があります。ただし、Aspose.PDF for .NET APIを使用して、PDFドキュメントからテキストを抽出できます。この記事では、C#を使用してPDFファイルからテキストを検索および抽出するための多くの可能性のいくつかを探ります。以下は、このブログで説明する機能のリストです。

C#を使用してPDFドキュメント全体からテキストを抽出する

PDFドキュメントからテキストコンテンツを読み取ることは、頻繁に使用される機能です。以下の手順に従って、ドキュメントのすべてのページからすべてのテキストを抽出できます。

  1. PDFドキュメントをロード
  2. TextAbsorberオブジェクトを作成します
  3. すべてのページの吸収体を受け入れる
  4. 抽出したテキストをファイルに書き込んで保存します

以下のコードスニペットは、次の手順に従い、C#を使用してPDFドキュメント全体からテキストを抽出する方法を示しています。

// PDFドキュメントを開く
Document pdfDocument = new Document(dataDir + "ExtractTextAll.pdf");
// テキストを抽出するTextAbsorberオブジェクトを作成します
TextAbsorber textAbsorber = new TextAbsorber();
// すべてのページの吸収体を受け入れる
pdfDocument.Pages.Accept(textAbsorber);
// 抽出されたテキストを取得します
string extractedText = textAbsorber.Text;
// ライターを作成してファイルを開きます
TextWriter tw = new StreamWriter(dataDir + "extracted-text.txt");
// ファイルに1行のテキストを書き込みます
tw.WriteLine(extractedText);
// ストリームを閉じる
tw.Close();

C#でPDFの特定のページからテキストを検索して抽出する

ドキュメントレベルでのテキスト抽出について検討した後、PDFドキュメントの特定のページからテキストを抽出してみましょう。要件を達成するには、以下の手順に従ってください。

  1. PDFドキュメントをロード
  2. TextAbsorberオブジェクトを作成します
  3. 特定のページのアブソーバーを受け入れる
  4. 抽出したテキストをファイルに書き込んで保存します

次のコードスニペットは、C#を使用してPDFファイルの任意のページからテキストを読み取るための次の手順に従います。

// PDFドキュメントを開く
Document pdfDocument = new Document(dataDir + "ExtractTextAll.pdf");
// PDFドキュメントの必要なページにアクセスする
Page page = pdfDocument.Pages[1];
// テキストを抽出するTextAbsorberオブジェクトを作成します
TextAbsorber textAbsorber = new TextAbsorber();
// 指定されたページの吸収体を受け入れる
page.Accept(textAbsorber);
// 抽出されたテキストを取得します
string extractedText = textAbsorber.Text;
// ライターを作成してファイルを開きます
TextWriter tw = new StreamWriter(dataDir + "extracted-text.txt");
// ファイルに1行のテキストを書き込みます
tw.WriteLine(extractedText);
// ストリームを閉じる
tw.Close();

C#でPDFページの特定の領域からテキストを検索して抽出します

このテキスト抽出をさらに一歩進めましょう。ページの特定の領域からテキストを見つけることを検討してください。 Aspose.PDF for .NETの基本的な測定単位はポイントであり、72ポイントは1インチに等しいことをここで理解することが重要です。さらに、左下隅がページの原点(0,0)と見なされます。以下は、PDFドキュメントのページの特定の領域またはセクションからテキストを読み取る手順です。

  1. ソースPDFドキュメントをロード
  2. TextAbsorberオブジェクトを作成します
  3. TextSearchOptionsを設定し、長方形の座標を指定します
  4. 特定のページの吸収体を受け入れる
  5. 抽出したテキストをファイルに書き込む

以下のコードスニペットは、C#を使用して特定の領域からテキストを抽出するための次の手順を示しています。

// ドキュメントを開く
Document pdfDocument = new Document(dataDir + "ExtractTextAll.pdf");
// テキストを抽出するTextAbsorberオブジェクトを作成します
TextAbsorber absorber = new TextAbsorber();
absorber.TextSearchOptions.LimitToPageBounds = true;
absorber.TextSearchOptions.Rectangle = new Aspose.Pdf.Rectangle(100, 200, 250, 350);
// 最初のページの吸収体を受け入れる
pdfDocument.Pages[1].Accept(absorber);
// 抽出されたテキストを取得します
string extractedText = absorber.Text;
// ライターを作成してファイルを開きます
TextWriter tw = new StreamWriter(dataDir + "extracted-text.txt");
// ファイルに1行のテキストを書き込みます
tw.WriteLine(extractedText);
// ストリームを閉じる
tw.Close();

C#を使用して正規表現でPDFファイルから特定のテキストを検索または抽出します

あるパターンに一致する特定のテキストをPDFドキュメントから抽出できます。たとえば、特定の単語や数字を抽出したい場合があります。この目的のために、正規表現を設計する必要があります。 APIは、その正規表現を利用して、PDFドキュメント内の一致するテキストを検索します。以下の手順は、PDFファイルから特定のテキストを検索して抽出するためのガイドラインです。

  • 入力PDFドキュメントを読み込む
  • TextAbsorberオブジェクトを作成します
  • 一部のテキストに一致する正規表現を設計および設定します
  • 抽出された各テキストフラグメントをループします

次のC#コードスニペットは、ドキュメントのすべてのページで4桁のテキスト(1999、2000など)を含むテキストを検索する正規表現を使用します。

// ドキュメントを開く
Document pdfDocument = new Document(dataDir + @"Test.pdf");
// TextAbsorberオブジェクトを作成して、入力検索フレーズのすべてのインスタンスを検索します
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;
// すべてのページの吸収体を受け入れる
pdfDocument.Pages.Accept(textFragmentAbsorber);
// 抽出されたテキストフラグメントを取得します
TextFragmentCollection textFragmentCollection = textFragmentAbsorber.TextFragments;     
// フラグメントをループします
foreach (TextFragment textFragment in textFragmentCollection)
{
    Console.WriteLine(textFragment.Text);
}

C#を使用してPDFドキュメントのテーブルセルからテキストを抽出する

PDFページのテーブルからテキストを抽出することは少し異なります。前の例ではTextAbsorberクラスを使用してきましたが、テーブルからのテキストの抽出は少し異なります。したがって、Tableオブジェクトからテキストを抽出するには、以下の手順に従う必要があります。

  1. ソースPDFファイルをロード
  2. TableAbsorberクラスのオブジェクトを作成します
  3. AbsorbedTableを繰り返し処理します
  4. 表の各行の各セルをループします

以下のコードスニペットは、これらの手順に従い、C#を使用してPDFドキュメントのテーブルセルからテキストを効率的に抽出します。

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);
            }
        }
    }
}

C#を使用してPDFドキュメントからハイライトされたテキストを検索して抽出する

強調表示されたテキストは、PDFファイルに注釈として表示されます。それらには、ドキュメント内の従来のテキストとは異なるマーク付きテキストが含まれています。以下の手順では、C#を使用して強調表示されたテキストを読み取る方法について説明します。

  1. ソースドキュメントを読み込む
  2. すべての注釈をループします
  3. フィルタTextMarkupAnnotation
  4. ハイライトされたテキストフラグメントを取得する

以下は、上記の手順に基づくコードスニペットであり、PDFファイルからハイライトテキストを取得するために使用できます。

Document doc = new Document(dataDir + "ExtractHighlightedText.pdf");
// すべての注釈をループします
foreach (Annotation annotation in doc.Pages[1].Annotations)
{
    // TextMarkupAnnotationをフィルタリングする
    if (annotation is TextMarkupAnnotation)
    {
        TextMarkupAnnotation highlightedAnnotation = annotation as TextMarkupAnnotation;
        // ハイライトされたテキストフラグメントを取得する
        TextFragmentCollection collection = highlightedAnnotation.GetMarkedTextFragments();
        foreach (TextFragment tf in collection)
        {
            // ハイライトされたテキストを表示する
            Console.WriteLine(tf.Text);
        }
    }
}

C#を使用してメモリ消費量の少ないPDFテキストを抽出する

以下は、C#言語を使用してPDFドキュメントからテキストを抽出しながらメモリ消費を最適化するための2つの異なるアプローチです。

i)Reset()およびFreeMemory()メソッドの使用

テキスト抽出は、膨大なメモリとプロセッサを消費する場合があります。おそらく、入力ファイルが巨大で、多くのテキストが含まれている場合。 TextFragmentAbsorberオブジェクトは、見つかったすべてのテキストフラグメントをメモリに保存するためです。

したがって、ここで推奨する解決策は、各ページを処理した後にabsorber.Reset()メソッドを呼び出すことです。さらに、読み取り操作のみを実行している場合は、page.FreeMemory()メソッドを使用して、ページオブジェクトによって保持されているメモリを解放することもできます。したがって、最小限のリソースを利用するには、以下の手順に従う必要があります。

  1. ソースPDFドキュメントをロード
  2. TextEditOptionsを指定します
  3. TextFragmentを読む
  4. Reset()メソッドを呼び出す
  5. FreeMemory()メソッドを呼び出す

次のコードスニペットは、C#を使用したPDFドキュメントからのテキスト抽出を示しています。

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);
    //フラグメントから何かを読む
    count += absorber.TextFragments.Count;
    absorber.Reset();
    page.FreeMemory();
    //GC.Collect();        
}

このコードスニペットは、450ページ、24500のテキストフラグメント、および多数のラスター画像とベクター画像を含む巨大なサンプルファイルでテストされています。このプロセスは、わずか500MBのメモリを消費しました。ここでのもう1つのヒントは、.NETガベージコレクターを充電して、最大メモリ消費量を約250MBに減らし、処理時間10秒の追加コストをかけることができることです。

ii)MemorySaving列挙を使用する

Aspose.PDF for .NET APIは、PDFファイルからテキストを読み取る際のメモリ節約モードの構成をサポートしています。 TextExtractionOptions.TextFormattingMode列挙は、リソースの最適な消費を目的としています。次の手順は、このアプローチで従う必要のある手順をまとめたものです。

  1. ソースPDFファイルをロード
  2. TextDeviceオブジェクトを作成します
  3. TextExtractionOptionsを設定します
  4. テキストを抽出してファイルにテキストを書き込む

以下のコードスニペットは、C#を使用したメモリ節約アプローチを示しています。

// ドキュメントを開く
Document pdfDocument = new Document(dataDir + "Test.pdf");
System.Text.StringBuilder builder = new System.Text.StringBuilder();
// 抽出されたテキストを保持する文字列
string extractedText = "";
foreach (Page pdfPage in pdfDocument.Pages)
{
    using (MemoryStream textStream = new MemoryStream())
    {
        // テキストデバイスを作成する
        TextDevice textDevice = new TextDevice();

        // テキスト抽出オプションの設定-テキスト抽出モードの設定(RawまたはPure)
        TextExtractionOptions textExtOptions = new
        TextExtractionOptions(TextExtractionOptions.TextFormattingMode.MemorySaving);
        textDevice.ExtractionOptions = textExtOptions;
        // 特定のページを変換し、テキストをストリームに保存します
        textDevice.Process(pdfPage, textStream);
        // 特定のページを変換し、テキストをストリームに保存します
        textDevice.Process(pdfDocument.Pages[1], textStream);
        // メモリストリームを閉じる
        textStream.Close();
        // メモリストリームからテキストを取得する
        extractedText = Encoding.Unicode.GetString(textStream.ToArray());
    }
    builder.Append(extractedText);
}
dataDir = dataDir + "Memory_Text_Extracted.txt";
// 抽出したテキストをテキストファイルに保存します
File.WriteAllText(dataDir, builder.ToString());

結論

この記事では、多くの便利なユースケースのいくつかを検討しました。Aspose.PDFfor .NET APIでC#を使用してPDFドキュメントからテキストを抽出する可能性は無限にあります。詳細については、APIドキュメントをご覧ください。ご不明な点がございましたら、無料サポートフォーラムまでお問い合わせください。

関連項目