استخراج البيانات من جدول في PDF باستخدام Java

استخراج الجداول من PDF

استخدام TableAbsorber للعثور على الجداول في كل صفحة والتكرار عبر الصفوف والخلايا وقطاعات النص وقطعات النص.

  1. افتح ملف PDF المصدر في a Document مثال.
  2. مرّ على المستند الكائنات Page لأن الجداول تُكتشف صفحة بصفحة.
  3. أنشئ كائنًا من الفئة TableAbsorber لكل صفحة واستدعِ visit(page) لتعبئة قائمة الجداول المكتشفة.
  4. مرّ على المكتشف AbsorbedTable, AbsorbedRow, AbsorbedCell, TextFragment، و الكائنات TextSegment.
  5. أنشئ نص الصف المستخرج من محتوى الجزء واطبع بيانات الجدول.
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);
                }
            }
        }
    }
}

استخراج جدول من منطقة محددة

هذا المثال يجد تعليقًا مربعًا، يقارن مستطيله بكل جدول مُكتشف، ويُخرج فقط الجداول داخل المنطقة المحددة.

  1. افتح ملف PDF المصدر في a Document مثال.
  2. احصل على الهدف Page وحدد المربع Annotation الذي يحدد منطقة الاستخراج.
  3. أنشئ كائنًا من الفئة TableAbsorber واستدعِ visit(page) لاكتشاف الجداول في تلك الصفحة.
  4. قارن كل ما تم اكتشافه AbsorbedTable Rectangle مع حدود مستطيل التعليق التوضيحي.
  5. مرّ على المطابقة AbsorbedRow و الكائنات AbsorbedCell وإعادة بناء نص الصف.
  6. اطبع بيانات الجدول للمنطقة المحددة فقط.
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

  1. افتح ملف PDF المصدر في a Document مثال.
  2. أنشئ كائنًا من الفئة ExcelSaveOptions للتصدير.
  3. ضبط تنسيق مخرجات Excel إلى XLSX لذا يتم كتابة تخطيط الجدول المكتشف كدفتر عمل Excel..
  4. استدعِ 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);
    }
}