利用Java提取PDF表格到文本、CSV及excel工作表

 更新时间:2024年09月26日 10:43:10   作者:Eiceblue  
如何精准地提取PDF格式中嵌入的表格数据,并将其无缝转换为更加易于分析和操作的形式,是一项重要的文档处理技巧,本文将介绍如何利用Java从PDF文档提取表格数据,并写入文本文件、CSV文件以及Excel工作表,需要的朋友可以参考下

引言

如何精准地提取PDF格式中嵌入的表格数据,并将其无缝转换为更加易于分析和操作的形式,如纯文本、CSV文件或Excel工作表,是一项重要的文档处理技巧。使用Java,我们可以简单地实现这一过程。本文将介绍如何利用Java从PDF文档提取表格数据,并写入文本文件、CSV文件以及Excel工作表。

本文所使用的方法提取PDF表格主要需要免费的Free Spire.PDF for Java库,可下载导入或通过Maven导入:

<dependency>
    <groupId>e-iceblue</groupId>
    <artifactId>spire.pdf.free</artifactId>
    <version>9.13.0</version>
</dependency>

提取PDF表格需要用到库中的PdfTableExtractor类。我们可以为载入的PDF文件创建PdfTableExtractor对象,然后使用PdfTableExtractor.extractTable()方法根据页面在文档中的参数提取指定PDF页面上所有表格,最后再使用PdfTable.getText()方法即可获取表格中的数据。以下是一般操作步骤示例:

  • 创建PdfDocument对象并使用PdfDocument.loadFromFile()方法载入PDF文档。
  • 使用载入的PDF文档创建PdfTableExtractor对象。
  • 使用PdfTableExtractor.extractTable()方法提取每个页面上的表格。
  • 使用PdfTable.getText()方法获取PDF表格的单元格数据。

使用上述方法获取表格数据后,我们就可以将其写入文本文件,或搭配其他工具制作CSV或Excel文件了。

提取PDF表格数据写入文本文件

使用PdfTableExtractor.extractTable()方法提取表格并使用PdfTable.getText()方法获取单元格数据后,我们可以通过构建字符串并写入文本文件来实现提取表格并保存为文本文件的目的。以下是详细操作步骤:

  1. 导入所需模块。
  2. 创建PdfDocument对象并使用PdfDocument.loadFromFile()方法载入PDF文档。
  3. 使用载入的PDF文档创建PdfTableExtractor对象。
  4. 遍历页面,使用PdfTableExtractor.extractTable()方法提取每个页面上的所有表格。
  5. 遍历提取到的表格,为每个表格创建一个StringBuilder对象。
  6. 遍历表格中的行和列,使用PdfTable.getText()方法获取每个单元格的数据并去除换行符。然后将单元格数据添加到StringBuilder对象。
  7. StringBuilder对象写入文本文件。
  8. 释放资源。

代码示例

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

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

public class 从PDF中提取文本 {
    public static void main(String[] args) throws IOException {
        // 创建一个PdfDocument对象
        PdfDocument pdf = new PdfDocument();
        // 加载一个PDF文档
        pdf.loadFromFile("Sample.pdf");

        // 创建一个PdfTableExtractor对象
        PdfTableExtractor extractor = new PdfTableExtractor(pdf);

        // 从每一页中提取表格
        for (int pageIndex = 0; pageIndex < pdf.getPages().getCount(); pageIndex++) {
            PdfTable[] tables = extractor.extractTable(pageIndex);
            // 如果表格不为空,则遍历表格
            if (tables != null) {
                for (int tableIndex = 0; tableIndex < tables.length; tableIndex++) {
                    PdfTable table = tables[tableIndex];
                    // 创建一个StringBuilder对象
                    StringBuilder tableText = new StringBuilder();
                    // 遍历行和列
                    for (int rowIndex = 0; rowIndex < table.getRowCount(); rowIndex++) {
                        for (int colIndex = 0; colIndex < table.getColumnCount(); colIndex++) {
                            // 获取单元格文本并移除换行符
                            String cellText = table.getText(rowIndex, colIndex);
                            cellText = cellText.replaceAll("\\r|\\n", "");
                            if (colIndex < table.getColumnCount() - 1) {
                                tableText.append(cellText).append("\t");
                            } else {
                                tableText.append(cellText).append("\n");
                            }
                        }
                    }
                    // 将表格写入文本文件
                    try (FileWriter writer = new FileWriter("output/Tables/Page" + (pageIndex+1) + "-Table" + (tableIndex+1) + ".txt")) {
                        writer.write(tableText.toString());
                    }
                }
            }
        }
    }
}

提取结果

提取PDF表格数据写入CSV文件

我们也可以用同样的方法提取表格数据,然后搭配其他模块,如opencsv,将提取到的数据写入CSV文件。也可以使用下面的提取PDF表格写入Excel文件,最后保存时保存为CSV文件。
opencsv:

<dependency>
  <groupId>com.opencsv</groupId>
  <artifactId>opencsv</artifactId>
  <version>5.9</version>
