冰蓝科技
|
028-81705109
|
|
微信扫一扫
|

Spire.Cloud 纯前端文档控件

Spire.PDF for Java 支持通过 PdfGrid 类和 PdfTable 类在 PDF 页面中绘制表格,在“Java 创建并格式并 PDF 表格”一文中介绍了如何绘制表格。本篇文章将介绍使用 PdfTableExtractor 类来提取 PDF 中的表格的方法。

安装 Spire.PDF for Java

首先,您需要在 Java 程序中添加 Spire.Pdf.jar 文件作为依赖项。您可以从这个链接下载 JAR 文件;如果您使用 Maven,则可以通过在 pom.xml 文件中添加以下代码导入 JAR 文件。

<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.11.11</version>
    </dependency>
</dependencies>

提取 PDF 中的表格

提取表格的主要步骤如下:

  • Java
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("http://cdn.e-iceblue.cn/test.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("ExtractedTable.txt");
        fileWriter.write(builder.toString());
        fileWriter.flush();
        fileWriter.close();
    }
}

表格内容读取结果:

Java 提取 PDF 中的表格

申请临时 License

如果您希望删除结果文档中的评估消息,或者摆脱功能限制,请 该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。 获取有效期 30 天的临时许可证。

Spire.PDF 7.12.1已发布。该版本带来了一些新功能。新增了.NET 6.0以及解密PDF方法,支持了获取附件所在的PDF页面。还增强了PDF到OFD,PDF到图片,XPS到PDF的转换功能。此外还修复了删除PDF文件中的图片结果文档变大等已知问题。详情请阅读以下内容。

新功能:

问题修复:


获取Spire.PDF 7.12.1请点击:

https://www.e-iceblue.cn/Downloads/Spire-PDF-NET.html

Spire.PDF for Java 4.12.1已发布。该版本支持转换PDF为线性PDF,并且支持转换PDF到Excel单元格文本不换行的功能。另外还增强了PDF到OFD,PDF到PDFA的转换功能。此外还修复了压缩PDF图片后图片内容不正确等已知问题。详情请阅读以下内容。

新功能:

问题修复:


获取Spire.PDF for Java 4.12.1请点击:

https://www.e-iceblue.cn/Downloads/Spire-PDF-JAVA.html

通常在工作中比较常用到的 Microsoft Word 是属于国外的文档内容编辑软件,其编译技术均属国外;而 OFD 是一种我国的自主文件格式,在某些特定行业或企业的文档存储技术上是一种更为安全的选择。下面,将介绍使用 Spire.Doc for Java 来实现 Word 文档转换为 OFD 格式的方法及步骤。此外,您也可以使用 Java 技术实现将 PDF 转为 OFD

安装 Spire.Doc for Java

首先,您需要在 Java 程序中添加 Spire.Doc.jar 文件作为依赖项。JAR 文件可以从 此链接 下载。 如果您使用 Maven,则可以将以下代码添加到项目的 pom.xml 文件中,从而轻松地在应用程序中导入 JAR 文件。

<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.doc</artifactId>
        <version>13.12.2</version>
    </dependency>
</dependencies>

将 Word 转为 OFD

文档转换只需要简单三行代码就可以实现,步骤如下:

  • Java
import com.spire.doc.*;

public class WordToOFD {
    public static void main(String[] args) {
        //实例化Document类的对象
        Document document = new Document();

        //加载Word文档
        document.loadFromFile("http://cdn.e-iceblue.cn/Guide.docx");

        //保存为OFD格式
        document.saveToFile("ToOFD.ofd", FileFormat.OFD);
    }
}

转换结果:

Java 将 Word 转为 OFD

申请临时 License

如果您希望删除结果文档中的评估消息,或者摆脱功能限制,请 该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。 获取有效期 30 天的临时许可证。

Spire.Doc for Java 4.12.1已发布。该版本带来了一些新功能,比如:支持转换Word到OFD格式,支持设置修订作者,支持在进行比较时设置“忽略格式”。此外还增强了Word到PDF的转换功能,并且修复了获取的列表文本不正确等已知问题。详情请阅读以下内容。

新功能:

问题修复:


获取Spire.Doc for Java 4.12.1请点击:

https://www.e-iceblue.cn/Downloads/Spire-Doc-JAVA.html

Word 文档中的每个段落都有意或无意地使用着某一种段落样式。段落样式可以是内置样式,例如标题1标题2,也可以是自定义样式。本文介绍了如何使用 Spire.Doc for Java 提取使用特定样式的段落。

下表列出了MS Word中的样式名称及其在 Spire.Doc 中的对应名称。简单判断的原则是编程返回的样式名称不包含空格。

MS Word 的样式名称 Spire.Doc 的样式名称
Title Title
Subtitle Subtitle
Heading 1 Heading1
Heading 2 Heading2
Heading 3 Heading3
No Spacing NoSpacing
Quote Quote
Intense Quote IntenseQuote
List Paragraph ListParagraph
Normal Normal
Custom Name CustomName

安装 Spire.Doc for Java

首先,您需要在 Java 程序中添加 Spire.Doc.jar 文件作为依赖项。JAR 文件可以从 此链接 下载。 如果您使用 Maven,则可以将以下代码添加到项目的 pom.xml 文件中,从而轻松地在应用程序中导入 JAR 文件。

<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.doc</artifactId>
        <version>13.12.2</version>
    </dependency>
</dependencies>

提取使用特定样式的段落

您可以通过 Paragraph.getStyleName() 方法获取特定段落的样式名称。 如果段落的样式名称正好是您需要的,则可以使用 Paragraph.getText() 方法获取段落内容。以下是提取使用特定样式段落的步骤。

  • Java
import com.spire.doc.Document;
import com.spire.doc.documents.Paragraph;

    public class GetParagraphByStyleName {
        public static void main(String[] args) {

            //在初始化Document对象时加载示例Word文档
            Document doc = new Document("C:\\Users\\Administrator\\Desktop\\sample.docx");

            //声明一个变量
            Paragraph paragraph;

            //循环遍历各个节
            for (int i = 0; i < doc.getSections().getCount(); i++) {

                //循环遍历特定节的段落
                for (int j = 0; j < doc.getSections().get(i).getParagraphs().getCount(); j++) {

                    //获取特定段落
                    paragraph = doc.getSections().get(i).getParagraphs().get(j);

                    //确定段落样式是否为“Heading 1”
                    if (paragraph.getStyleName().equals("Heading1")) {

                        //获取“Heading1”中段落的文本
                        System.out.println("Heading 1: " + paragraph.getText() + "\n");
                    }

                    //判断段落样式是否为“My Custom Style”
                    if (paragraph.getStyleName().equals("MyCustomStyle")) {

                        //获取“My Custom Style”中的段落文本
                        System.out.println("My Custom Style: " + paragraph.getText());
                    }
                }
            }
        }
    }

Java 提取使用特定样式的 Word 段落

申请临时 License

如果您希望删除结果文档中的评估消息,或者摆脱功能限制,请 该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。 获取有效期 30 天的临时许可证。

Spire.Presentation for Java 4.11.7已发布。该版本支持添加数学公式和检测shape是否包含数学公式,并且增强了PPT到图片,PPT到PDF的转换功能,还修复了图表图例”是否重叠“属性设置不生效等已知问题。详情请阅读以下内容。

新功能:

问题修复:


获取Spire.Presentation for Java 4.11.7请点击:

https://www.e-iceblue.cn/Downloads/Spire-Presentation-JAVA.html

在数据处理、自动化报表生成、业务数据整合等场景中,从 PDF 文件中提取表格是一项常见需求。PDF 作为通用文档格式,虽便于数据共享,但因底层以 “视觉布局” 而非 “结构化数据” 存储,导致编程提取表格时面临格式解析、数据对齐等难题。本文将介绍如何使用 Spire.PDF for .NET 库通过 C# 提取 PDF 中的表格,并将结果导出为 TXT 和 CSV 格式以便进一步分析。

目录:

搭建 C# 开发环境

Spire.PDF for .NET 是一个功能强大的库,用于在 C# 和 VB.NET 中处理 PDF 文件。它支持广泛的 PDF 操作,包括表格提取、文本提取、图像提取等。

