.NETでC#を使用してPDFテキストを簡単に抽出する方法

PDF形式は、その高いクロスプラットフォーム互換性とセキュリティの高さから広く利用されています。しかし、PDFドキュメントは編集が難しいため、内容を操作するためにテキストを抽出する必要がよくあります。**PDFからテキストを抽出する**ことで、PDFドキュメントの内容を再利用し、新しいPDFドキュメントを作成したり、他の形式のドキュメントに内容を挿入したりすることができます。.NETプラットフォームでは、シンプルなC#コードを使って**PDFテキストの抽出**を簡単に実現できます。

- **[C#でPDFテキストを抽出する操作手順](#cでpdfテキストを抽出する操作手順)**
- **[レイアウトを保持せずにPDFテキストを抽出](#レイアウトを保持せずにpdfテキストを抽出)**
- **[レイアウトを保持してPDFテキストを抽出](#レイアウトを保持してpdfテキストを抽出)**
- **[指定したPDFページ領域のテキストを抽出](#指定したpdfページ領域のテキストを抽出)**

この記事では、無料の[Free Spire.PDF for .NET](https://jp.e-iceblue.com/introduce/free-spire-pdf-for-net.html)を使用します。NuGetコマンド：  
`PM> Install-Package FreeSpire.PDF`

## C#でPDFテキストを抽出する操作手順
ライブラリには、PDFドキュメントのテキスト抽出を処理する`PdfTextExtractor`クラスが用意されています。ページから`PdfTextExtractor`オブジェクトを作成し、`PdfTextExtractor.ExtractText()`メソッドを使用してページのテキストを抽出できます。また、`PdfTextExtractOptions`クラスを使えば、レイアウト保持の設定やページ領域の指定など、抽出オプションを設定できます。以下は基本的な操作手順です。

1. `PdfDocument`オブジェクトを作成する。  
2. `PdfDocument.LoadFromFile()`メソッドを使用してPDFドキュメントを読み込む。  
3. `PdfDocument.Pages[]`プロパティを使用して特定のページを取得するか、すべてのページをループ処理する。 
4. ページから`PdfTextExtractor`オブジェクトを作成する。  
5. `PdfTextExtractOptions`オブジェクトを作成し、抽出オプションを設定する。  
6. `PdfTextExtractor.ExtractText(PdfTextExtractOptions)`メソッドでページのテキストを抽出する。  
7. 抽出したテキストをファイルに書き出す、または他の用途に利用する。  
8. リソースを解放する。

## レイアウトを保持せずにPDFテキストを抽出
レイアウトを保持せずにテキスト内容のみを抽出したい場合、`PdfTextExtractOptions.IsSimpleExtraction`プロパティを`true`に設定することで実現できます。以下はコード例です：
```csharp
using Spire.Pdf;
using Spire.Pdf.Texts;
using System.Text;

namespace ExtractPDFText
{
    class Program
    {
        static void Main(string[] args)
        {
            // PdfDocumentオブジェクトを作成
            PdfDocument pdf = new PdfDocument();

            // PDF文書を読み込む
            pdf.LoadFromFile("Sample.pdf");

            // PdfTextExtractOptionsオブジェクトを作成し、レイアウトを保持しないように設定
            PdfTextExtractOptions extractOptions = new PdfTextExtractOptions();
            extractOptions.IsSimpleExtraction = true;

            // StringBuilderオブジェクトを作成して抽出したテキストを保存
            StringBuilder extractedText = new StringBuilder();

            // ドキュメントのページを繰り返し処理
            foreach (PdfPageBase page in pdf.Pages)
            {
                // ページを使用してPdfTextExtractorオブジェクトを作成
                PdfTextExtractor extractor = new PdfTextExtractor(page);
                // 現在のページのテキストを抽出
                string text = extractor.ExtractText(extractOptions);
                // 抽出したテキストをStringBuilderオブジェクトに追加
                extractedText.Append(text);
            }

            // 抽出結果をテキストファイルに書き込み
            using (StreamWriter writer = new StreamWriter("output/ExtractedPDFText.txt", false, Encoding.UTF8))
            {
                writer.Write(extractedText.ToString());
            }

            // リソースを解放
            pdf.Close();
        }
    }
}
```

（結果）
![C#でPDFのテキストを抽出する方法](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/357fa39b-e100-11ff-3bda-9804e3f64543.png)

## レイアウトを保持してPDFテキストを抽出
PDFテキストの抽出時に、空白で埋めて元のレイアウトを保持する場合は、デフォルトの抽出オプションを使用します。以下はコード例です：
```csharp
using Spire.Pdf;
using Spire.Pdf.Texts;
using System.Text;

namespace ExtractPDFTextAndLayout
{
    class Program
    {
        static void Main(string[] args)
        {
            // PdfDocumentオブジェクトを作成
            PdfDocument pdf = new PdfDocument();

            // PDF文書を読み込む
            pdf.LoadFromFile("Sample.pdf");

            // テキスト抽出オプションを作成
            PdfTextExtractOptions extractOptions = new PdfTextExtractOptions();

            // StringBuilderオブジェクトを作成して抽出したテキストを保存
            StringBuilder extractedText = new StringBuilder();

            // ドキュメントのページを繰り返し処理
            foreach (PdfPageBase page in pdf.Pages)
            {
                // ページを使用してPdfTextExtractorオブジェクトを作成
                PdfTextExtractor extractor = new PdfTextExtractor(page);
                // 現在のページのテキストを抽出
                string text = extractor.ExtractText(extractOptions);
                // 抽出したテキストをStringBuilderオブジェクトに追加
                extractedText.Append(text);
            }

            // 抽出結果をテキストファイルに書き込み
            using (StreamWriter writer = new StreamWriter("output/ExtractedPDFText.txt", false, Encoding.UTF8))
            {
                writer.Write(extractedText.ToString());
            }

            // リソースを解放
            pdf.Close();
        }
    }
}
```

（結果）
![C#でPDFのテキストとレイアウトを抽出する方法](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/175a2532-ad78-1ab7-3a47-dc5b1bd4cea5.png)

## 指定したPDFページ領域のテキストを抽出
`PdfTextExtractOptions.ExtractArea`プロパティを使って抽出する領域を設定することで、特定のページ領域内のテキストを抽出することも可能です。以下はコード例です：
```csharp
using Spire.Pdf.Texts;
using Spire.Pdf;

using System.Drawing;
using System.Text;

namespace ExtractPDFTextArea
{
    class Program
    {
        static void Main(string[] args)
        {
            // PdfDocumentオブジェクトを作成
            PdfDocument pdf = new PdfDocument();

            // PDF文書を読み込む
            pdf.LoadFromFile("Sample.pdf");

            // 指定したページを取得
            PdfPageBase page = pdf.Pages[0];

            // PdfTextExtractorオブジェクトを作成
            PdfTextExtractor extractor = new PdfTextExtractor(page);

            // PdfTextExtractOptionsオブジェクトを作成
            PdfTextExtractOptions extractOptions = new PdfTextExtractOptions();
            // 抽出するテキストの矩形領域を設定
            extractOptions.ExtractArea = new RectangleF(80, 100, 250, 150);

            // ページ上の指定位置からテキストを抽出
            string extractedText = extractor.ExtractText(extractOptions);

            // 抽出したテキストをテキストファイルに書き込み
            File.WriteAllText("output/ExtractPDFPageAreaText.txt", extractedText, Encoding.UTF8);

            // リソースを解放
            pdf.Close();
        }
    }
}
```

（結果）
![C#でPDFページの指定領域のテキストを抽出する](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/b7db29dc-cbd6-725e-a368-9c9ce4cf80b2.png)

この記事では、.NETプログラム内でC#コードを使用してPDFドキュメントのテキストを抽出する方法を示しました。