Java实现PDF表格转换为CSV的示例代码

 更新时间:2025年08月31日 09:32:33   作者:Eiceblue  
在很多企业办公和数据分析的场景中,PDF 中常常存放着报表、清单或统计数据,本文将介绍如何借助 Free Spire.PDF for Java,在 Java 程序中完成 PDF 表格到 CSV 的自动转换,感兴趣的看了解下

在很多企业办公和数据分析的场景中,PDF 中常常存放着报表、清单或统计数据。相比 PDF,CSV 文件 更易于在 Excel 或数据库中进行进一步处理。因此,我们常常需要一种方式,将 PDF 中的表格数据批量抽取并导出为 CSV 文件。

本文将介绍如何借助 Free Spire.PDF for Java,在 Java 程序中完成 PDF 表格到 CSV 的自动转换。

环境准备

在项目中引入 Free Spire.PDF for Java,可以通过 下载 jar 包,或使用 Maven:

<repositories>
    <repository>
        <id>com.e-iceblue</id>
        <name>e-iceblue</name>
        <url>https://repo.e-iceblue.cn/repository/maven-public/</url>
    </repository>
</repositories>
<dependency>
    <groupId>e-iceblue</groupId>
    <artifactId>spire.pdf.free</artifactId>
    <version>9.13.0</version>
</dependency>

PDF 表格导出为 CSV:完整流程

通过 Java 程序结合 Free Spire.PDF,可以实现从 加载 PDF、提取表格、到生成 CSV 文件 的完整自动化流程,下面我们将详细介绍如何实现这个自动化流程。

Step 1: 加载 PDF 文档

首先,创建 PdfDocument 对象并加载需要处理的 PDF 文件:

import com.spire.pdf.*;

PdfDocument pdf = new PdfDocument();
pdf.loadFromFile("Sample.pdf");

Step 2: 提取 PDF 表格数据

Spire.PDF 提供 PdfTableExtractor 类来专门识别表格。

我们识别指定 PDF 页面中的指定表格,然后逐行逐列读取表格内容,并用 StringBuilder 拼接为 CSV 格式。

import com.spire.pdf.utilities.*;
import java.io.*;

StringBuilder sb = new StringBuilder();

PdfTableExtractor extractor = new PdfTableExtractor(pdf);
// 提取第一页的表格
PdfTable[] tables = extractor.extractTable(0);

if (tables != null) {
    // 获取第一个表格
    PdfTable table = tables[0];
    for (int row = 0; row < table.getRowCount(); row++) {
        for (int col = 0; col < table.getColumnCount(); col++) {
            sb.append(escapeCsvField(table.getText(row, col)));
            if (col < table.getColumnCount() - 1) sb.append(",");
        }
        sb.append("\n");
    }
}

这里我们还需要一个工具方法来处理 CSV 中的特殊字符(如逗号、引号):

private static String escapeCsvField(String text) {
    if (text == null) return "";
    text = text.replaceAll("[\\n\\r]", "");
    if (text.contains(",") || text.contains(";") || text.contains("\"")) {
        text = text.replace("\"", "\"\"");
        text = "\"" + text + "\"";
    }
    return text;
}

Step 3: 保存为 CSV 文件

将拼接好的字符串写入文件,最终得到一个标准的 CSV:

try (Writer writer = new OutputStreamWriter(
        new FileOutputStream("output/PDFTable.csv"), "UTF-8")) {
    writer.write(sb.toString());
}
pdf.close();
System.out.println("PDF 表格已成功导出为 CSV。");

PDF转CSV完整Java代码示例

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

import java.io.*;

public class PdfToCsvExample {
    public static void main(String[] args) throws Exception {
        PdfDocument pdf = new PdfDocument();
        pdf.loadFromFile("Sample.pdf");
        StringBuilder sb = new StringBuilder();


        PdfTableExtractor extractor = new PdfTableExtractor(pdf);
        PdfTable[] tables = extractor.extractTable(0);

        if (tables != null) {
            PdfTable table = tables[0];
            for (int row = 0; row < table.getRowCount(); row++) {
                for (int col = 0; col < table.getColumnCount(); col++) {
                    sb.append(escapeCsvField(table.getText(row, col)));
                    if (col < table.getColumnCount() - 1) sb.append(",");
                }
                sb.append("\n");
            }
        }


        try (Writer writer = new OutputStreamWriter(
                new FileOutputStream("output/PDFTable.csv"), "UTF-8")) {
            writer.write(sb.toString());
        }
        pdf.close();
        System.out.println("PDF 表格已成功导出为 CSV。");
    }

    private static String escapeCsvField(String text) {
        if (text == null) return "";
        text = text.replaceAll("[\\n\\r]", "");
        if (text.contains(",") || text.contains(";") || text.contains("\"")) {
            text = text.replace("\"", "\"\"");
            text = "\"" + text + "\"";
        }
        return text;
    }
}

转换结果示例

进阶扩展

上面的示例将 所有表格合并到一个 CSV 文件 中。在实际业务中,我们还可能有不同的需求:

1. 每个表格单独保存

如果 PDF 每页包含多个表格,可以为每个表格生成独立的 CSV 文件:

