1. Produkty
  2.   PDF
  3.   Java
  4.   Tabula-Java
 
  

Darmowa biblioteka Java PDF do wyodrębniania tabel z plików PDF

Otwarta biblioteka Java API, która programowo wyodrębnia tabele z plików PDF. Może łatwo konwertować wyodrębnione tabele do CSV i przekształca zablokowane tabele PDF w ustrukturyzowane formaty danych.

Czym jest Tabula-Java?

Pliki PDF są wszechobecne w świecie biznesu — raporty, faktury, prace naukowe i sprawozdania finansowe. Jednak istnieje stały problem: wyodrębnianie danych tabelarycznych z tych dokumentów jest notorycznie trudne. Kopiowanie i wklejanie często prowadzi do zniekształconych danych, a ręczne przepisywanie jest żmudne i podatne na błędy. Właśnie tutaj pojawia się Tabula-Java. Tabula-Java to potężna biblioteka open source, która programowo wyodrębnia tabele z dokumentów PDF. Zbudowana na solidnych podstawach przetwarzania PDF, ta biblioteka Java przekształca zablokowane tabele PDF w ustrukturyzowane formaty danych, z którymi naprawdę możesz pracować. Niezależnie od tego, czy tworzysz potoki danych, automatyzujesz przetwarzanie raportów, czy po prostu masz dość walki z tabelami w PDF, Tabula-Java oferuje eleganckie rozwiązanie.

W przeciwieństwie do ogólnych parserów PDF, które traktują wszystko jako nieustrukturyzowany tekst, Tabula-Java rozumie struktury tabel. Rozpoznaje wiersze, kolumny i komórki, zachowując zależności między punktami danych. Ta różnica jest kluczowa — różnica między otrzymaniem \"John 42 Engineer\" jako jednego bloku tekstu a rekordami strukturalnymi z odpowiednim rozdzieleniem pól. Biblioteka działa jako czysta implementacja w Javie, co czyni ją idealną dla aplikacji korporacyjnych, usług backendowych i każdego systemu, w którym potrzebne jest niezawodne, zautomatyzowane wyodrębnianie tabel z PDF bez ręcznej interwencji. To silnik stojący za popularną aplikacją desktopową Tabula, sprawdzony przez lata rzeczywistego użycia przez dziennikarzy, badaczy i analityków danych na całym świecie. Jej inteligentne algorytmy wykrywania, elastyczne tryby ekstrakcji i prosty interfejs API czynią ją niezbędnym narzędziem dla każdego, kto pracuje z danymi tabelarycznymi uwięzionymi w PDF.

Rozpoczęcie pracy z Tabula-Java

Użyj poniższego polecenia, aby dodać zależność Maven w swoim projekcie.

Zależność Maven OpenPDF

<dependency>
  <groupId>technology.tabula</groupId>
  <artifactId>tabula</artifactId>
  <version>1.0.5.</version>
</dependency>

Instalacja Tabula-Java za pomocą Gradle

implementation 'technology.tabula:tabula:1.0.5' 

Podstawowe wyodrębnianie tabel za pomocą API Java

Najprostszym sposobem użycia otwartoźródłowej biblioteki Tabula-Java jest pozwolenie jej na automatyczne wykrywanie wszystkich tabel w pliku PDF przy użyciu domyślnego algorytmu wykrywania. Działa to dobrze dla plików PDF z wyraźnymi, przypominającymi arkusze kalkulacyjne tabelami. Zacznijmy od prostego przykładu, który wyodrębnia wszystkie tabele z dokumentu PDF. Ten przykład demonstruje podstawowy przepływ pracy. Ładujemy PDF przy użyciu Apache PDFBox (podstawowego silnika PDF Tabula-Java), tworzymy algorytm ekstrakcji i iterujemy przez strony.

Jak wyodrębnić tabelę z pliku PDF przy użyciu Java API?

import technology.tabula.*;
import technology.tabula.extractors.SpreadsheetExtractionAlgorithm;
import org.apache.pdfbox.pdmodel.PDDocument;

import java.io.File;
import java.io.IOException;
import java.util.List;

