Mengekstrak data dari tabel dalam PDF dengan Java

Mengekstrak tabel dari PDF

Gunakan TableAbsorber untuk menemukan tabel pada setiap halaman dan mengiterasi baris, sel, fragmen teks, dan segmen teks.

  1. Buka PDF sumber dalam instans Document.
  2. Iterasikan melalui objek Page dalam dokumen karena tabel terdeteksi halaman per halaman.
  3. Buat sebuah TableAbsorber untuk setiap halaman dan panggil visit(page) untuk mengisi daftar tabel yang terdeteksi.
  4. Iterasikan melalui objek AbsorbedTable, AbsorbedRow, AbsorbedCell, TextFragment, dan TextSegment yang terdeteksi.
  5. 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.

  1. Buka PDF sumber dalam instans Document.
  2. Dapatkan Page target dan temukan kotak Annotation yang menandai wilayah ekstraksi.
  3. Buat sebuah TableAbsorber dan panggil visit(page) untuk mendeteksi tabel pada halaman itu.
  4. Bandingkan properti AbsorbedTable berupa Rectangle pada setiap tabel yang terdeteksi dengan batas persegi panjang anotasi.
  5. Iterasikan melalui objek AbsorbedRow dan AbsorbedCell yang cocok dan bangun kembali teks baris.
  6. 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

  1. Buka PDF sumber dalam instans Document.
  2. Buat ExcelSaveOptions untuk ekspor.
  3. Atur format keluaran Excel ke XLSX jadi tata letak tabel yang terdeteksi ditulis sebagai buku kerja Excel.
  4. 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);
    }
}