Java での PDF のテーブルからデータの抽出
Contents
[
Hide
]
PDF からテーブルの抽出
TableAbsorber を使用して、各ページのテーブルを検出し、行、セル、テキストフラグメント、テキストセグメントを反復処理します。
- ソース PDF を Document インスタンスで開いてください。
- ドキュメントの Page オブジェクトを反復処理してください。テーブルはページ単位で検出されるためです。
- 各ページごとに TableAbsorber を作成し、
visit(page)を呼び出して検出されたテーブルリストを埋めてください。 - 検出された AbsorbedTable、AbsorbedRow、AbsorbedCell、TextFragment、および
TextSegmentオブジェクトを反復処理してください。 - フラグメントの内容から抽出した行テキストを構築し、テーブルデータを出力してください。
public static void extractTablesFromPdf(Path inputFile) {
try (Document document = new Document(inputFile.toString())) {
for (Page page : document.getPages()) {
TableAbsorber absorber = new TableAbsorber();
absorber.visit(page);
for (AbsorbedTable table : absorber.getTableList()) {
System.out.println("Table");
for (AbsorbedRow row : table.getRowList()) {
StringBuilder rowText = new StringBuilder();
for (AbsorbedCell cell : row.getCellList()) {
if (rowText.length() > 0) {
rowText.append("|");
}
StringBuilder cellText = new StringBuilder();
for (TextFragment fragment : cell.getTextFragments()) {
StringBuilder fragmentText = new StringBuilder();
for (TextSegment segment : fragment.getSegments()) {
fragmentText.append(segment.getText());
}
if (cellText.length() > 0) {
cellText.append("|");
}
cellText.append(fragmentText);
}
rowText.append(cellText);
}
System.out.println(rowText);
}
}
}
}
}
特定のマークされた領域からの表の抽出
この例では、四角形の注釈を見つけ、その矩形を検出された各表と比較し、マークされた領域内の表のみを出力します。
- ソース PDF を Document インスタンスで開いてください。
- ターゲットの Page を取得し、抽出領域を示す四角形の Annotation を見つけてください。
- TableAbsorber を作成し、そのページ上のテーブルを検出するために
visit(page)を呼び出してください。 - 検出された各 AbsorbedTable の Rectangle を、注釈の矩形境界と比較してください。
- 一致する AbsorbedRow および AbsorbedCell オブジェクトを反復処理し、行テキストを再構築してください。
- マークされた領域のテーブル データのみを印刷してください。
public static void extractTableFromSpecificArea(Path inputFile) {
try (Document document = new Document(inputFile.toString())) {
Page page = document.getPages().get_Item(1);
Annotation squareAnnotation = null;
for (Annotation annotation : page.getAnnotations()) {
if (annotation.getAnnotationType() == AnnotationType.Square) {
squareAnnotation = annotation;
break;
}
}
if (squareAnnotation == null) {
System.out.println("No square annotation found.");
return;
}
TableAbsorber absorber = new TableAbsorber();
absorber.visit(page);
for (AbsorbedTable table : absorber.getTableList()) {
Rectangle tableRect = table.getRectangle();
Rectangle annotationRect = squareAnnotation.getRect();
boolean isInRegion = annotationRect.getLLX() < tableRect.getLLX()
&& annotationRect.getLLY() < tableRect.getLLY()
&& annotationRect.getURX() > tableRect.getURX()
&& annotationRect.getURY() > tableRect.getURY();
if (isInRegion) {
for (AbsorbedRow row : table.getRowList()) {
StringBuilder rowText = new StringBuilder();
for (AbsorbedCell cell : row.getCellList()) {
if (rowText.length() > 0) {
rowText.append("|");
}
StringBuilder cellText = new StringBuilder();
for (TextFragment fragment : cell.getTextFragments()) {
StringBuilder fragmentText = new StringBuilder();
for (TextSegment segment : fragment.getSegments()) {
fragmentText.append(segment.getText());
}
if (cellText.length() > 0) {
cellText.append("|");
}
cellText.append(fragmentText);
}
rowText.append(cellText);
}
System.out.println(rowText);
}
}
}
}
}
テーブルを Excel にエクスポート
- ソース PDF を Document インスタンスで開いてください。
- エクスポート用に ExcelSaveOptions を作成してください。
- Excel の出力形式を
XLSXに設定してください。これにより、検出されたテーブルレイアウトが Excel ブックとして書き込まれます。 document.save(outputFile.toString(), excelSave)を呼び出して、ドキュメントを Excel 形式でエクスポートしてください。
public static void exportTablesToExcel(Path inputFile, Path outputFile) {
try (Document document = new Document(inputFile.toString())) {
ExcelSaveOptions excelSave = new ExcelSaveOptions();
excelSave.setFormat(ExcelSaveOptions.ExcelFormat.XLSX);
document.save(outputFile.toString(), excelSave);
}
}