public class BasicExtraction {
    public static void main(String[] args) throws IOException {
        // Load the PDF document
        File pdfFile = new File("data_report.pdf");
        PDDocument document = PDDocument.load(pdfFile);
        
        // Create an extraction algorithm
        SpreadsheetExtractionAlgorithm extractor = new SpreadsheetExtractionAlgorithm();
        
        // Create a page iterator
        ObjectExtractor objectExtractor = new ObjectExtractor(document);
        PageIterator pages = objectExtractor.extract();
        
        // Process each page
        while (pages.hasNext()) {
            Page page = pages.next();
            
            // Extract tables from the page
            List<Table> tables = extractor.extract(page);
            
            // Print each table
            for (Table table : tables) {
                System.out.println("Found table with " + table.getRowCount() + " rows");
                
                // Iterate through rows
                for (List row : table.getRows()) {
                    for (RectangularTextContainer cell : row) {
                        System.out.print(cell.getText() + "\t");
                    }
                    System.out.println();
                }
            }
        }
        
        document.close();
    }
}


Wyodrębnianie tabeli z określonych regionów strony

Często nie chcesz wyodrębniać wszystkiego. Możesz potrzebować danych z konkretnej tabeli w określonym miejscu na stronie. Tabula-Java umożliwia zdefiniowanie „obszaru wyboru” przy użyciu współrzędnych. Klasa Rectangle definiuje określony obszar na stronie, korzystając z przestrzeni współrzędnych PDF (gdzie 72 punkty równe są jednemu calowi). Metoda getArea() przycina stronę do tego regionu przed ekstrakcją, poprawiając dokładność i wydajność, gdy potrzebujesz danych tylko z konkretnego miejsca. Oto bardzo przydatny przykład, który pokazuje, jak wykonać tę operację.

Jak wyodrębnić tabelę z określonych regionów strony przy użyciu Java API?

import technology.tabula.Rectangle;

public class RegionExtraction {
    public static void extractRegion(String pdfPath) throws IOException {
        File pdfFile = new File(pdfPath);
        PDDocument document = PDDocument.load(pdfFile);
        
        ObjectExtractor objectExtractor = new ObjectExtractor(document);
        Page page = objectExtractor.extract(1);
        
        // Define the region (x, y, width, height)
        // Coordinates are in points (72 points = 1 inch)
        Rectangle region = new Rectangle(50, 100, 500, 400);
        Page subPage = page.getArea(region);
        
        SpreadsheetExtractionAlgorithm extractor = new SpreadsheetExtractionAlgorithm();
        List<Table> tables = extractor.extract(subPage);
        
        // Process the extracted table
        for (Table table ; tables) {
            System.out.println("Extracted " + table.getRowCount() + " rows from region");
        }
        
        document.close();
    }
}

Konwertowanie tabel do formatu CSV za pomocą API Java

Typowym przypadkiem użycia jest eksportowanie wyodrębnionych tabel bezpośrednio do formatu CSV w celu użycia w aplikacjach arkuszy kalkulacyjnych lub bazach danych. Klasa CSVWriter obsługuje całą złożoność formatowania CSV, w tym prawidłowe escapowanie znaków specjalnych oraz obsługę wieloliniowej zawartości komórek. Dzięki temu integracja Tabula-Java z potokami przetwarzania danych, które oczekują wejścia CSV, jest trywialna. Oto przykład kodu Java, który pokazuje, jak efektywnie obsługiwać tabele w aplikacjach Java.

Jak wyeksportować wyodrębnione tabele do formatu CSV przy użyciu Java API?

import technology.tabula.writers.CSVWriter;
import java.io.FileWriter;

public class CSVExtraction {
    public static void exportToCSV(String pdfPath, String csvPath) throws IOException {
        File pdfFile = new File(pdfPath);
        PDDocument document = PDDocument.load(pdfFile);
        
        SpreadsheetExtractionAlgorithm extractor = new SpreadsheetExtractionAlgorithm();
        ObjectExtractor objectExtractor = new ObjectExtractor(document);
        Page page = objectExtractor.extract(1);
        
        List<Table< tables = extractor.extract(page);
        
        // Write to CSV file
        if (!tables.isEmpty()) {
            Table table = tables.get(0);
            
            try (FileWriter writer = new FileWriter(csvPath)) {
                CSVWriter csvWriter = new CSVWriter();
                csvWriter.write(writer, table);
            }
        }
        
        document.close();
    }
}

Przetwarzanie wielu stron za pomocą API Java

Wiele rzeczywistych plików PDF zawiera tabele rozłożone na wielu stronach. Biblioteka zawiera wsparcie dla przetwarzania wielu stron jednocześnie i umożliwia programistom iterację przez wszystkie strony dokumentu, wyodrębniając i raportując znalezione tabele. Numeracja stron zaczyna się od 1 (nie od 0), co odpowiada temu, jak ludzie zazwyczaj odwołują się do numerów stron.