C# .NETでPDFの表を抽出し、txt、csv、xlsxとして保存

PDFファイルの内容を処理するのは少々面倒な作業ですが、特に表形式で表示される様々なデータはさらに面倒です。これらの貴重なデータリソースを最大限に活用するために、プログラムを使用してPDFファイルから表を抽出し、より処理しやすく分析しやすい形式（txt、csv、xlsxなど）で保存することで、表データをより簡単に処理、分析、可視化することができ、作業効率を高めることができます。本記事では、.NETプラットフォームでC#コードを使用して、**無料のAPIを使用してPDFファイルから表データを抽出して保存する方法**について紹介します。

- **[PDFファイルから表を抽出し、TXTファイルとして保存する](#pdfファイルから表を抽出しtxtファイルとして保存する)**
- **[PDFファイルから表を抽出し、ExcelおよびCSV表として保存する](#pdfファイルから表を抽出しexcelおよびCSV表として保存する)**

本記事で使用する方法には、無料の[Free Spire.PDF for .NET](https://jp.e-iceblue.com/introduce/free-spire-pdf-for-net.html)が必要です。公式ウェブサイトからダウンロードしたり、NuGetを使用してインストールすることができます。
```powershell
PM> Install-Package FreeSpire.PDF
```

## PDFファイルから表を抽出し、TXTおよびCSVファイルとして保存する
PDFの表データを抽出するには、主に **PdfTableExtractor** クラスを使用します。このクラスの **ExtractTable(int pageIndex)** メソッドは、任意のページのすべての表データを抽出し、表のコレクションを返します。表データを抽出した後、データを少し処理してtxtファイルに書き込むことができます。以下に操作の例を示します：
1. PdfDocumentオブジェクトを作成し、PDFファイルをロードします。
```cs
PdfDocument doc = new PdfDocument();
doc.LoadFromFile("サンプル.pdf");
```

2. PdfTableExtractorオブジェクトを作成します。
```cs
PdfTableExtractor extractor = new PdfTableExtractor(doc);
```

3. PdfTable配列を宣言します。
4. 文書のページを反復処理し、ページから表を抽出します。
```cs
tableList = extractor.ExtractTable(pageIndex);
```

5. 表のリストが空でないかどうかを確認し、空でない場合は、**PdfTable.GetText(int rowIndex, int columnIndex)** メソッドを使用して各表からセルのデータを取得し、**StringBuilder** に追加します。
6. 処理されたデータをTXTファイルに保存し、PDFファイルを閉じます。

**完全なコード例：**
```c#
using System.Text;
using Spire.Pdf;
using Spire.Pdf.Utilities;

namespace ExtractPdfTable
{
    class Program
    {
        static void Main(string[] args)
        {
            // PdfDocumentオブジェクトを作成し、PDFファイルをロードする
            PdfDocument doc = new PdfDocument();
            doc.LoadFromFile("Sample.pdf");

            // StringBuilderオブジェクトを作成する
            StringBuilder builder = new StringBuilder();

            // PdfTableExtractorクラスのインスタンスを初期化する
            PdfTableExtractor extractor = new PdfTableExtractor(doc);

            // PdfTable配列を宣言する
            PdfTable[]? tableList = null;

            int tableCount = 1;

            // ページをループで処理する
            for (int pageIndex = 0; pageIndex < doc.Pages.Count; pageIndex++)
            {
                // 特定のページからテーブルを抽出する
                tableList = extractor.ExtractTable(pageIndex);

                // テーブルリストが空でないか確認する
                if (tableList != null && tableList.Length > 0)
                {
                    // リスト内のテーブルをループで処理する
                    foreach (PdfTable table in tableList)
                    {
                        // 特定のテーブルの行数と列数を取得する
                        int row = table.GetRowCount();
                        int column = table.GetColumnCount();

                        // 行と列をループで処理する
                        for (int i = 0; i < row; i++)
                        {
                            for (int j = 0; j < column; j++)
                            {
                                // 特定のセルのテキストを取得する
                                string text = table.GetText(i, j);

                                // テキストをStringBuilderに追加し、タブを追加する
                                builder.Append(text + "\t");
                            }
                            builder.Append("\r\n");
                        }

                        // .txtファイルに書き込む
                        File.WriteAllText($"output/TXTテーブル/TXTテーブル_{tableCount}.txt", builder.ToString());
                        tableCount += 1;
                    }
                }
            }
            doc.Close();
        }
    }
}
```

**PDFドキュメント**
![PDF表をTXTテキストファイルに抽出する](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/9b5699fb-b1ca-6cc7-532d-636bebfbd250.png)

**抽出した表**
![PDF表をTXTテキストファイルに抽出する](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/eec01a4c-18bb-032f-0f00-f113b3b74c29.png)

## PDFファイルから表を抽出し、ExcelおよびCSV表に変換する
PDFファイルから表を抽出した後、Free Spire.XLS for .NETを使用して抽出した表をExcelおよびCSV表として保存することもできます。Free Spire.XLS for .NETは、公式ウェブサイトからダウンロードしたり、NuGetを使用してインストールすることができます。
```powershell
PM> Install-Package FreeSpire.XLS
```

以下に操作の例を示します：
1. PdfDocumentオブジェクトを作成し、サンプルのPDFファイルをロードします。
```cs
PdfDocument doc = new PdfDocument();
doc.LoadFromFile("サンプル.pdf");
```

2. Workbookオブジェクトを作成し、デフォルトのワークシートをクリアします。
```cs
Workbook workbook = new Workbook();
workbook.Worksheets.Clear();
```

3. PdfTableExtractorクラスのインスタンスを初期化します。
```cs
PdfTableExtractor extractor = new PdfTableExtractor(doc);
```

4. PdfTable配列を宣言します。
5. PDFページをループして各ページの表を抽出します。
```cs
tableList = extractor.ExtractTable(pageIndex);
```

6. 表のリストが空でないかどうかを確認し、空でない場合は、Excelワークシートを作成し、PdfTable.GetText(int rowIndex, int columnIndex)メソッドを使用して各セルからデータを抽出し、sheet.Range[int rowIndex + 1, int columnIndex + 1].Valueプロパティを使用してデータを作成したExcelワークシートに書き込みます。
7. ワークシートをcsvファイルとして保存します。
```cs
sheet.SaveToFile("output/テーブル/CSVテーブル.csv", ",", Encoding.UTF8);
```

9. PDFファイルとワークブックファイルを閉じます。

**完全なコード例：**
```c#
using System.Text;
using Spire.Pdf;
using Spire.Pdf.Utilities;
using Spire.Xls;

namespace ExtractTablesToExcel
{
    class Program
    {
        static void Main(string[] args)
        {
            // PdfDocumentオブジェクトを作成し、サンプルPDFファイルをロードします
            PdfDocument doc = new PdfDocument();
            doc.LoadFromFile("サンプル.pdf");

            // Workbookオブジェクトを作成し、デフォルトのワークシートをクリアします
            Workbook workbook = new Workbook();
            workbook.Worksheets.Clear();

            // PdfTableExtractorクラスのインスタンスを初期化します
            PdfTableExtractor extractor = new PdfTableExtractor(doc);

            // PdfTableの配列を宣言します
            PdfTable[]? tableList = null;

            int sheetNumber = 1;

            // ページをループ処理します
            for (int pageIndex = 0; pageIndex < doc.Pages.Count; pageIndex++)
            {
                // 特定のページからテーブルを抽出します
                tableList = extractor.ExtractTable(pageIndex);

                // テーブルリストが空でないかを確認します
                if (tableList != null && tableList.Length > 0)
                {
                    // リスト内のテーブルをループ処理します
                    foreach (PdfTable table in tableList)
                    {
                        // ワークシートを追加します
                        Worksheet sheet = workbook.Worksheets.Add(string.Format("Table_{0}", sheetNumber));

                        // 特定のテーブルの行数と列数を取得します
                        int row = table.GetRowCount();
                        int column = table.GetColumnCount();

                        // 行と列をループ処理します
                        for (int i = 0; i < row; i++)
                        {
                            for (int j = 0; j < column; j++)
                            {
                                // 特定のセルからテキストを取得します
                                string text = table.GetText(i, j);

                                // テキストを指定されたセルに書き込みます
                                sheet.Range[i + 1, j + 1].Value = text;
                            }
                        }
                        sheetNumber++;
                    }
                }
            }

            // Excelブックとして保存します
            workbook.SaveToFile("output/テーブル/Excelテーブル.xlsx", ExcelVersion.Version2013);
            doc.Close();
            workbook.Dispose();
        }
    }
}
```

**出力ファイル：**
![PDF表をExcelまたはCSV表に抽出する](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/74d12637-7726-c834-825c-cf26875d9f34.png)

> **本記事では、無料のFree Spire.PDF for .NETとFree Spire.XLS for .NETを使用して、PDFファイルから表データを抽出し、TXTファイル、CSVファイル、Excelファイルに保存する方法について説明しました。その他の機能については、[Spire.PDF for .NETのチュートリアル]()をご覧ください。**