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 中表格数据的必备工具。

Previous Next

Tabula-Java 入门指南

请使用以下命令在项目中添加 Maven 依赖。

OpenPDF Maven 依赖

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

通过 Gradle 安装 Tabula-Java

implementation 'technology.tabula:tabula:1.0.5' 

通过 Java API 基本表格提取

使用开源 Tabula-Java 库的最简单方法是让它使用默认检测算法自动检测 PDF 中的所有表格。这对于具有清晰、类似电子表格表格的 PDF 效果良好。让我们从一个直接的示例开始,提取 PDF 文档中的所有表格。此示例演示了基本工作流程。我们使用 Apache PDFBox(Tabula-Java 的底层 PDF 引擎)加载 PDF,创建提取算法,并遍历页面。

如何通过 Java API 从 PDF 中提取表格?

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();
    }
}

通过 Java API 将表格转换为 CSV

一个常见的用例是将提取的表格直接导出为 CSV 格式,以便在电子表格应用程序或数据库中使用。CSVWriter 类处理 CSV 格式的所有复杂性,包括对特殊字符的正确转义以及对多行单元格内容的处理。这使得将 Tabula-Java 集成到期望 CSV 输入的数据处理流水线中变得非常简单。以下是一个 Java 代码示例,展示了如何在 Java 应用程序中高效地处理表格。

如何通过 Java API 将提取的表格导出为 CSV 格式?

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),这与人们通常引用页码的方式相匹配。

 中国人