Mengekstrak data dari tabel dalam PDF dengan Java
Contents
[
Hide
]
Mengekstrak tabel dari PDF
Gunakan TableAbsorber untuk menemukan tabel pada setiap halaman dan mengiterasi baris, sel, fragmen teks, dan segmen teks.
- Buka PDF sumber dalam instans
Document. - Iterasikan melalui objek
Pagedalam dokumen karena tabel terdeteksi halaman per halaman. - Buat sebuah
TableAbsorberuntuk setiap halaman dan panggilvisit(page)untuk mengisi daftar tabel yang terdeteksi. - Iterasikan melalui objek
AbsorbedTable,AbsorbedRow,AbsorbedCell,TextFragment, danTextSegmentyang terdeteksi. - Bangun teks baris yang diekstrak dari konten fragmen dan cetak data tabel.
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);
}
}
}
}
}
Mengekstrak tabel dari area yang ditandai secara spesifik
Contoh ini menemukan anotasi persegi, membandingkan persegiannya dengan setiap tabel yang terdeteksi, dan hanya menghasilkan tabel yang berada di dalam wilayah yang ditandai.
- Buka PDF sumber dalam instans
Document. - Dapatkan
Pagetarget dan temukan kotakAnnotationyang menandai wilayah ekstraksi. - Buat sebuah
TableAbsorberdan panggilvisit(page)untuk mendeteksi tabel pada halaman itu. - Bandingkan properti
AbsorbedTableberupaRectanglepada setiap tabel yang terdeteksi dengan batas persegi panjang anotasi. - Iterasikan melalui objek
AbsorbedRowdanAbsorbedCellyang cocok dan bangun kembali teks baris. - Cetak data tabel hanya untuk wilayah yang ditandai.
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);
}
}
}
}
}
Mengekspor tabel ke Excel
- Buka PDF sumber dalam instans
Document. - Buat
ExcelSaveOptionsuntuk ekspor. - Atur format keluaran Excel ke
XLSXjadi tata letak tabel yang terdeteksi ditulis sebagai buku kerja Excel. - Panggil
document.save(outputFile.toString(), excelSave)untuk mengekspor dokumen dalam format 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);
}
}