</dependency>

以下是搭配opencsv提取PDF表格数据并写入CSV文件的操作步骤:

  1. 导入所需模块。
  2. 创建PdfDocument对象并使用PdfDocument.loadFromFile()方法载入PDF文档。
  3. 使用载入的PDF文档创建PdfTableExtractor对象。
  4. 历页面面,使用PdfTableExtractor.extractTable()方法提取每个页面上的所有表格。
  5. 遍历提取的表格,并构建CSV文件名。
  6. 创建CSVWriter对象,遍历表格行以及行中的列,使用PdfTable.getText()方法获取每个单元格的数据并去除换行符,将提取的每行表格数据构建为字符串列表。最后将字符串列表写入为CSV数据行。
  7. 释放资源。

代码示例

import com.opencsv.CSVWriter;
import com.spire.pdf.PdfDocument;
import com.spire.pdf.utilities.PdfTable;
import com.spire.pdf.utilities.PdfTableExtractor;

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

public class 从PDF表格提取到CSV {
    public static void main(String[] args) throws IOException {
        // 创建一个PdfDocument对象
        PdfDocument pdf = new PdfDocument();
        // 加载一个PDF文档
        pdf.loadFromFile("Sample.pdf");

        // 创建一个PdfTableExtractor对象
        PdfTableExtractor extractor = new PdfTableExtractor(pdf);

        // 从每一页中提取表格
        for (int pageIndex = 0; pageIndex < pdf.getPages().getCount(); pageIndex++) {
            PdfTable[] tables = extractor.extractTable(pageIndex);
            // 如果表格不为空,则遍历表格
            if (tables != null) {
                for (int tableIndex = 0; tableIndex < tables.length; tableIndex++) {
                    PdfTable table = tables[tableIndex];
                    // 创建CSV文件名
                    String csvFileName = "output/Tables/Page" + (pageIndex + 1) + "-Table" + (tableIndex + 1) + ".csv";
                    // 创建一个CSVWriter对象
                    try (CSVWriter writer = new CSVWriter(new FileWriter(csvFileName))) {
                        // 遍历行和列
                        for (int rowIndex = 0; rowIndex < table.getRowCount(); rowIndex++) {
                            String[] row = new String[table.getColumnCount()];
                            for (int colIndex = 0; colIndex < table.getColumnCount(); colIndex++) {
                                // 获取单元格文本并移除换行符
                                String cellText = table.getText(rowIndex, colIndex).replaceAll("\\r?\\n", "");
                                row[colIndex] = cellText;
                            }
                            // 将行写入CSV文件
                            writer.writeNext(row);
                        }
                    }
                }
            }
        }
        // 关闭PDF文档
        pdf.close();
    }
}

提取结果

提取PDF表格数据写入Excel文件

保存PDF表格到表格需要用到Free Spire.XLS for Java。我们可以提取到PDF文档表格单元格数据后,使用Worksheet.getRange().setText()方法将数据写入到创建的Excel工作表的相应单元格并保存,从而实现PDF表格数据到Excel文件的提取。同时,我们还可以在保存文件时将格式参数设置为CSV,实现PDF表格数据到CSV文件的提取。
Free Spire.XLS for Java:

<dependency>
    <groupId>e-iceblue</groupId>
    <artifactId>spire.xls.free</artifactId>
    <version>5.3.0</version>
</dependency>

以下是详细操作步骤:

  1. 导入所需模块。
  2. 创建PdfDocument对象并使用PdfDocument.loadFromFile()方法载入PDF文档。
  3. 创建Workbook对象,并使用Workbook.getWorksheets().clear()方法清除默认工作表。
  4. 使用载入的PDF文档创建PdfTableExtractor对象。
  5. 历页面面,使用PdfTableExtractor.extractTable()方法提取每个页面上的所有表格。
  6. 遍历提取的表格,使用Workbook.getWorksheets().add()方法为每个表格创建一个指定名称的工作表。
  7. 遍历表格行和列,使用PdfTable.getText()方法获取每个单元格的数据并去除换行符,然后使用Worksheet.getRange().setText()方法将单元格数据写入到工作表的相应单元格。
  8. 设置工作表单元格的格式。
  9. 使用Worksheet.autoFitRow()Worksheet.autoFitColumn()方法自动调整行高和列宽。
  10. 可以使用Worksheet.saveToFile()方法将工作表保存为CSV文件。
  11. 使用Workbook.saveToFile()方法保存工作簿为Excel文件。
  12. 释放资源。

代码示例

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

