PDFからテーブルを抽出する無料のJava PDFライブラリ
PDFファイルからプログラムでテーブルを抽出するオープンソースのJava APIです。抽出したテーブルを簡単にCSVに変換し、ロックされたPDFテーブルを構造化データ形式に変換できます。
Tabula-Javaとは何ですか?
PDF ファイルはビジネスの世界至る所にあります――レポート、請求書、研究論文、財務諸表などです。しかし、永続的な問題があります:これらの文書から表形式データを抽出することは極めて困難です。コピー&ペーストではデータが乱れがちで、手動での再入力は手間がかかりミスが起きやすいです。そこで登場するのが Tabula-Java です。Tabula-Java は、PDF 文書からプログラム的にテーブルを抽出する強力なオープンソースライブラリです。堅牢な PDF 処理基盤の上に構築されたこの Java ライブラリは、ロックされた PDF テーブルを実際に操作できる構造化データ形式に変換します。データパイプラインを構築する場合でも、レポート処理を自動化する場合でも、単に PDF テーブルに悩まされているだけの場合でも、Tabula-Java は洗練されたソリューションを提供します。
汎用的な PDF パーサーがすべてを非構造化テキストとして扱うのとは異なり、Tabula-Java はテーブル構造を理解します。行、列、セルを認識し、データポイント間の関係を保持します。この違いは重要です—「John 42 Engineer」のようなテキストの塊として取得するのと、適切にフィールドが分割された構造化レコードとして取得するのとの差です。このライブラリは純粋な Java 実装として動作し、エンタープライズアプリケーション、バックエンドサービス、手動介入なしで信頼性の高い自動 PDF テーブル抽出が必要なあらゆるシステムに最適です。人気の Tabula デスクトップアプリケーションのエンジンであり、ジャーナリスト、研究者、データアナリストが世界中で何年も実務で使用してきた実績があります。インテリジェントな検出アルゴリズム、柔軟な抽出モード、シンプルな API により、PDF に埋め込まれた表形式データを扱うすべての人にとって必須のツールです。
Tabula-Javaの開始方法
プロジェクトに Maven 依存関係を追加するには、以下のコマンドを使用してください。
OpenPDF Maven依存関係
<dependency>
<groupId>technology.tabula</groupId>
<artifactId>tabula</artifactId>
<version>1.0.5.</version>
</dependency>
GradleでTabula-Javaをインストールする
implementation 'technology.tabula:tabula:1.0.5' Java APIによる基本的なテーブル抽出
オープンソースの Tabula-Java ライブラリを使用する最も簡単な方法は、デフォルトの検出アルゴリズムを使って PDF 内のすべてのテーブルを自動的に検出させることです。これは、明確でスプレッドシートのようなテーブルがある PDF にうまく機能します。まず、PDF ドキュメントからすべてのテーブルを抽出するシンプルな例から始めましょう。この例は基本的なワークフローを示しています。Apache PDFBox(Tabula-Java の基盤となる PDF エンジン)を使用して PDF を読み込み、抽出アルゴリズムを作成し、ページを順に処理します。
Java API を介して PDF からテーブルを抽出する方法は?
import technology.tabula.*;
import technology.tabula.extractors.SpreadsheetExtractionAlgorithm;
import org.apache.pdfbox.pdmodel.PDDocument;
import java.io.File;
import java.io.IOException;
import java.util.List;
public class BasicExtraction {
public static void main(String[] args) throws IOException {
// Load the PDF document
File pdfFile = new File("data_report.pdf");
PDDocument document = PDDocument.load(pdfFile);
// Create an extraction algorithm
SpreadsheetExtractionAlgorithm extractor = new SpreadsheetExtractionAlgorithm();
// Create a page iterator
ObjectExtractor objectExtractor = new ObjectExtractor(document);
PageIterator pages = objectExtractor.extract();
// Process each page
while (pages.hasNext()) {
Page page = pages.next();
// Extract tables from the page
List<Table> tables = extractor.extract(page);
// Print each table
for (Table table : tables) {
System.out.println("Found table with " + table.getRowCount() + " rows");
// Iterate through rows
for (List row : table.getRows()) {
for (RectangularTextContainer cell : row) {
System.out.print(cell.getText() + "\t");
}
System.out.println();
}
}
}
document.close();
}
}
特定のページ領域からテーブルを抽出する
多くの場合、すべてを抽出したいわけではありません。ページ上の特定の位置にある特定のテーブルからデータが必要になることがあります。Tabula-Java は座標を使用して「選択領域」を定義することを可能にします。Rectangle クラスは、PDF の座標空間(72 ポイントが 1 インチに相当)を使用してページ上の特定の領域を定義します。getArea() メソッドは抽出前にページをその領域に切り取るため、特定の場所からデータが必要な場合に精度とパフォーマンスが向上します。以下は、この操作を実行する方法を示す非常に有用な例です。
Java API を使用して特定のページ領域からテーブルを抽出する方法は?
import technology.tabula.Rectangle;
public class RegionExtraction {
public static void extractRegion(String pdfPath) throws IOException {
File pdfFile = new File(pdfPath);
PDDocument document = PDDocument.load(pdfFile);
ObjectExtractor objectExtractor = new ObjectExtractor(document);
Page page = objectExtractor.extract(1);
// Define the region (x, y, width, height)
// Coordinates are in points (72 points = 1 inch)
Rectangle region = new Rectangle(50, 100, 500, 400);
Page subPage = page.getArea(region);
SpreadsheetExtractionAlgorithm extractor = new SpreadsheetExtractionAlgorithm();
List<Table> tables = extractor.extract(subPage);
// Process the extracted table
for (Table table ; tables) {
System.out.println("Extracted " + table.getRowCount() + " rows from region");
}
document.close();
}
}
Java APIを使用したテーブルのCSVへの変換
一般的なユースケースは、抽出したテーブルをスプレッドシートアプリケーションやデータベースで使用するために CSV 形式に直接エクスポートすることです。CSVWriter クラスは、特殊文字の適切なエスケープや複数行セルコンテンツの処理など、CSV フォーマットの複雑さをすべて処理します。これにより、CSV 入力を期待するデータ処理パイプラインに Tabula-Java を簡単に統合できます。以下は、Java アプリケーション内でテーブルを効率的に扱う方法を示す Java コード例です。
Java API を介して抽出したテーブルを CSV 形式にエクスポートする方法は?
import technology.tabula.writers.CSVWriter;
import java.io.FileWriter;
public class CSVExtraction {
public static void exportToCSV(String pdfPath, String csvPath) throws IOException {
File pdfFile = new File(pdfPath);
PDDocument document = PDDocument.load(pdfFile);
SpreadsheetExtractionAlgorithm extractor = new SpreadsheetExtractionAlgorithm();
ObjectExtractor objectExtractor = new ObjectExtractor(document);
Page page = objectExtractor.extract(1);
List<Table< tables = extractor.extract(page);
// Write to CSV file
if (!tables.isEmpty()) {
Table table = tables.get(0);
try (FileWriter writer = new FileWriter(csvPath)) {
CSVWriter csvWriter = new CSVWriter();
csvWriter.write(writer, table);
}
}
document.close();
}
}
Java APIによる複数ページの処理
実際の PDF の多くは、複数ページにまたがるテーブルを含んでいます。このライブラリは同時に複数ページを処理するサポートを組み込み、開発者がドキュメント内のすべてのページを反復してテーブルを抽出・報告できるようにします。ページ番号は 1 から始まり(0 ではなく)、人間が通常ページ番号を参照する方法と一致します。