1. Các sản phẩm
  2.   PDF
  3.   Java
  4.   Tabula-Java
 
  

Thư viện PDF Java miễn phí để trích xuất bảng từ PDF

API Java mã nguồn mở, cho phép trích xuất bảng từ các tệp PDF một cách lập trình. Nó có thể dễ dàng chuyển các bảng đã trích xuất sang CSV và biến các bảng PDF bị khóa thành các định dạng dữ liệu có cấu trúc.

Tabula-Java là gì?

Các tệp PDF hiện diện khắp nơi trong thế giới kinh doanh—báo cáo, hoá đơn, bài nghiên cứu và báo cáo tài chính. Tuy nhiên, luôn có một vấn đề kéo dài: việc trích xuất dữ liệu dạng bảng từ các tài liệu này nổi tiếng là rất khó khăn. Sao chép và dán thường dẫn đến dữ liệu bị lỗi, và việc gõ lại thủ công tẻ nhạt và dễ gây sai sót. Đó là lúc Tabula-Java xuất hiện. Tabula-Java là một thư viện mã nguồn mở mạnh mẽ, cho phép trích xuất bảng từ tài liệu PDF một cách lập trình. Được xây dựng trên nền tảng xử lý PDF vững chắc, thư viện Java này biến các bảng PDF bị khóa thành các định dạng dữ liệu có cấu trúc mà bạn thực sự có thể làm việc. Dù bạn đang xây dựng các pipeline dữ liệu, tự động hoá quá trình xử lý báo cáo, hay chỉ đơn giản là mệt mỏi vì phải đấu tranh với các bảng PDF, Tabula-Java cung cấp một giải pháp tinh tế.

Khác với các trình phân tích PDF chung chỉ xem mọi thứ như văn bản không có cấu trúc, Tabula-Java hiểu cấu trúc bảng. Nó nhận dạng các hàng, cột và ô, giữ nguyên mối quan hệ giữa các điểm dữ liệu. Sự khác biệt này rất quan trọng — sự khác nhau giữa việc nhận được "John 42 Engineer" như một khối văn bản so với các bản ghi có cấu trúc với việc tách trường đúng cách. Thư viện hoạt động như một triển khai thuần Java, khiến nó hoàn hảo cho các ứng dụng doanh nghiệp, dịch vụ backend và bất kỳ hệ thống nào mà bạn cần trích xuất bảng PDF một cách đáng tin cậy, tự động mà không cần can thiệp thủ công. Nó là động cơ phía sau ứng dụng desktop Tabula phổ biến, đã được chứng minh qua nhiều năm sử dụng thực tế bởi các nhà báo, nhà nghiên cứu và nhà phân tích dữ liệu trên toàn thế giới. Các thuật toán phát hiện thông minh, các chế độ trích xuất linh hoạt và API đơn giản của nó làm cho nó trở thành công cụ thiết yếu cho bất kỳ ai làm việc với dữ liệu dạng bảng bị kẹt trong PDF.

Previous Next

Bắt đầu với Tabula-Java

Vui lòng sử dụng lệnh sau để thêm phụ thuộc Maven vào dự án của bạn.

Phụ thuộc Maven OpenPDF

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

Cài đặt Tabula-Java qua Gradle

implementation 'technology.tabula:tabula:1.0.5' 

Trích xuất bảng cơ bản qua API Java

Cách đơn giản nhất để sử dụng thư viện mã nguồn mở Tabula-Java là để nó tự động phát hiện tất cả các bảng trong một tệp PDF bằng thuật toán phát hiện mặc định của nó. Điều này hoạt động tốt với các tệp PDF có các bảng rõ ràng, giống bảng tính. Hãy bắt đầu với một ví dụ đơn giản mà trích xuất tất cả các bảng từ một tài liệu PDF. Ví dụ này trình bày quy trình làm việc cơ bản. Chúng tôi tải PDF bằng Apache PDFBox (động cơ PDF nền tảng của Tabula-Java), tạo một thuật toán trích xuất và lặp qua các trang.

Cách trích xuất bảng từ PDF bằng 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();
    }
}


Trích xuất bảng từ các vùng trang cụ thể

Thường thì, bạn không muốn trích xuất mọi thứ. Bạn có thể cần dữ liệu từ một bảng cụ thể ở một vị trí nhất định trên trang. Tabula-Java cho phép bạn định nghĩa một "vùng chọn" bằng cách sử dụng tọa độ. Lớp Rectangle xác định một khu vực cụ thể trên trang bằng không gian tọa độ PDF (nơi 72 điểm bằng một inch). Phương thức getArea() cắt trang tới vùng này trước khi trích xuất, cải thiện độ chính xác và hiệu suất khi bạn chỉ cần dữ liệu từ một vị trí cụ thể. Dưới đây là một ví dụ rất hữu ích minh họa cách thực hiện thao tác này.

Cách trích xuất bảng từ các vùng trang cụ thể bằng 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();
    }
}

Chuyển đổi bảng sang CSV qua API Java

Một trường hợp sử dụng phổ biến là xuất các bảng đã trích xuất trực tiếp sang định dạng CSV để sử dụng trong các ứng dụng bảng tính hoặc cơ sở dữ liệu. Lớp CSVWriter xử lý toàn bộ độ phức tạp của định dạng CSV, bao gồm việc thoát ký tự đặc biệt đúng cách và xử lý nội dung ô đa dòng. Điều này làm cho việc tích hợp Tabula-Java vào các quy trình xử lý dữ liệu yêu cầu đầu vào CSV trở nên đơn giản. Dưới đây là một ví dụ mã Java cho thấy cách xử lý các bảng một cách hiệu quả trong các ứng dụng Java.

Cách xuất các bảng đã trích xuất sang định dạng CSV bằng 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();
    }
}

Xử lý nhiều trang qua API Java

Nhiều PDF thực tế chứa các bảng trải dài trên nhiều trang. Thư viện đã bao gồm hỗ trợ xử lý nhiều trang cùng một lúc và cho phép các nhà phát triển lặp qua tất cả các trang trong tài liệu, trích xuất và báo cáo các bảng được tìm thấy. Đánh số trang bắt đầu từ 1 (không phải 0), phù hợp với cách con người thường tham chiếu số trang.

 Tiếng Việt