for (int i = 0; i < pdf.getPages().getCount(); i++) {
    PdfTableExtractor extractor = new PdfTableExtractor(pdf);
    PdfTable[] tables = extractor.extractTable(i);

    if (tables != null) {
        for (int t = 0; t < tables.length; t++) {
            StringBuilder tableContent = new StringBuilder();
            PdfTable table = tables[t];

            for (int row = 0; row < table.getRowCount(); row++) {
                for (int col = 0; col < table.getColumnCount(); col++) {
                    tableContent.append(escapeCsvField(table.getText(row, col)));
                    if (col < table.getColumnCount() - 1) tableContent.append(",");
                }
                tableContent.append("\n");
            }

            try (Writer writer = new OutputStreamWriter(
                    new FileOutputStream("output/Page" + i + "_Table" + t + ".csv"), "UTF-8")) {
                writer.write(tableContent.toString());
            }
        }
    }
}

这样,每个表格会被单独导出,命名为 Page0_Table0.csv 等。

2. 合并所有表格到一个文件

有时我们不想把每个表格拆开保存,而是希望把整份 PDF 中的表格内容都汇总到同一个 CSV 文件中,方便统一分析。下面的示例展示了如何实现:

// 用于合并所有跨页表格的内容
StringBuilder mergedTableContent = new StringBuilder();

for (int i = 0; i < pdf.getPages().getCount(); i++) {
    PdfTableExtractor extractor = new PdfTableExtractor(pdf);
    PdfTable[] tables = extractor.extractTable(i);

    if (tables != null) {
        for (int t = 0; t < tables.length; t++) {
            PdfTable table = tables[t];

            for (int row = 0; row < table.getRowCount(); row++) {
                for (int col = 0; col < table.getColumnCount(); col++) {
                    mergedTableContent.append(escapeCsvField(table.getText(row, col)));
                    if (col < table.getColumnCount() - 1) mergedTableContent.append(",");
                }
                mergedTableContent.append("\n");
            }
        }
    }
}

// 统一写入一个 CSV 文件
try (Writer writer = new OutputStreamWriter(
        new FileOutputStream("output/MergedTable.csv"), "UTF-8")) {
    writer.write(mergedTableContent.toString());
}

运行后,PDF 中的所有表格会被逐一读取并写入 同一个 CSV 文件,文件路径为 output/MergedTables.csv

总结

本文介绍了如何在 Java 中使用 Free Spire.PDF for Java 将 PDF 中的表格内容导出为 CSV 文件。整体流程分为:

  • 加载 PDF 文档
  • 提取表格数据
  • 写入 CSV 文件

并扩展了 分表导出合并导出 两种常见应用场景。

这种方式可以高效处理 PDF 报表、财务清单、问卷统计等数据,极大减少人工操作的工作量。

到此这篇关于Java实现PDF表格转换为CSV的示例代码的文章就介绍到这了,更多相关Java PDF表格转CSV内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot中使用 POI的示例代码

    SpringBoot中使用 POI的示例代码

    这篇文章主要介绍了SpringBoot中使用POI的实例详解,包括引入poi的jar包和创建excel的实例代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-08-08
  • Springboot网站第三方登录 微信登录

    Springboot网站第三方登录 微信登录

    这篇文章主要为大家详细介绍了Springboot网站第三方登录 ,微信登录,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12
  • SpringBoot项目集成第三方CAS-client jar包的方法

    SpringBoot项目集成第三方CAS-client jar包的方法

    本文介绍了SpringBoot中集成第三方CAS-clientjar包的两种核心方式,涵盖了从背景原理到实操步骤、依赖冲突解决、打包配置及常见问题排查的全面内容,通过对比两种集成方式,提出了选型建议,并强调了依赖管理的规范性,为实际项目开发提供了全面指导,感兴趣的朋友一起看看吧
    2025-12-12
  • XXL-Job端口额外占用问题的解决方法小结

    XXL-Job端口额外占用问题的解决方法小结

    最近博主在Spring整合XXL-JOB到项目时发现了个问题,注册执行器需要额外占用端口,也就是我们每启动一个程序,除了程序本身的API端口外,还需要额外开放一个执行器端口,所以本文给大家分享了XXL-Job端口额外占用问题的解决方法小结,需要的朋友可以参考下
    2024-05-05
  • MyBatis-Plus中静态工具Db的多种用法及实例分析

    MyBatis-Plus中静态工具Db的多种用法及实例分析

    本文将详细讲解MyBatis-Plus中静态工具Db的各种用法,并结合具体案例进行演示和说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-03-03
  • Java中的数组与集合基本用法详解

    Java中的数组与集合基本用法详解

    本文介绍了Java数组和集合框架的基础知识,数组部分涵盖了一维、二维及多维数组的声明、初始化、访问与遍历方法,以及Arrays类的常用操作,对Java数组与集合相关知识感兴趣的朋友一起看看吧
    2025-07-07
  • Java编译生成多个.class文件的原理和作用

    Java编译生成多个.class文件的原理和作用

    作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象
    2025-04-04
  • 详解Java Fibonacci Search斐波那契搜索算法代码实现

    详解Java Fibonacci Search斐波那契搜索算法代码实现

    这篇文章主要介绍了详解Java Fibonacci Search斐波那契搜索算法代码实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • 一文搞懂Spring AOP的五大通知类型

    一文搞懂Spring AOP的五大通知类型

    本文将详细为大家介绍Spring AOP的五种通知类型(前置通知、后置通知、返回通知、异常通知、环绕通知),感兴趣的朋友可以了解一下
    2022-06-06
  • java 面向对象面试集锦

    java 面向对象面试集锦

    这篇文章主要介绍了java 面向对象面试集锦的相关资料,这里整理了面向对象的基础知识,帮助大家学习理解此部分的知识,需要的朋友可以参考下
    2016-11-11

最新评论