推荐通过 NuGet 包管理器安装 Spire.PDF(最便捷,自动处理依赖)。步骤如下:

1. 打开 Visual Studio 并创建一个新的 C# 项目。(此处新建了一个控制台应用程序);

2. 在 Visual Studio 中,右键点击项目名称 → 选择 “管理 NuGet 程序包”;

3. 在 “浏览” 页搜索 Spire.PDF,选择最新稳定版 → 点击 “安装”。

了解 PDF 表格结构

在编写代码之前,让我们先弄清楚 PDF 是如何存储表格的。与 Excel(明确定义行 / 列)不同,PDF 无原生 “表格” 概念,仅通过 3 类视觉元素模拟表格:

  • 文本块:每个单元格的文本是独立元素,通过坐标(X/Y 轴)定位;
  • 边框线条:水平 / 垂直线条作为视觉分隔,标识表格的行 / 列边界;
  • 间距规则:文本块之间的固定间隙,辅助区分不同单元格。

Spire.PDF 的 PdfTableExtractor 类正是通过分析这些视觉元素,逆向推断出表格结构,从而实现结构化提取。

如何通过 C# 从 PDF 中提取表格

如果你需要快速预览表格数据(例如,开发调试或验证提取结果),可以直接通过控制台实时输出结果,无需生成额外文件,节省开发时间。

从 PDF 表格中提取数据的关键方法:

  • PdfDocument:表示一个 PDF 文件。
  • LoadFromFile:加载要处理的 PDF 文件。
  • PdfTableExtractor:基于视觉线索检测 PDF 中的表格。
  • ExtractTable(pageIndex):提取指定页码的所有表格,返回 PdfTable 数组。
  • GetRowCount()/GetColumnCount():检索每个表格的行数和列数。
  • GetText(rowIndex, columnIndex):从指定单元格中提取文本。
using Spire.Pdf;
using Spire.Pdf.Utilities;

namespace ExtractPdfTable
{
    class Program
    {
        static void Main(string[] args)
        {
            // 创建PdfDocument对象
            PdfDocument pdf = new PdfDocument();

            // 加载PDF文件
            pdf.LoadFromFile("表格.pdf");

            // 初始化PdfTableExtractor类的实例
            PdfTableExtractor extractor = new PdfTableExtractor(pdf);


            // 循环遍历页面
            for (int pageIndex = 0; pageIndex < pdf.Pages.Count; pageIndex++)
            {
                // 从特定页面提取表格
                PdfTable[] tableList = extractor.ExtractTable(pageIndex);

                // 判断表格列表是否为空
                if (tableList != null && tableList.Length > 0)
                {
                    int tableNumber = 1;
                    // 循环遍历列表中的表格
                    foreach (PdfTable table in tableList)
                    {
                        Console.WriteLine($"\n第 {pageIndex + 1} 页的第 {tableNumber} 个表格:");
                        Console.WriteLine("-----------------------------------");

                        // 获取特定表格的行数和列数
                        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);

                                // 将单元格文本打印到控制台并带有分隔符
                                Console.Write($"{text}\t");
                            }
                            // 每行后换行
                            Console.WriteLine();
                        }
                        tableNumber++;
                    }
                }
            }

            // 关闭文档
            pdf.Close();
        }
    }
}

适用场景

  • 快速调试或验证提取的数据。
  • 小型数据集预览。

输出: 检索 PDF 表格数据并输出到控制台

提取 PDF 表格数据

C# 提取 PDF 表格到 TXT 文本文件

对于轻量级的数据存档,将表格保存到文本文件是理想的选择。此方法使用 StringBuilder 高效地编译表格数据,保留换行符以提高可读性。

将 PDF 表格导出到 TXT 的主要优势:

  • 高效性:StringBuilder 优化文本拼接效率,减少内存占用。
  • 可读性:保留表格的行结构,用换行符\r\n分隔行,避免数据杂乱。
  • 兼容性:TXT 格式无平台限制,Windows、macOS、Linux 均可直接打开,无需依赖专用软件。
using Spire.Pdf;
using Spire.Pdf.Utilities;
using System.Text;

