惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

小众软件
小众软件
IT之家
IT之家
博客园 - 聂微东
www.infosecurity-magazine.com
www.infosecurity-magazine.com
P
Privacy International News Feed
人人都是产品经理
人人都是产品经理
PCI Perspectives
PCI Perspectives
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 叶小钗
V
Vulnerabilities – Threatpost
美团技术团队
S
Secure Thoughts
N
News | PayPal Newsroom
L
LINUX DO - 最新话题
腾讯CDC
Application and Cybersecurity Blog
Application and Cybersecurity Blog
雷峰网
雷峰网
B
Blog
MyScale Blog
MyScale Blog
T
The Blog of Author Tim Ferriss
TaoSecurity Blog
TaoSecurity Blog
N
News and Events Feed by Topic
Blog — PlanetScale
Blog — PlanetScale
C
Check Point Blog
T
Tailwind CSS Blog
月光博客
月光博客
Simon Willison's Weblog
Simon Willison's Weblog
Hacker News: Ask HN
Hacker News: Ask HN
The Last Watchdog
The Last Watchdog
Google DeepMind News
Google DeepMind News
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
MongoDB | Blog
MongoDB | Blog
S
Security @ Cisco Blogs
Jina AI
Jina AI
Engineering at Meta
Engineering at Meta
S
Security Affairs
Forbes - Security
Forbes - Security
P
Palo Alto Networks Blog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
博客园 - 司徒正美
博客园 - 三生石上(FineUI控件)
T
Tor Project blog
O
OpenAI News
L
Lohrmann on Cybersecurity
Security Archives - TechRepublic
Security Archives - TechRepublic
P
Proofpoint News Feed
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
L
LangChain Blog
B
Blog RSS Feed
H
Hackread – Cybersecurity News, Data Breaches, AI and More

博客园 - E-iceblue

