0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

JavaでPDFの表データをテキスト、CSV、およびExcelファイルに抽出する方法

Posted at

PDFに埋め込まれた表データを正確に抽出し、テキスト、CSVファイル、またはExcelワークシートなど、より分析しやすく操作可能な形式にシームレスに変換することは、重要なドキュメント処理のスキルです。Javaを使用して、このプロセスを簡単に実現できます。本記事では、Javaを使ってPDF文書から表データを抽出し、テキストファイル、CSVファイル、Excelワークシートに書き込む方法をご紹介します。

この記事で使用する方法は、主に無料のFree Spire.PDF for Javaライブラリを必要とします。ダウンロードしてインポートするか、Mavenを介してインポートすることができます:

<dependency>
    <groupId>e-iceblue</groupId>
    <artifactId>spire.pdf.free</artifactId>
    <version>9.13.0</version>
</dependency>

PDFの表を抽出するには、ライブラリ内のPdfTableExtractorクラスを使用します。読み込んだPDFファイルに対してPdfTableExtractorオブジェクトを作成し、PdfTableExtractor.extractTable()メソッドを使用して、指定したページ内のすべての表を抽出します。最後にPdfTable.getText()メソッドで表のデータを取得できます。以下に一般的な操作手順を示します:

  • PdfDocumentオブジェクトを作成し、PdfDocument.loadFromFile()メソッドでPDF文書を読み込む。
  • 読み込んだPDF文書からPdfTableExtractorオブジェクトを作成する。
  • PdfTableExtractor.extractTable()メソッドを使用して、各ページの表を抽出する。
  • PdfTable.getText()メソッドでPDF表のセルデータを取得する。

この方法で表データを取得した後、それをテキストファイルに書き込んだり、CSVやExcelファイルとして保存したりすることが可能です。

JavaでPDFの表をテキストファイルに抽出

PdfTableExtractor.extractTable()メソッドで表を抽出し、PdfTable.getText()メソッドでセルデータを取得した後、文字列を構築してテキストファイルに書き込むことができます。以下に詳細な手順を示します:

  1. 必要なモジュールをインポートする。
  2. PdfDocumentオブジェクトを作成し、PdfDocument.loadFromFile()メソッドでPDF文書を読み込む。
  3. 読み込んだPDF文書からPdfTableExtractorオブジェクトを作成する。
  4. 各ページをループし、PdfTableExtractor.extractTable()メソッドで表を抽出する。
  5. 抽出した表ごとにStringBuilderオブジェクトを作成する。
  6. 表の行と列をループし、PdfTable.getText()メソッドでセルのデータを取得し、改行を削除する。セルデータをStringBuilderオブジェクトに追加する。
  7. StringBuilderオブジェクトをテキストファイルに書き込む。
  8. リソースを解放する。

コード例

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 extractPDFToText {
    public static void main(String[] args) throws IOException {
        // PdfDocumentオブジェクトを作成
        PdfDocument pdf = new PdfDocument();
        // PDFドキュメントをロード
        pdf.loadFromFile("Sample.pdf");

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

        // 各ページからテーブルを抽出
        for (int pageIndex = 0; pageIndex < pdf.getPages().getCount(); pageIndex++) {
            PdfTable[] tables = extractor.extractTable(pageIndex);
            // テーブルがnullでない場合に繰り返し処理
            if (tables != null) {
                for (int tableIndex = 0; tableIndex < tables.length; tableIndex++) {
                    PdfTable table = tables[tableIndex];
                    // StringBuilderオブジェクトを作成
                    StringBuilder tableText = new StringBuilder();
                    // 行と列を繰り返し処理
                    for (int rowIndex = 0; rowIndex < table.getRowCount(); rowIndex++) {
                        for (int colIndex = 0; colIndex < table.getColumnCount(); colIndex++) {
                            // セルのテキストを取得し、改行を削除
                            String cellText = table.getText(rowIndex, colIndex);
                            cellText = cellText.replaceAll("\\r|\\n", "");
                            if (colIndex < table.getColumnCount() - 1) {
                                tableText.append(cellText).append("\t");
                            } else {
                                tableText.append(cellText).append("\n");
                            }
                        }
                    }
                    System.out.println(tableText);
                    // テーブルをテキストファイルに書き込む
                    try (FileWriter writer = new FileWriter("output/Tables/Page" + (pageIndex+1) + "-Table" + (tableIndex+1) + ".txt")) {
                        writer.write(tableText.toString());
                    }
                }
            }
        }
    }
}