namespace ExtractTableToTxt
{
    class Program
    {
        static void Main(string[] args)
        {
            // 创建PdfDocument对象
            PdfDocument pdf = new PdfDocument();

            // 加载PDF文件
            pdf.LoadFromFile("表格.pdf");

            // 创建StringBuilder对象
            StringBuilder builder = new StringBuilder();

            // 初始化PdfTableExtractor类的实例
            PdfTableExtractor extractor = new PdfTableExtractor(pdf);

            // 声明PdfTable数组
            PdfTable[] tableList = null;

            // 循环遍历页面
            for (int pageIndex = 0; pageIndex < pdf.Pages.Count; pageIndex++)
            {
                // 从特定页面提取表格
                tableList = extractor.ExtractTable(pageIndex);

                // 判断表格列表是否为空
                if (tableList != null && tableList.Length > 0)
                {
                    // 循环遍历列表中的表格
                    foreach (PdfTable table in tableList)
                    {
                        // 获取特定表格的行数和列数
                        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);

                                // 将文本添加到字符串生成器
                                builder.Append(text + " ");
                            }
                            builder.Append("\r\n");
                        }
                    }
                }
            }

            // 写入.txt文件
            File.WriteAllText("提取PDF表格.txt", builder.ToString());
        }
    }
}

适用场景

  • 以轻量级、普遍可访问的格式存档表格数据。
  • 跨平台共享(所有设备均可打开 TXT)。
  • 简单脚本输入(如 PowerShell 后续处理)。

输出: 提取 PDF 表格数据并保存到文本文件。

提取 PDF 表格到 TXT 文本文件

扩展应用:对于VB.NET代码示例,请使用我们的 C#⇆VB.NET 转换器直接转换上述代码。

C# 将 PDF 表格导出为 CSV

CSV(逗号分隔值)是表格数据的行业标准,与 Excel、Google Sheets 和数据库兼容。此方法通过引用单元格和处理特殊字符,将提取的表格格式化为有效的 CSV 文件。

提取 PDF 表格到 CSV 的主要特点:

  • StreamWriter:增量写入数据到 CSV 文件,减少大型 PDF 文件的内存占用。
  • 特殊字符处理:按 CSV 标准转义单元格中的逗号和双引号,避免列错位。
  • 工具兼容:生成的 CSV 可直接用 Excel 打开,无需手动调整格式,减少后续操作成本。
  • 编码兼容:UTF-8 编码确保中文、特殊符号在 Excel 中正常显示(避免打开时乱码)。
using Spire.Pdf;
using Spire.Pdf.Utilities;
using System.Text;

namespace ExtractTableToCsv
{
    class Program
    {
        static void Main(string[] args)
        {
            // 创建PdfDocument对象
            PdfDocument pdf = new PdfDocument();

            // 加载PDF文件
            pdf.LoadFromFile("表格.pdf");

            // 创建StreamWriter对象以高效写入CSV
            using (StreamWriter csvWriter = new StreamWriter("PDF表格.csv", false, Encoding.UTF8))
            {
                // 创建PdfTableExtractor对象
                PdfTableExtractor extractor = new PdfTableExtractor(pdf);

                // 循环遍历页面
                for (int pageIndex = 0; pageIndex < pdf.Pages.Count; pageIndex++)
                {
                    // 从特定页面提取表格
                    PdfTable[] tableList = extractor.ExtractTable(pageIndex);

                    // 判断表格列表是否为空
                    if (tableList != null && tableList.Length > 0)
                    {
                        // 循环遍历列表中的表格
                        foreach (PdfTable table in tableList)
                        {
                            // 获取特定表格的行数和列数
                            int row = table.GetRowCount();
                            int column = table.GetColumnCount();

                            // 循环遍历行
                            for (int i = 0; i < row; i++)
                            {
                                // 创建列表存储数据
                                List<string> rowData = new List<string>();
                                // 循环遍历列
                                for (int j = 0; j < column; j++)
                                {
                                    // 从表格单元格检索文本
                                    string cellText = table.GetText(i, j).Replace("\"", "\"\"");
                                    // 将单元格文本添加到列表并用双引号括起来
                                    rowData.Add($"\"{cellText}\"");
                                }
                                // 用逗号连接单元格并写入CSV
                                csvWriter.WriteLine(string.Join(",", rowData));
                            }
                        }
                    }
                }
            }
        }
    }
}

