1. Товары
  2.   PDF
  3.   Java
  4.   Tabula-Java
 
  

Бесплатная Java PDF библиотека для извлечения таблиц из PDF

Открытый Java API, который программно извлекает таблицы из PDF‑файлов. Он легко конвертирует извлечённые таблицы в CSV и превращает защищённые PDF‑таблицы в структурированные форматы данных.

Что такое Tabula-Java?

PDF‑файлы встречаются повсюду в деловом мире — отчёты, счета‑фактуры, научные статьи и финансовые отчёты. Но существует постоянная проблема: извлечение табличных данных из этих документов известно сложным. Копирование и вставка часто приводит к искажённым данным, а ручной ввод утомителен и подвержен ошибкам. Именно здесь на помощь приходит Tabula-Java. Tabula-Java — мощная библиотека с открытым исходным кодом, которая программно извлекает таблицы из PDF‑документов. Основанная на надёжных основах обработки PDF, эта Java‑библиотека преобразует защищённые PDF‑таблицы в структурированные форматы данных, с которыми вы действительно можете работать. Будь то построение конвейеров данных, автоматизация обработки отчётов или просто усталость от борьбы с PDF‑таблицами, Tabula-Java предлагает элегантное решение.

В отличие от обычных PDF‑парсеров, которые рассматривают всё как неструктурированный текст, Tabula-Java понимает структуру таблиц. Она распознаёт строки, столбцы и ячейки, сохраняя взаимосвязи между данными. Это различие имеет решающее значение — разница между получением \"John 42 Engineer\" как куска текста и структурированными записями с правильным разделением полей. Библиотека работает как чистая реализация на Java, что делает её идеальной для корпоративных приложений, серверных сервисов и любых систем, где требуется надёжное автоматическое извлечение таблиц из PDF без ручного вмешательства. Это движок, лежащий в основе популярного настольного приложения Tabula, проверенный годами реального использования журналистами, исследователями и аналитиками данных по всему миру. Его интеллектуальные алгоритмы обнаружения, гибкие режимы извлечения и простой API делают его незаменимым инструментом для всех, кто работает с табличными данными, запертыми в PDF.

Начало работы с Tabula-Java

Пожалуйста, используйте следующую команду, чтобы добавить зависимость Maven в ваш проект.

Зависимость OpenPDF Maven

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

Установка Tabula-Java через Gradle

implementation 'technology.tabula:tabula:1.0.5' 

Базовое извлечение таблиц через Java API

Самый простой способ использовать открытый библиотеку Tabula-Java — позволить ей автоматически обнаруживать все таблицы в PDF с помощью алгоритма обнаружения по умолчанию. Это хорошо работает с PDF, содержащими четкие таблицы, похожие на электронные таблицы. Давайте начнём с простого примера, который извлекает все таблицы из PDF‑документа. Этот пример демонстрирует базовый рабочий процесс. Мы загружаем PDF с помощью Apache PDFBox (основного PDF‑движка Tabula-Java), создаём алгоритм извлечения и проходим по страницам.

Как извлечь таблицу из PDF с помощью 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();
    }
}


Извлечение таблицы из определённых областей страницы

Часто не требуется извлекать всё. Возможно, вам нужны данные из конкретной таблицы в определённом месте страницы. Tabula-Java позволяет задать область выбора с помощью координат. Класс Rectangle определяет конкретную область на странице, используя координатное пространство PDF (где 72 пункта равны одному дюйму). Метод getArea() обрезает страницу до этой области перед извлечением, повышая точность и производительность, когда нужны данные только из определённого места. Ниже приведён очень полезный пример, демонстрирующий, как выполнить эту операцию.

Как извлечь таблицу из конкретных областей страницы с использованием 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();
    }
}

Преобразование таблиц в CSV через Java API

Обычный сценарий использования — экспорт извлечённых таблиц непосредственно в формат CSV для использования в табличных приложениях или базах данных. Класс CSVWriter справляется со всей сложностью форматирования CSV, включая правильное экранирование специальных символов и обработку многострочного содержимого ячеек. Это делает тривиальной интеграцию Tabula-Java в конвейеры обработки данных, ожидающие ввод в формате CSV. Ниже приведён пример кода на Java, показывающий, как эффективно обрабатывать таблицы внутри Java‑приложений.

Как экспортировать извлечённые таблицы в формат CSV с помощью 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();
    }
}

Обработка нескольких страниц через Java API

Во многих реальных PDF-файлах таблицы распределены по нескольким страницам. Библиотека включает поддержку обработки нескольких страниц одновременно и позволяет разработчикам проходить по всем страницам документа, извлекая и отчётывая найденные таблицы. Нумерация страниц начинается с 1 (а не с 0), что соответствует тому, как люди обычно указывают номера страниц.