找回密码
 立即注册
首页 业界区 安全 【2026 最新教程】Java 自动化提取 PDF 表格:从文本到 ...

【2026 最新教程】Java 自动化提取 PDF 表格:从文本到 Excel/CSV 的全场景实现

滕佩杉 2026-1-15 10:25:07
随着企业数据自动化的需求日益激增,提取 PDF 中的表格的需求也越来越受到重视。尽管此前我们就发布过使用 Java 提取 PDF 中的表格,并保存为 Text 文件的教程,但显然,简单的文本提取难以满足复杂的数据分析场景。
在处理财务报表、供应链清单等结构化文档时,开发者不仅需要获取数据,更需要保留其逻辑结构。本文将基于最新的 Spire.PDF for Java,展示如何精准地将 PDF 表格转换为文本、CSV 以及 Excel 格式,实现全场景的数据自动化提取。
环境准备

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

  • JDK 支持:推荐使用 JDK 8 及以上版本。
  • Maven 依赖:在 pom.xml 文件中配置以下仓库和依赖,以获取最新的组件支持。
  1. <repositories>
  2.     <repository>
  3.         <id>com.e-iceblue</id>
  4.         <name>e-iceblue</name>
  5.         <url>https://repo.e-iceblue.cn/repository/maven-public/</url>
  6.     </repository>
  7. </repositories>
  8. <dependencies>
  9.     <dependency>
  10.         <groupId>e-iceblue</groupId>
  11.         spire.pdf</artifactId>
  12.         <version>11.12.16</version>
  13.     </dependency>
  14. </dependencies>
复制代码
或导航到 Spire.PDF for Java 的官方网站下载安装包,解压后将 jar 文件手动导入到项目中。
基础提取:将 PDF 表格转为文本

作为入门级方案,将 PDF 中的表格提取为文本适用于对格式要求不高、仅需获取原始信息的场景。
技术逻辑:利用 PdfTableExtractor 识别表格,通过遍历单元格获取字符串。
  1. import com.spire.pdf.*;
  2. import com.spire.pdf.utilities.PdfTable;
  3. import com.spire.pdf.utilities.PdfTableExtractor;
  4. import java.io.FileWriter;
  5. import java.io.IOException;
  6. public class ExtractTable {
  7.     public static void main(String[] args)throws IOException {
  8.         // 实例化PdfDocument类的对象
  9.         PdfDocument pdf = new PdfDocument();
  10.         // 加载PDF文档
  11.         pdf.loadFromFile("E:/Administrator/Python1/input/项目进度.pdf");
  12.         // 创建StringBuilder类的实例
  13.         StringBuilder builder = new StringBuilder();
  14.         // 创建PdfTableExtractor类的对象
  15.         PdfTableExtractor extractor = new PdfTableExtractor(pdf);
  16.         // 遍历每一页
  17.         for (int page = 0; page < pdf.getPages().getCount(); page++)
  18.         {
  19.             // 提取页面中的表格存入PdfTable[]数组
  20.             PdfTable[] tableLists = extractor.extractTable(page);
  21.             if (tableLists != null && tableLists.length > 0)
  22.             {
  23.                 //遍历表格
  24.                 for (PdfTable table : tableLists)
  25.                 {
  26.                     int row = table.getRowCount();//获取表格行
  27.                     int column = table.getColumnCount();//获取表格列
  28.                     for (int i = 0; i < row; i++)
  29.                     {
  30.                         for (int j = 0; j < column; j++)
  31.                         {
  32.                             // 获取表格中的文本内容
  33.                             String text = table.getText(i, j);
  34.                             // 将获取的text写入StringBuilder容器
  35.                             builder.append(text+" ");
  36.                         }
  37.                         builder.append("\r\n");
  38.                     }
  39.                 }
  40.             }
  41.         }
  42.         // 保存为txt文档
  43.         FileWriter fileWriter = new FileWriter("E:/Administrator/Python1/output/提取表格为文本.txt");
  44.         fileWriter.write(builder.toString());
  45.         fileWriter.flush();
  46.         fileWriter.close();
  47.     }
  48. }