适用场景

  • 数据分析(导入 Excel 进行计算)。
  • 将 PDF 表格迁移到数据库(导入 MySQL、SQL Server)。

输出: 解析 PDF 表格数据并导出到 CSV 文件。

提取 PDF 表格到 CSV 文件

推荐:与 Spire.XLS for .NET 集成,直接提取 PDF 表格到 Excel 文档。

结论

本文提供了三种在 C# 中提取 PDF 表格的有效方法。通过利用 Spire.PDF for .NET 库,开发者可以快速实现 PDF 表格的结构化提取,同时兼顾效率与兼容性。根据实际需求选择合适的导出格式,能大幅提升数据处理效率,减少人工录入成本。

如需进一步探索 PDF 处理功能(如 PDF 生成、水印添加、页面合并),可参考 Spire.PDF 官方文档;若需商业场景测试,可获取 30 天免费试用许可证

常见问题

问题 1:为什么使用 Spire.PDF for .NET 提取表格?

: Spire.PDF 提供了专用的 PdfTableExtractor 类,该类基于视觉提示(边框、间距和文本对齐)检测表格,简化了从 PDF 解析结构化数据的过程。

问题 2:Spire.PDF 能否从扫描 PDF 中提取表格?

: 不能。此.NET PDF 库仅支持文本型 PDF(文本可选中、复制)。对于扫描的 PDF,请使用 Spire.OCR (OCR 文字识别库)先提取文本,然后再解析表格。

问题 3:能否一次性从多个 PDF 中提取表格?

:可通过 Directory.GetFiles() 遍历文件夹中的所有 PDF,循环执行提取逻辑,示例代码如下:

string[] pdfFiles = Directory.GetFiles(@"C:\Invoices\", "*.pdf");
foreach (string file in pdfFiles)
{
// 表格提取的代码
}

问题 4:从大型 PDF 中提取表格时,如何提高性能?

: 对于大型 PDF(100 + 页),通过以下方式优化性能:

  • 分批处理页面,避免一次性加载整个 PDF。
  • 用 using 包裹 PdfDocument 和 PdfTableExtractor,确保处理完一批页面后立即释放内存。
  • 跳过没有表格的页面(using if (tableList == null || tableList.Length == 0))。

Spire.Office 6.11.2已发布。本次更新带来了一些新的功能,例如:Spire.XLS支持给数据栏设置边框的功能以及给折线图和面积图设置垂直线;Spire.Doc新增了两个方法;Spire.PDF支持获取附件所在的页码和转换线性化PDF;Spire.Presentation支持获取表格单元格的填充颜色。此外,该版本还修复了大量已知的问题。详情请阅读以下内容。

该版本涵盖了最新版的Spire.Doc, Spire.PDF, Spire.XLS, Spire.Presentation, Spire.Email, Spire.DocViewer, Spire.PDFViewer, Spire.Spreadsheet, Spire.OfficeViewer, Spire.DataExport, Spire.Barcode。

版本信息如下:

获取Spire.Office 6.11.2请点击:

https://www.e-iceblue.cn/Downloads/Spire-Office-NET.html


Spire.XLS

新功能:

问题修复:


Spire.PDF

新功能:

问题修复:


Spire.Doc

新功能:

问题修复:


Spire.Presentation

新功能:

问题修复:


Spire.Email

问题修复:

Spire.XLS 11.11.2已发布。该版本带来了一些新功能,如支持转换excel文件到pdf文件设置自定义纸张尺寸的问题,支持了给数据栏设置边框的功能以及给折线图和面积图设置垂直线的功能。此外还增强了Excel到HTML,Excel到PDF的转换功能,并且修复了MS Excel打开保存后的xlsx文件失败等已知问题。详情请阅读以下内容。

新功能:

问题修复:


下载Spire.XLS 11.11.2请点击:

https://www.e-iceblue.cn/Downloads/Spire-XLS-NET.html