抽出結果
JavaでPDFの表をテキストファイルに抽出

JavaでPDFの表をCSVファイルに抽出

同様の手法で表データを抽出し、opencsvなどのモジュールを組み合わせて、抽出したデータをCSVファイルに書き込むことができます。また、以下のExcelファイルへの書き込み方法を使って、最終的にCSV形式で保存することも可能です。

opencsv:

<dependency>
  <groupId>com.opencsv</groupId>
  <artifactId>opencsv</artifactId>
  <version>5.9</version>
</dependency>

以下はopencsvを使用してPDF表データを抽出し、CSVファイルに書き込む手順です:

  1. 必要なモジュールをインポートする。
  2. PdfDocumentオブジェクトを作成し、PdfDocument.loadFromFile()メソッドでPDF文書を読み込む。
  3. 読み込んだPDF文書からPdfTableExtractorオブジェクトを作成する。
  4. 各ページをループし、PdfTableExtractor.extractTable()メソッドで表を抽出する。
  5. 抽出した表をループし、CSVファイル名を作成する。
  6. CSVWriterオブジェクトを作成し、表の行と列をループし、PdfTable.getText()メソッドでセルデータを取得し、改行を削除する。抽出した表データを文字列リストに構築し、CSVデータ行として書き込む。
  7. リソースを解放する。

コード例

import com.opencsv.CSVWriter;
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 extractPDFTableToCSV {
    public static void main(String[] args) throws IOException {
        // PdfDocumentオブジェクトを作成
        PdfDocument pdf = new PdfDocument();
        // PDFドキュメントをロード
        pdf.loadFromFile("Sample.pdf");

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

        // 各ページからテーブルを抽出
        for (int pageIndex = 0; pageIndex < pdf.getPages().getCount(); pageIndex++) {
            PdfTable[] tables = extractor.extractTable(pageIndex);
            // テーブルがnullでない場合に繰り返し処理
            if (tables != null) {
                for (int tableIndex = 0; tableIndex < tables.length; tableIndex++) {
                    PdfTable table = tables[tableIndex];
                    // CSVファイル名を作成
                    String csvFileName = "output/Tables/Page" + (pageIndex + 1) + "-Table" + (tableIndex + 1) + ".csv";
                    // CSVWriterオブジェクトを作成
                    try (CSVWriter writer = new CSVWriter(new FileWriter(csvFileName))) {
                        // 行と列を繰り返し処理
                        for (int rowIndex = 0; rowIndex < table.getRowCount(); rowIndex++) {
                            String[] row = new String[table.getColumnCount()];
                            for (int colIndex = 0; colIndex < table.getColumnCount(); colIndex++) {
                                // セルのテキストを取得し、改行を削除
                                String cellText = table.getText(rowIndex, colIndex).replaceAll("\\r?\\n", "");
                                row[colIndex] = cellText;
                            }
                            // CSVファイルに行を書き込む
                            writer.writeNext(row);
                        }
                    }
                }
            }
        }
        pdf.close();
    }
}

抽出結果
JavaでPDFの表をCSVファイルに抽出

JavaでPDFの表をExcelファイルに抽出

PDF表データをExcelシートに保存するには、Free Spire.XLS for Javaを使用します。PDF文書から抽出した表のセルデータをWorksheet.getRange().setText()メソッドでExcelワークシートの対応するセルに書き込み、保存することでPDF表データをExcelファイルに変換できます。また、保存時にフォーマットをCSVに設定することで、PDF表データをCSVファイルとして保存することもできます。

Free Spire.XLS for Java:

<dependency>
    <groupId>e-iceblue</groupId>
    <artifactId>spire.xls.free</artifactId>
    <version>5.3.0</version>
</dependency>