如何使用 Python 快速将 Excel 转换为 XML 文件 Python 办公自动化:Word 文档加密与权限控制实战 在 Python 中快速锁定 Excel 单元格与行列 使用 Python 在 Word 文档中添加或删除文本框 如何使 PDF 可编辑 - Python 教程详解 将 Excel 表格插入 Word 文档的三种实用方案(Python 自动化) Python 办公自动化:如何轻松调整 Word/PDF 页面大小为 Legal 尺寸 数字签名 vs 电子签名:区别与如何在文件中插入数字签名 Python 教程:快速复制 Excel 工作表 如何对比 Excel 两列数据的不同:从基础操作到 Python 自动化 如何提取 Word 文档中的表格并导出为 Excel(Python 教程) 使用 Python 在 PowerPoint 中添加或移除背景图和背景颜色 在 Java 中使用 Spire.PDF 合并 PDF 文档(含加密与压缩处理) 在 Python 中自动化转化 Markdown 为 HTML 【详细教程】 Python 控制 PDF 页面大小、页边距、页面方向与缩放 Python 办公自动化:快速将 HTML 转换为 PDF 格式 在 Python 中给 PDF 设置背景图或背景色 在 Python 中转换 XML 为 PDF 文档:基础转换与转换设置 在 Python 中对比 Word 文档:自动生成修订报告【教程向】 Excel 删除空白行的 5 种方法 【手动与 Python 自动化】 删除 Excel 表格中的重复行 【4 种实用方法】 从纯文本到精美文档:TXT 转 PDF 的三种高效方案 Python 实现 PDF 表单域的自动化创建与智能填充 PPT 批量转图片:在 Web 预览中实现翻页效果(C#/VB.NET) 为什么生成的条形码扫不出来?从静区、分辨率和色彩三个方向解析条码识别率 Excel vs CSV:在系统数据处理中该如何选择?(附格式转换代码示例) 零成本实现文档智能:本地化 OCR 提取与 AI 处理全流程实战 PPT 智能提取与分析实战:把演示文档变成结构化数据 为什么 PDF 文本能看到,却提取不到?从开发者角度解析与解决方案 PDF 文件为什么打不开?常见原因与解决思路 PDF vs PDF/A:区别、场景与常用转换方法(2026 全面解读) 使用 Java 将 PowerPoint 转换为 PDF 的完整指南 如何在 Python 中轻松添加、隐藏和删除幻灯片
【2026 最新教程】Java 自动化提取 PDF 表格:从文本到 Excel/CSV 的全场景实现
E-iceblue · 2026-01-15 · via 博客园 - E-iceblue

随着企业数据自动化的需求日益激增,提取 PDF 中的表格的需求也越来越受到重视。尽管此前我们就发布过使用 Java 提取 PDF 中的表格,并保存为 Text 文件的教程,但显然,简单的文本提取难以满足复杂的数据分析场景。

在处理财务报表、供应链清单等结构化文档时,开发者不仅需要获取数据,更需要保留其逻辑结构。本文将基于最新的 Spire.PDF for Java,展示如何精准地将 PDF 表格转换为文本、CSV 以及 Excel 格式,实现全场景的数据自动化提取。

环境准备

在进入今天的正文前,请确保你的开发环境已就绪:

  • JDK 支持:推荐使用 JDK 8 及以上版本。
  • Maven 依赖:在 pom.xml 文件中配置以下仓库和依赖,以获取最新的组件支持。
<repositories>
    <repository>
        <id>com.e-iceblue</id>
        <name>e-iceblue</name>
        <url>https://repo.e-iceblue.cn/repository/maven-public/</url>
    </repository>
</repositories>
<dependencies>
    <dependency>
        <groupId>e-iceblue</groupId>
        <artifactId>spire.pdf</artifactId>
        <version>11.12.16</version>
    </dependency>
</dependencies>

或导航到 Spire.PDF for Java 的官方网站下载安装包,解压后将 jar 文件手动导入到项目中。

基础提取:将 PDF 表格转为文本

作为入门级方案,将 PDF 中的表格提取为文本适用于对格式要求不高、仅需获取原始信息的场景。

技术逻辑:利用 PdfTableExtractor 识别表格,通过遍历单元格获取字符串。

import com.spire.pdf.*;
import com.spire.pdf.utilities.PdfTable;
import com.spire.pdf.utilities.PdfTableExtractor;

import java.io.FileWriter;
import java.io.IOException;

public class ExtractTable {
    public static void main(String[] args)throws IOException {
        // 实例化PdfDocument类的对象
        PdfDocument pdf = new PdfDocument();

        // 加载PDF文档
        pdf.loadFromFile("E:/Administrator/Python1/input/项目进度.pdf");

        // 创建StringBuilder类的实例
        StringBuilder builder = new StringBuilder();

        // 创建PdfTableExtractor类的对象
        PdfTableExtractor extractor = new PdfTableExtractor(pdf);

        // 遍历每一页
        for (int page = 0; page < pdf.getPages().getCount(); page++)
        {
            // 提取页面中的表格存入PdfTable[]数组
            PdfTable[] tableLists = extractor.extractTable(page);
            if (tableLists != null && tableLists.length > 0)
            {
                //遍历表格
                for (PdfTable table : tableLists)
                {
                    int row = table.getRowCount();//获取表格行
                    int column = table.getColumnCount();//获取表格列
                    for (int i = 0; i < row; i++)
                    {
                        for (int j = 0; j < column; j++)
                        {
                            // 获取表格中的文本内容
                            String text = table.getText(i, j);

                            // 将获取的text写入StringBuilder容器
                            builder.append(text+" ");
                        }
                        builder.append("\r\n");
                    }
                }
            }
        }

        // 保存为txt文档
        FileWriter fileWriter = new FileWriter("E:/Administrator/Python1/output/提取表格为文本.txt");
        fileWriter.write(builder.toString());
        fileWriter.flush();
        fileWriter.close();
    }
}

源文件与输出文件对比图:

通过 Java 将 PDF 中表格提取为文本

方案一:最简化提取——将 PDF 表格导出为 CSV

虽然保存为文本格式能够快速获取内容,但在面对需要二次计算或数据入库的场景时,将 PDF 表格导出为 CSV 是一种更合适的选择。CSV 格式通用性很高,几乎可以被所有的主流数据库系统、数据分析工具以及编程语言无差识别,是构建自动化数据流转链路的理想中间格式。它不仅写入速度极快,且内存开销低,尤其适合后端批量处理任务。

技术逻辑:CSV(逗号分隔值)是结构化数据的标准格式。我们通过 PdfTableExtractor 获取表格数据后,通过代码控制逗号分隔符输出。

import com.spire.pdf.*;  
import com.spire.pdf.utilities.*;  
  
import java.io.*;  
  
public class ExtractTable {  
    public static void main(String[] args) throws Exception {  
        // 1. 加载 PDF 文档  
        PdfDocument pdf = new PdfDocument();  
        // 请确保路径正确  
        pdf.loadFromFile("E:/Administrator/Python1/input/项目进度.pdf");  
  
        // 用于存储提取文本的 StringBuilder        StringBuilder sb = new StringBuilder();  
  
        // 2. 遍历每一页并提取表格  
        for (int i = 0; i < pdf.getPages().getCount(); i++) {  
            PdfTableExtractor extractor = new PdfTableExtractor(pdf);  
            PdfTable[] tableLists = extractor.extractTable(i);  
  
            if (tableLists != null) {  
                for (PdfTable table : tableLists) {  
                    for (int row = 0; row < table.getRowCount(); row++) {  
                        for (int col = 0; col < table.getColumnCount(); col++) {  
                            // 使用工具方法处理 CSV 特殊字符和换行  
                            String cellText = escapeCsvField(table.getText(row, col));  
                            sb.append(cellText);  
  
                            // 列之间用逗号分隔  
                            if (col < table.getColumnCount() - 1) {  
                                sb.append(",");  
                            }  
                        }  
                        // 行之间用换行符分隔  
                        sb.append("\n");  
                    }  
                }  
            }  
        }  
  
        // 3. 写入带 BOM 的 CSV 文件  
        File outFile = new File("E:/Administrator/Python1/output/提取表格为csv.csv");  
  
        // 确保输出目录存在  
        if (!outFile.getParentFile().exists()) {  
            outFile.getParentFile().mkdirs();  
        }  
  
        try (FileOutputStream fos = new FileOutputStream(outFile)) {  
            // 【核心修复】写入 UTF-8 BOM 字节,防止 Excel 打开乱码  
            fos.write(0xEF);  
            fos.write(0xBB);  
            fos.write(0xBF);  
  
            // 使用 UTF-8 编码包装输出流  
            try (Writer writer = new OutputStreamWriter(fos, "UTF-8")) {  
                writer.write(sb.toString());  
            }  
        }  
  
        pdf.close();  
        System.out.println("PDF 表格已成功导出为 CSV 文件。");  
    }  
  
    /**  
     * 处理 CSV 字段的工具方法:  
     * 1. 去除单元格内的换行符  
     * 2. 转义双引号  
     * 3. 对包含特殊字符的字段添加双引号包裹  
     */  
    private static String escapeCsvField(String text) {  
        if (text == null) return "";  
  
        // 去掉单元格内的换行符(防止破坏 CSV 行结构)  
        text = text.replaceAll("[\\n\\r]", " ");  
  
        // 处理特殊字符  
        boolean containsSpecialChar = text.contains(",") || text.contains(";") ||  
                text.contains("\"") || text.contains("\n");  
  
        if (containsSpecialChar) {  
            // 转义双引号:将 " 替换为 ""            text = text.replace("\"", "\"\"");  
            // 整个字段用双引号包裹  
            text = "\"" + text + "\"";  
        }  
  
        return text.trim();  
    }  
}

结果文件示意图:

Java 将 PDF 中表格提取为 CSV

提示:在导出 CSV 时,建议对单元格内容使用双引号包裹,以处理数据本身含有逗号的情况。此外,确保文件使用 UTF-8 (with BOM) 编码,防止在 Excel 中直接打开时出现中文乱码。

方案二:结构化导出——将 PDF 表格直接转为 Excel

由于 CSV 只能存储纯文本,合并单元格、字体等格式在导出时会丢失。如果需要保留样式,应该选择将 PDF 中的表格提取为 Excel 文件。比如说处理财务报表、审计清单等文件,单元格样式与数据息息相关。通过导出为 Excel,你可以更好地保留原 PDF 文档中的布局,避免对数据进行二次加工。

核心步骤

  1. 加载源 PDF 文档。
  2. 遍历读取 PDF 中的表格单元格和数据。
  3. 将数据填入 Excel 单元格中。
  4. 设置 Excel 单元格(可选步骤)。
  5. 调用 saveToFile 并指定 FileFormat.XLSX
import com.spire.pdf.PdfDocument;  
import com.spire.pdf.utilities.PdfTable;  
import com.spire.pdf.utilities.PdfTableExtractor;  
import com.spire.xls.ExcelVersion;  
import com.spire.xls.Workbook;  
import com.spire.xls.Worksheet;  
  
public class ExtractTable {  
  
    public static void main(String[] args) {  
  
        //加载示例PDF文档  
        PdfDocument pdf = new PdfDocument("E:/Administrator/Python1/input/项目进度.pdf");  
        //创建一个PdfTableExtractor实例  
        PdfTableExtractor extractor = new PdfTableExtractor(pdf);  
        //从第一页提取表格  
        PdfTable[] pdfTables  = extractor.extractTable(0);  
        //创建一个工作簿对象  
        Workbook wb = new Workbook();  
        //删除默认工作表  
        wb.getWorksheets().clear();  
        //如果找到任何表格  
        if (pdfTables != null && pdfTables.length > 0) {  
            //循环遍历表格  
            for (int tableNum = 0; tableNum < pdfTables.length; tableNum++) {  
                //将工作表添加到工作簿  
                String sheetName = String.format("Table - %d", tableNum + 1);  
                Worksheet sheet = wb.getWorksheets().add(sheetName);  
                //循环遍历当前表格中的行  
                for (int rowNum = 0; rowNum < pdfTables[tableNum].getRowCount(); rowNum++) {  
                    //循环遍历当前表格中的列  
                    for (int colNum = 0; colNum < pdfTables[tableNum].getColumnCount(); colNum++) {  
                        //从当前表格单元格中提取数据  
                        String text = pdfTables[tableNum].getText(rowNum, colNum);  
                        //将数据插入特定单元格  
                        sheet.get(rowNum + 1, colNum + 1).setText(text);  
                    }  
                }  
                //自动调整列宽  
                for (int sheetColNum = 0; sheetColNum < sheet.getColumns().length; sheetColNum++) {  
                    sheet.autoFitColumn(sheetColNum + 1);  
                }  
            }  
        }  
        //将工作簿保存为 Excel 文件  
        wb.saveToFile("E:/Administrator/Python1/output/提取表格为excel.xlsx", ExcelVersion.Version2016);  
    }  
}

效果展示

Java 将 PDF 中表格提取为 Excel 文件

进阶挑战:处理复杂的跨页提取

在实际业务中,我们常遇到长篇合同或大型清单,同一个表格被拆分到两个或多个物理页面。这种情况单纯依靠循环提取会导致数据断层。那么如何识别第二页顶部的表格是第一页末尾表格的延续?如何自动合并表头?

针对此类涉及坐标逻辑判断的高阶需求,我们准备了详细的进阶教程。感兴趣的话可以查看官网教程如何在 Java 中将 PDF 转换为 CSV(轻松提取 PDF 表格)

总结与技术支持

从提取 PDF 表格为文本,到涵盖 CSV 和 Excel 的全场景导出,技术工具的演进让 PDF 数据处理变得不再繁琐。通过 Spire.PDF for Java,你可以根据业务需求灵活选择轻量级的 CSV 方案或高保真的 Excel 方案。