复制代码
源文件与输出文件对比图:
1.png

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

虽然保存为文本格式能够快速获取内容,但在面对需要二次计算或数据入库的场景时,将 PDF 表格导出为 CSV 是一种更合适的选择。CSV 格式通用性很高,几乎可以被所有的主流数据库系统、数据分析工具以及编程语言无差识别,是构建自动化数据流转链路的理想中间格式。它不仅写入速度极快,且内存开销低,尤其适合后端批量处理任务。
技术逻辑:CSV(逗号分隔值)是结构化数据的标准格式。我们通过 PdfTableExtractor 获取表格数据后,通过代码控制逗号分隔符输出。
  1. import com.spire.pdf.*;  
  2. import com.spire.pdf.utilities.*;  
  3.   
  4. import java.io.*;  
  5.   
  6. public class ExtractTable {  
  7.     public static void main(String[] args) throws Exception {  
  8.         // 1. 加载 PDF 文档  
  9.         PdfDocument pdf = new PdfDocument();  
  10.         // 请确保路径正确  
  11.         pdf.loadFromFile("E:/Administrator/Python1/input/项目进度.pdf");  
  12.   
  13.         // 用于存储提取文本的 StringBuilder        StringBuilder sb = new StringBuilder();  
  14.   
  15.         // 2. 遍历每一页并提取表格  
  16.         for (int i = 0; i < pdf.getPages().getCount(); i++) {  
  17.             PdfTableExtractor extractor = new PdfTableExtractor(pdf);  
  18.             PdfTable[] tableLists = extractor.extractTable(i);  
  19.   
  20.             if (tableLists != null) {  
  21.                 for (PdfTable table : tableLists) {  
  22.                     for (int row = 0; row < table.getRowCount(); row++) {  
  23.                         for (int col = 0; col < table.getColumnCount(); col++) {  
  24.                             // 使用工具方法处理 CSV 特殊字符和换行  
  25.                             String cellText = escapeCsvField(table.getText(row, col));  
  26.                             sb.append(cellText);  
  27.   
  28.                             // 列之间用逗号分隔  
  29.                             if (col < table.getColumnCount() - 1) {  
  30.                                 sb.append(",");  
  31.                             }  
  32.                         }  
  33.                         // 行之间用换行符分隔  
  34.                         sb.append("\n");  
  35.                     }  
  36.                 }  
  37.             }  
  38.         }  
  39.   
  40.         // 3. 写入带 BOM 的 CSV 文件  
  41.         File outFile = new File("E:/Administrator/Python1/output/提取表格为csv.csv");  
  42.   
  43.         // 确保输出目录存在  
  44.         if (!outFile.getParentFile().exists()) {  
  45.             outFile.getParentFile().mkdirs();  
  46.         }  
  47.   
  48.         try (FileOutputStream fos = new FileOutputStream(outFile)) {  
  49.             // 【核心修复】写入 UTF-8 BOM 字节,防止 Excel 打开乱码  
  50.             fos.write(0xEF);  
  51.             fos.write(0xBB);  
  52.             fos.write(0xBF);  
  53.   
  54.             // 使用 UTF-8 编码包装输出流  
  55.             try (Writer writer = new OutputStreamWriter(fos, "UTF-8")) {  
  56.                 writer.write(sb.toString());  
  57.             }  
  58.         }  
  59.   
  60.         pdf.close();  
  61.         System.out.println("PDF 表格已成功导出为 CSV 文件。");  
  62.     }  
  63.   
  64.     /**  
  65.      * 处理 CSV 字段的工具方法:  
  66.      * 1. 去除单元格内的换行符  
  67.      * 2. 转义双引号  
  68.      * 3. 对包含特殊字符的字段添加双引号包裹  
  69.      */  
  70.     private static String escapeCsvField(String text) {  
  71.         if (text == null) return "";  
  72.   
  73.         // 去掉单元格内的换行符(防止破坏 CSV 行结构)  
  74.         text = text.replaceAll("[\\n\\r]", " ");  
  75.   
  76.         // 处理特殊字符  
  77.         boolean containsSpecialChar = text.contains(",") || text.contains(";") ||  
  78.                 text.contains(""") || text.contains("\n");  
  79.   
  80.         if (containsSpecialChar) {  
  81.             // 转义双引号:将 " 替换为 ""            text = text.replace(""", """");  
  82.             // 整个字段用双引号包裹  
  83.             text = """ + text + """;  
  84.         }  
  85.   
  86.         return text.trim();  
  87.     }  
  88. }
复制代码
结果文件示意图:
2.png

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

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

  • 加载源 PDF 文档。
  • 遍历读取 PDF 中的表格单元格和数据。
  • 将数据填入 Excel 单元格中。
  • 设置 Excel 单元格(可选步骤)。
  • 调用 saveToFile 并指定 FileFormat.XLSX。
  1. import com.spire.pdf.PdfDocument;  
  2. import com.spire.pdf.utilities.PdfTable;  
  3. import com.spire.pdf.utilities.PdfTableExtractor;  
  4. import com.spire.xls.ExcelVersion;  
  5. import com.spire.xls.Workbook;  
  6. import com.spire.xls.Worksheet;  
  7.   
  8. public class ExtractTable {  
  9.   
  10.     public static void main(String[] args) {  
  11.   
  12.         //加载示例PDF文档  
  13.         PdfDocument pdf = new PdfDocument("E:/Administrator/Python1/input/项目进度.pdf");  
  14.         //创建一个PdfTableExtractor实例  
  15.         PdfTableExtractor extractor = new PdfTableExtractor(pdf);  
  16.         //从第一页提取表格  
  17.         PdfTable[] pdfTables  = extractor.extractTable(0);  
  18.         //创建一个工作簿对象  
  19.         Workbook wb = new Workbook();  
  20.         //删除默认工作表  
  21.         wb.getWorksheets().clear();  
  22.         //如果找到任何表格  
  23.         if (pdfTables != null && pdfTables.length > 0) {  
  24.             //循环遍历表格  
  25.             for (int tableNum = 0; tableNum < pdfTables.length; tableNum++) {  
  26.                 //将工作表添加到工作簿  
  27.                 String sheetName = String.format("Table - %d", tableNum + 1);  
  28.                 Worksheet sheet = wb.getWorksheets().add(sheetName);  
  29.                 //循环遍历当前表格中的行  
  30.                 for (int rowNum = 0; rowNum < pdfTables[tableNum].getRowCount(); rowNum++) {  
  31.                     //循环遍历当前表格中的列  
  32.                     for (int colNum = 0; colNum < pdfTables[tableNum].getColumnCount(); colNum++) {  
  33.                         //从当前表格单元格中提取数据  
  34.                         String text = pdfTables[tableNum].getText(rowNum, colNum);  
  35.                         //将数据插入特定单元格  
  36.                         sheet.get(rowNum + 1, colNum + 1).setText(text);  
  37.                     }  
  38.                 }  
  39.                 //自动调整列宽  
  40.                 for (int sheetColNum = 0; sheetColNum < sheet.getColumns().length; sheetColNum++) {  
  41.                     sheet.autoFitColumn(sheetColNum + 1);  
  42.                 }  
  43.             }  
  44.         }  
  45.         //将工作簿保存为 Excel 文件  
  46.         wb.saveToFile("E:/Administrator/Python1/output/提取表格为excel.xlsx", ExcelVersion.Version2016);  
  47.     }  
  48. }
复制代码
效果展示
3.png

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

在实际业务中,我们常遇到长篇合同或大型清单,同一个表格被拆分到两个或多个物理页面。这种情况单纯依靠循环提取会导致数据断层。那么如何识别第二页顶部的表格是第一页末尾表格的延续?如何自动合并表头?
针对此类涉及坐标逻辑判断的高阶需求,我们准备了详细的进阶教程。感兴趣的话可以查看官网教程如何在 Java 中将 PDF 转换为 CSV(轻松提取 PDF 表格)
总结与技术支持

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

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

2026-1-17 21:40:53

举报

2026-1-18 21:47:37

举报

您需要登录后才可以回帖 登录 | 立即注册