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