JavaでPDFの表からデータを抽出

PDF 表は、PDF ページの主な機能の 1 つで、分析、レポート、またはデータ入力など、さまざまな用途のデータを含んでいます。財務報告書を扱う場合、通常、PDFテーブルからデータを抽出する必要があります。無料のFree Spire.PDF for Javaは、PDFファイルから表データを抽出し、データをTXTやExcelなどの他のファイル形式に変換し、データを簡単に分析できるようにサポートします。この記事では、無料の[Free Spire.PDF for Java](https://jp.e-iceblue.com/introduce/free-spire-pdf-for-java.html)を使用して、**PDF表からデータを抽出する方法**について説明します。
- **[PDFの表からデータを抽出し、TXTファイルへ書き出す](#pdfの表からデータを抽出しtxtファイルへ書き出す)**
- **[PDFからExcelワークシートに表データを抽出](#pdfからexcelワークシートに表データを抽出)**
## 【依存関係の追加】
この方法は、無料のFree Spire.PDF for Javaが必要ですので、先にjarファイルをインポートしてください。
### 1. Maven
Maven を使用している場合、プロジェクトの pom.xml ファイルに以下のコードを追加することで、簡単にアプリケーションに JAR ファイルをインポートすることができます。
```XML
<repositories>
    <repository>
        <id>com.e-iceblue</id>
        <name>e-iceblue</name>
        <url>https://repo.e-iceblue.com/nexus/content/groups/public/</url>
    </repository>
</repositories>
<dependencies>
    <dependency>
        <groupId>e-iceblue</groupId>
        <artifactId>spire.pdf.free</artifactId>
        <version>5.1.0</version>
    </dependency>
</dependencies>
```
### 2. 公式サイトよりJarファイルをダウンロード
まず、[Free Spire.PDF for Javaの公式サイト](https://jp.e-iceblue.com/download/free-spire-pdf-for-java.html)よりzipファイルをダウンロードします。zipファイルを解凍し、libフォルダの下にあるSpire.Pdf.jarファイルを依存関係としてプロジェクトにインポートしてください。
## PDFの表からデータを抽出し、TXTファイルへ書き出す
Free Spire.PDF for javaは、PDFの表からすべてのテキストを取得する **PdfTable.GetText()** メソッドを提供しています。ここでは、PDFの表からデータを抽出する手順を説明します。
- **PdfDocument** のインスタンスを作成します。
- **PdfDocument.loadFromFile()** メソッドを使用してPDFファイルを読み込みます。
- **StringBuilder** と **PdfTableExtractor** オブジェクトを作成します。
- PDFファイル内のすべてのページをループして、そのページ上のすべてのテーブルを取得し、それらを **PdfTable[]** 配列に格納します。
- すべての表をループし、次に表のセルをループし、**PdfTable.GetText()** メソッドを使用してセル内のテキストデータを取得します。
- 抽出したデータを **Writer.write()** メソッドを使用してtxtファイルに書き出す。

**Java**
```Java
import com.spire.pdf.PdfDocument;
import com.spire.pdf.utilities.PdfTable;
import com.spire.pdf.utilities.PdfTableExtractor;

import java.io.FileWriter;
import java.io.IOException;

public class PDFTableToTXT {
    public static void main(String[] args) throws IOException {

        //PdfDocumentのオブジェクトを作成する
        PdfDocument pdf = new PdfDocument();

        //PDFファイルを読み込む
        pdf.loadFromFile("C:/貸借対照表.pdf");

        //StringBuilderのインスタンスを作成する
        StringBuilder builder = new StringBuilder();

        //PdfTableExtractorのオブジェクトを作成する
        PdfTableExtractor extractor = new PdfTableExtractor(pdf);

        //PDFの各ページをループする
        for (int page = 0; page < pdf.getPages().getCount(); page++)
        {
            //PDFページから表を抽出し、PdfTable[]配列に格納する
            PdfTable[] tableLists = extractor.extractTable(page);
            if (tableLists != null && tableLists.length > 0)
            {
                //すべての表をループする
                for (PdfTable table : tableLists)
                {
                    //表の行を取得する
                    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+" ");
                        }
                        builder.append("\r\n");
                    }
                }
            }
        }

        //txtファイルに書き込む
        FileWriter fileWriter = new FileWriter("抽出された表.txt");
        fileWriter.write(builder.toString());
        fileWriter.flush();
        fileWriter.close();
    }
}
```
![PDFの表からデータを抽出し、TXTファイルへ書き出す](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/d0472ef5-c866-eb83-08a0-631351472895.png)

## PDFからExcelワークシートに表データを抽出
あるページからすべての表を抽出し、それぞれを個別のワークシートとしてExcelファイルに保存するための主な手順は次のとおりです。
- **PdfDocument** のインスタンスを作成します。
- **PdfDocument.loadFromFile()** メソッドを使用して PDF ファイルを読み込みます。
- **PdfTableExtractor** のオブジェクトを作成し、**extactTable()** メソッドを呼び出して、最初のページのすべての表を抽出します。
- **Workbook** のインスタンスを作成します。
- **PdfTable[]** 配列の表をループし、インデックスで特定の表を取得します。
- **Workbook.getWorksheets.add()** メソッドを使用して、ワークシートをワークブックに追加します。
- PDF表のセルをループし、**PdfTable.getText()** メソッドを使用して特定のセルの値を取得します。次に、**Worksheet.get().setText()** メソッドを使用して、その値をワークシートに挿入します。
*Workbook.saveToFile()** メソッドを使用して、ワークブックを保存します。

**Java**
```Java
import com.spire.pdf.PdfDocument;
import com.spire.pdf.utilities.PdfTable;
import com.spire.pdf.utilities.PdfTableExtractor;
import com.spire.xls.ExcelVersion;
import com.spire.xls.Workbook;
import com.spire.xls.Worksheet;

public class PDFTableToExcel {
    public static void main(String[] args) {

        //PdfDocumentのインスタンスを作成する
        PdfDocument pdf = new PdfDocument();

        //PDFドキュメントを読み込む
        pdf.loadFromFile("C:/貸借対照表.pdf");

        //PdfTableExtractorのインスタンスを作成する
        PdfTableExtractor extractor = new PdfTableExtractor(pdf);

        //PDFの1ページ目から表を抽出する
        PdfTable[] pdfTables  = extractor.extractTable(0);

        //Workbookのオブジェクトを作成し、デフォルトのワークシートを削除する
        Workbook wb = new Workbook();
        wb.getWorksheets().clear();

        //表が見つかった場合
        if (pdfTables != null && pdfTables.length > 0) {

            //表をループする
            for (int tableNum = 0; tableNum < pdfTables.length; tableNum++) {
                //ワークブックにワークシートを追加する
                String sheetName = String.format("表 - %d", tableNum + 1);
                Worksheet sheet = wb.getWorksheets().add(sheetName);
                //現在の表の行をループする
                for (int rowNum = 0; rowNum < pdfTables[tableNum].getRowCount(); rowNum++) {
                    //現在の表の列をループする
                    for (int colNum = 0; colNum < pdfTables[tableNum].getColumnCount(); colNum++) {
                        //現在の表のセルからデータを抽出する
                        String text = pdfTables[tableNum].getText(rowNum, colNum);
                        //特定のセルにデータを挿入する
                        sheet.get(rowNum + 1, colNum + 1).setText(text);
                    }
                }
                //列の幅を自動調整する
                for (int sheetColNum = 0; sheetColNum < sheet.getColumns().length; sheetColNum++) {
                    sheet.autoFitColumn(sheetColNum + 1);
                }
            }
        }
        //ワークブックを保存する
        wb.saveToFile("PDFの表をExcelに書き出す.xlsx", ExcelVersion.Version2016);
    }
}
```
![PDFからExcelワークシートに表データを抽出](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/0789113b-e947-d415-e7a4-71448a9787ea.png)

> **無料のSpire.PDF for Javaは、PDFデータ処理に関する様々な機能をユーザーに提供します。PDFファイルの処理方法については、[Spire.PDF for Javaチュートリアル](https://jp.e-iceblue.com/tutorials/java/spire-pdf-java/pdf-java-program-guide-content.html)をご覧ください。**