PDFから表データを抽出する
プログラムでPDFから表を抽出する
PDFから表を抽出することは簡単な作業ではありません。なぜなら、表はさまざまな方法で作成される可能性があるからです。
Aspose.PDF for Android via Javaには、表を簡単に取得するためのツールがあります。表データを抽出するには、次の手順を実行する必要があります:
-
ドキュメントを開く - Document オブジェクトをインスタンス化します;
-
TableAbsorber オブジェクトを作成します。
-
分析するページを決定し、visitを希望するページに適用します。表形式のデータがスキャンされ、結果はAbsorbedTableのリストに保存されます。このリストはgetTableListメソッドを通じて取得できます。
-
データを取得するには、
TableList
を反復処理し、吸収された行のリストと吸収されたセルのリストを処理します。最初のリストにはgetTableListメソッドを呼び出すことでアクセスでき、2番目のリストにはgetCellListメソッドを呼び出すことでアクセスできます。 -
各AbsorbedCellにはTextFragmentCollectionsが含まれています。これを自分の目的に合わせて処理することができます。
次の例は、すべてのページからテーブルを抽出する方法を示しています:
public void extractTable () {
// ドキュメントを開く
try {
document=new Document(inputStream);
} catch (Exception e) {
resultMessage.setText(e.getMessage());
return;
}
com.aspose.pdf.TableAbsorber absorber=new com.aspose.pdf.TableAbsorber();
File file=new File(fileStorage, "extracted-text.txt");
FileOutputStream fileOutputStream;
try {
fileOutputStream=new FileOutputStream(file);
} catch (FileNotFoundException e) {
resultMessage.setText(e.getMessage());
return;
}
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(fileOutputStream));
// ページをスキャン
for (Page page : (Iterable<? extends Page>) document.getPages()) {
absorber.visit(page);
for (com.aspose.pdf.AbsorbedTable table : absorber.getTableList()) {
try {
bw.write("Table");
bw.newLine();
// 行のリストを反復処理
for (com.aspose.pdf.AbsorbedRow row : table.getRowList()) {
// セルのリストを反復処理
for (com.aspose.pdf.AbsorbedCell cell : row.getCellList()) {
for (com.aspose.pdf.TextFragment fragment : cell.getTextFragments()) {
StringBuilder sb=new StringBuilder();
for (TextSegment seg :
(Iterable<? extends TextSegment>) fragment.getSegments())
sb.append(seg.getText());
bw.write(sb.toString() + "|");
}
}
bw.newLine();
}
} catch (IOException e) {
resultMessage.setText(e.getMessage());
return;
}
}
}
try {
bw.close();
} catch (IOException e) {
resultMessage.setText(e.getMessage());
return;
}
resultMessage.setText(R.string.success_message);
}
PDFページの特定エリアからテーブルを抽出する
各吸収されたテーブルには、ページ上のテーブルの位置を説明するRectangleプロパティがあります。
したがって、特定の領域にあるテーブルを抽出する必要がある場合は、特定の座標で作業する必要があります。
次の例は、四角形注釈でマークされたテーブルを抽出する方法を示しています:
public void extractMarkedTable () {
// ドキュメントを開く
try {
document=new Document(inputStream);
} catch (Exception e) {
resultMessage.setText(e.getMessage());
return;
}
com.aspose.pdf.Page page=document.getPages().get_Item(1);
com.aspose.pdf.AnnotationSelector annotationSelector=
new com.aspose.pdf.AnnotationSelector(
new com.aspose.pdf.SquareAnnotation(page, com.aspose.pdf.Rectangle.getTrivial()));
List list=annotationSelector.getSelected();
if (list.size() == 0) {
resultMessage.setText("マークされたテーブルが見つかりませんでした。");
return;
}
com.aspose.pdf.SquareAnnotation squareAnnotation = (com.aspose.pdf.SquareAnnotation) list.get(0);
com.aspose.pdf.TableAbsorber absorber=new com.aspose.pdf.TableAbsorber();
absorber.visit(page);
for (com.aspose.pdf.AbsorbedTable table : absorber.getTableList()) {
{
boolean isInRegion=(squareAnnotation.getRect().getLLX() < table.getRectangle().getLLX())
&& (squareAnnotation.getRect().getLLY() < table.getRectangle().getLLY())
&& (squareAnnotation.getRect().getURX() > table.getRectangle().getURX())
&& (squareAnnotation.getRect().getURY() > table.getRectangle().getURY());
if (isInRegion) {
File file=new File(fileStorage, "extracted-text.txt");
FileOutputStream fileOutputStream;
try {
fileOutputStream=new FileOutputStream(file);
} catch (FileNotFoundException e) {
resultMessage.setText(e.getMessage());
return;
}
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(fileOutputStream));
try {
// テーブルを解析する
for (com.aspose.pdf.AbsorbedRow row : table.getRowList()) {
{
for (com.aspose.pdf.AbsorbedCell cell : row.getCellList()) {
for (com.aspose.pdf.TextFragment fragment :
cell.getTextFragments()) {
bw.write(fragment.getText());
}
bw.write("|");
}
bw.newLine();
}
}
bw.close();
// -------------
} catch (IOException e) {
resultMessage.setText(e.getMessage());
return;
}
resultMessage.setText(R.string.success_message);
}
}
}
}
PDFからテーブルデータを抽出してCSVファイルに保存する
次の例は、テーブルを抽出してCSVファイルとして保存する方法を示しています。PDFをExcelスプレッドシートに変換する方法については、PDFをExcelに変換する記事を参照してください。
public void extractTableSaveCSV () {
// ドキュメントを開く
try {
document=new Document(inputStream);
} catch (Exception e) {
resultMessage.setText(e.getMessage());
return;
}
File file=new File(fileStorage, "PDFToXLS_out.csv");
// ExcelSave Optionオブジェクトをインスタンス化
com.aspose.pdf.ExcelSaveOptions excelSave=new com.aspose.pdf.ExcelSaveOptions();
excelSave.setFormat(com.aspose.pdf.ExcelSaveOptions.ExcelFormat.CSV);
try {
document.save(file.toString(), excelSave);
} catch (Exception e) {
resultMessage.setText(e.getMessage());
return;
}
resultMessage.setText(R.string.success_message);
}