以下は詳細な手順です:

  1. 必要なモジュールをインポートする。
  2. PdfDocumentオブジェクトを作成し、PdfDocument.loadFromFile()メソッドでPDF文書を読み込む。
  3. Workbookオブジェクトを作成し、Workbook.getWorksheets().clear()メソッドでデフォルトのワークシートをクリアする。
  4. 読み込んだPDF文書からPdfTableExtractorオブジェクトを作成する。
  5. 各ページをループし、PdfTableExtractor.extractTable()メソッドで表を抽出する。
  6. 抽出した表ごとに、Workbook.getWorksheets().add()メソッドで指定した名前のワークシートを作成する。
  7. 表の行と列をループし、PdfTable.getText()メソッドでセルデータを取得し、改行を削除する。その後、Worksheet.getRange().setText()メソッドでセルデータを対応するセルに書き込む。
  8. ワークシートのセルの形式を設定する。
  9. Worksheet.autoFitRow()Worksheet.autoFitColumn()メソッドで行の高さと列の幅を自動調整する。
  10. Worksheet.saveToFile()メソッドを使ってCSVファイルとして保存できる。
  11. Workbook.saveToFile()メソッドを使ってExcelファイルとして保存する。
  12. リソースを解放する。

コード例

import com.spire.pdf.PdfDocument;
import com.spire.pdf.utilities.PdfTable;
import com.spire.pdf.utilities.PdfTableExtractor;
import com.spire.xls.*;

public class extractPDFTableToExcel {
    public static void main(String[] args) {
        // PdfDocumentオブジェクトを作成
        PdfDocument pdf = new PdfDocument();
        // PDFドキュメントをロード
        pdf.loadFromFile("Sample.pdf");

        // Workbookオブジェクトを作成
        Workbook workbook = new Workbook();
        workbook.getWorksheets().clear();

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

        // 各ページからテーブルを抽出
        for (int pageIndex = 0; pageIndex < pdf.getPages().getCount(); pageIndex++) {
            PdfTable[] tables = extractor.extractTable(pageIndex);
            // テーブルがnullでない場合に繰り返し処理
            if (tables != null) {
                for (int tableIndex = 0; tableIndex < tables.length; tableIndex++) {
                    // ワークブックにワークシートを追加
                    Worksheet sheet = workbook.getWorksheets().add("Page" + (pageIndex + 1) + "-Table" + (tableIndex + 1));
                    // テーブル内の行と列を繰り返し処理
                    for (int rowIndex = 0; rowIndex < tables[tableIndex].getRowCount(); rowIndex++) {
                        for (int colIndex = 0; colIndex < tables[tableIndex].getColumnCount(); colIndex++) {
                            // セルのテキストを取得し、改行を削除
                            String cellText = tables[tableIndex].getText(rowIndex, colIndex).replaceAll("\\r|\\n", "");
                            // ワークシートにセルのテキストを書き込む
                            sheet.getCellRange(rowIndex+1, colIndex+1).setText(cellText);
                        }
                    }
                    // セルのスタイルを設定
                    CellRange[] rows = sheet.getRows();
                    rows[0].getStyle().getFont().setFontName("HarmonyOS Sans SC");
                    rows[0].getStyle().getFont().setSize(12);
                    rows[0].getStyle().getFont().isBold(true);
                    rows[0].getStyle().setHorizontalAlignment(HorizontalAlignType.Center);
                    for (int i = 1; i < rows.length; i++) {
                        rows[i].getStyle().getFont().setFontName("HarmonyOS Sans SC");
                        rows[i].getStyle().getFont().setSize(12);
                        rows[i].getStyle().setHorizontalAlignment(HorizontalAlignType.Left);
                    }
                    // 行と列を自動調整
                    for (int i = 0; i < rows.length; i++) {
                        sheet.autoFitRow(i+1);
                    }
                    for (int i = 0; i < sheet.getColumns().length; i++) {
                        sheet.autoFitColumn(i+1);
                    }
                    sheet.saveToFile("output/Tables/PDFTableToCSV-Page" + (pageIndex + 1) + "-Table" + (tableIndex + 1) + ".csv", ",");
                }
            }
        }

        // ワークブックを保存
        workbook.saveToFile("output/PDFTableToExcel.xlsx");
        pdf.close();
        workbook.dispose();
    }
}

抽出結果
JavaでPDFの表をExcelファイルに抽出

この記事では、Javaを使用してPDF表データをテキスト、CSV、およびExcelファイルに書き込む方法を紹介しました。

さらに詳しいPDF文書操作のテクニックは、Spire.PDF for Javaのチュートリアルをご覧ください。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?