public class 从PDF表格提取到Excel {
    public static void main(String[] args) {
        // 创建一个PdfDocument对象
        PdfDocument pdf = new PdfDocument();
        // 加载一个PDF文档
        pdf.loadFromFile("G:/Documents/Sample73.pdf");

        // 创建一个Workbook对象
        Workbook workbook = new Workbook();
        workbook.getWorksheets().clear();

        // 创建一个PdfTableExtractor对象
        PdfTableExtractor extractor = new PdfTableExtractor(pdf);

        // 从每一页中提取表格
        for (int pageIndex = 0; pageIndex < pdf.getPages().getCount(); pageIndex++) {
            PdfTable[] tables = extractor.extractTable(pageIndex);
            // 如果表格不为空,则遍历表格
            if (tables != null) {
                for (int tableIndex = 0; tableIndex < tables.length; tableIndex++) {
                    // 向工作簿中添加一个工作表
                    Worksheet sheet = workbook.getWorksheets().add("Page" + (pageIndex + 1) + "-Table" + (tableIndex + 1));
                    // 遍历表格中的行和列
                    for (int rowIndex = 0; rowIndex < tables[tableIndex].getRowCount(); rowIndex++) {
                        for (int colIndex = 0; colIndex < tables[tableIndex].getColumnCount(); colIndex++) {
                            // 获取单元格文本并移除换行符
                            String cellText = tables[tableIndex].getText(rowIndex, colIndex).replaceAll("\\r|\\n", "");
                            // 将单元格文本写入工作表
                            sheet.getCellRange(rowIndex+1, colIndex+1).setText(cellText);
                        }
                    }
                    // 设置单元格样式
                    CellRange[] rows = sheet.getRows();
                    rows[0].getStyle().getFont().setFontName("HarmonyOS Sans SC");
                    rows[0].getStyle().getFont().setSize(12);
                    rows[0].getStyle().getFont().isBold(true);
                    rows[0].getStyle().setHorizontalAlignment(HorizontalAlignType.Center);
                    for (int i = 1; i < rows.length; i++) {
                        rows[i].getStyle().getFont().setFontName("HarmonyOS Sans SC");
                        rows[i].getStyle().getFont().setSize(12);
                        rows[i].getStyle().setHorizontalAlignment(HorizontalAlignType.Left);
                    }
                    // 自动调整行和列
                    for (int i = 0; i < rows.length; i++) {
                        sheet.autoFitRow(i+1);
                    }
                    for (int i = 0; i < sheet.getColumns().length; i++) {
                        sheet.autoFitColumn(i+1);
                    }
                    // 保存工作表为CSV文件
                    // sheet.saveToFile("output/Tables/PDFTableToCSV-Page" + (pageIndex + 1) + "-Table" + (tableIndex + 1) + ".csv", ",");
                }
            }
        }

        // 保存工作簿
        workbook.saveToFile("output/PDFTableToExcel.xlsx");
        // 关闭PDF文档
        pdf.close();
        // 释放工作簿资源
        workbook.dispose();
    }
}

提取结果

本文演示了如何使用Java提取PDF表格数据写入文本、CSV以及Excel文件。

以上就是利用Java提取PDF表格到文本、CSV及excel工作表的详细内容,更多关于Java提取PDF表格的资料请关注脚本之家其它相关文章!

相关文章

  • Java如何找出数组中重复的数字

    Java如何找出数组中重复的数字

    这篇文章主要为大家详细介绍了Java如何找出数组中重复的数字,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08
  • 完美解决gson将Integer默认转换成Double的问题

    完美解决gson将Integer默认转换成Double的问题

    下面小编就为大家带来一篇完美解决gson将Integer默认转换成Double的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • Java Rabbitmq中四种集群架构的区别详解

    Java Rabbitmq中四种集群架构的区别详解

    这篇文章主要为大家详细介绍了Java Rabbitmq中四种集群架构的区别,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-02-02
  • 详解Java类型擦除机制

    详解Java类型擦除机制

    Java泛型是JDK 5引入的一个特性,它允许我们定义类和接口的时候使用参数类型,泛型在集合框架中被广泛使用。这篇文章主要介绍了Java类型擦除机制,需要的朋友可以参考下
    2019-07-07
  • Windows10安装IDEA 2020.1.2的方法步骤

    Windows10安装IDEA 2020.1.2的方法步骤

    这篇文章主要介绍了Windows10安装IDEA 2020.1.2的方法步骤,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • 快速上手Java单元测试框架JUnit5

    快速上手Java单元测试框架JUnit5

    今天给大家带来的是关于Java单元测试的相关知识,文章围绕着Java单元测试框架JUnit5展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06
  • Spring Security中的CORS详解

    Spring Security中的CORS详解

    CORS(Cross-Origin Resource Sharing)是一种允许不同源之间进行资源共享的W3C标准,它通过在服务器端设置特定的HTTP响应头,实现了跨域请求的功能,这种机制要求浏览器和服务器的支持,本文给大家介绍Spring Security中的CORS,感兴趣的朋友一起看看吧
    2024-10-10
  • java实现微信扫码支付功能

    java实现微信扫码支付功能

    这篇文章主要为大家详细介绍了java实现微信扫码支付功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-07-07
  • Springboot系列之kafka操作使用详解

    Springboot系列之kafka操作使用详解

    这篇文章主要为大家介绍了Springboot系列之kafka操作使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • SPRING IOC注入方式过程解析

    SPRING IOC注入方式过程解析

    这篇文章主要介绍了SPRING IOC注入方式过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01

最新评论