希索家 發表於 2025-9-1 16:11:00

国产化PDF处理控件Spire.PDF教程:在 Java 中将 PDF 转换为 CSV(轻松提取 PDF 表格)

<p><img src="https://image.evget.com/attachment/keditor/image/20250901/141213_2.png"></p>
<p>在处理以 PDF 格式存储的报告、发票或数据集时,开发人员常常需要在电子表格、数据库或分析工具中复用其中的表格数据。一个常见的解决方案是&nbsp;<strong>使用 Java 将 PDF 转换为 CSV</strong>,因为 CSV 文件轻量、结构化,并且几乎在所有平台上都兼容。与文本或图片导出不同,PDF 转 CSV 的核心是&nbsp;<strong>从 PDF 中提取表格并保存为 CSV</strong>。</p>
<p><em><strong>E</strong></em><em><strong>-iceblue</strong>旗下<strong>S</strong><strong>pire</strong><strong>系列产品</strong>,是文档处理领域的佼佼者,<strong>支持国产化信创</strong>。</em>借助&nbsp;<strong><u>Spire.PDF for Java</u></strong>,可以检测 PDF 中的表格结构,并通过少量代码实现自动化导出。本文将逐步讲解如何借助<strong><u>Spire.PDF for Java&nbsp;</u></strong>在&nbsp;<strong>Java 中完成 PDF 到 CSV 的转换</strong>——从环境搭建,到表格提取,再到处理多页文档或单页多表等复杂情况。</p>
<p style="text-align: center"><span style="color: rgba(230, 126, 35, 1)"><strong>Spire.PDF for Java免费试用下载,请联系E-iceblue官方授权代理商慧都科技</strong></span></p>
<p style="text-align: center"><span style="color: rgba(230, 126, 35, 1)"><strong><em>加入Spire技术交流QQ群(125237868),与更多开发者一起提升文档开发技能。</em></strong></span></p>
<h2>Java PDF 转 CSV 的环境搭建</h2>
<p>在使用 Java 提取表格并转换为 CSV 之前,需要先搭建开发环境。这包括选择合适的库并将其添加到项目中。</p>
<h3>为什么选择 Spire.PDF for Java</h3>
<p>由于 PDF 文件本身不支持直接导出为 CSV,因此通过代码提取表格是更现实的做法。<strong>Spire.PDF for Java</strong><strong>&nbsp;</strong>提供了检测 PDF 文档中表格结构并直接保存为 CSV 的 API,使转换过程更简单高效。</p>
<h3>安装 Spire.PDF for Java</h3>
<p>如果使用 Maven,可以添加以下配置:</p>
<pre class="prettyprint lang-xml highlighter-hljs"><code>&lt;repositories&gt;
    &lt;repository&gt;
      &lt;id&gt;com.e-iceblue&lt;/id&gt;
      &lt;name&gt;e-iceblue&lt;/name&gt;
      &lt;url&gt;https://repo.e-iceblue.cn/repository/maven-public/&lt;/url&gt;
    &lt;/repository&gt;
&lt;/repositories&gt;
&lt;dependencies&gt;
    &lt;dependency&gt;
      &lt;groupId&gt;e-iceblue&lt;/groupId&gt;
      &lt;artifactId&gt;spire.pdf&lt;/artifactId&gt;
      &lt;version&gt;11.8.3&lt;/version&gt;
    &lt;/dependency&gt;
&lt;/dependencies&gt;</code></pre>
<p>如果没有使用 Maven,可以直接&nbsp;<strong><u>下载 Spire.PDF for Java 安装包</u></strong>,并将 JAR 文件添加到项目的 classpath 中。</p>
<p style="text-align: center"><span style="color: rgba(230, 126, 35, 1)"><strong>Spire.PDF for Java免费试用下载,请联系E-iceblue官方授权代理商慧都科技</strong></span></p>
<p style="text-align: center"><span style="color: rgba(230, 126, 35, 1)"><strong><em>加入Spire技术交流QQ群(125237868),与更多开发者一起提升文档开发技能。</em></strong></span></p>
<h2>从 PDF 提取表格并保存为 CSV</h2>
<p>将 PDF 转换为 CSV 最实用的方法就是表格提取。使用&nbsp;<strong><u>Spire.PDF for Java</u></strong>,可以通过以下步骤完成:</p>
<ol>
<li>加载 PDF 文档</li>
<li>使用&nbsp;<strong>PdfTableExtractor</strong>&nbsp;检测页面中的表格</li>
<li>按行收集单元格内容</li>
<li>将结果写入 CSV 文件</li>
</ol>
<p>下面的 Java 示例展示了完整的转换流程:</p>
<h3>Java 示例代码:PDF 转换为 CSV</h3>
<pre class="prettyprint lang-java highlighter-hljs"><code>import com.spire.pdf.*;
import com.spire.pdf.utilities.*;

import java.io.*;

public class PdfToCsvExample {
    public static void main(String[] args) throws Exception {
      // 加载 PDF 文档
      PdfDocument pdf = new PdfDocument();
      pdf.loadFromFile("Sample.pdf");

      // 用于存储提取文本的 StringBuilder
      StringBuilder sb = new StringBuilder();

      // 遍历每一页
      for (int i = 0; i &lt; 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 &lt; table.getRowCount(); row++) {
                        for (int col = 0; col &lt; table.getColumnCount(); col++) {
                            // 安全处理 CSV 字段
                            String cellText = escapeCsvField(table.getText(row, col));
                            sb.append(cellText);

                            if (col &lt; table.getColumnCount() - 1) {
                              sb.append(",");
                            }
                        }
                        sb.append("\n");
                  }
                }
            }
      }

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

      pdf.close();
      System.out.println("PDF 表格已成功导出为 CSV。");
    }

    // 处理 CSV 字段的工具方法
    private static String escapeCsvField(String text) {
      if (text == null) return "";

      // 去掉换行
      text = text.replaceAll("[\\n\\r]", "");

      // 特殊字符处理
      if (text.contains(",") || text.contains(";") || text.contains("\"") || text.contains("\n")) {
            text = text.replace("\"", "\"\"");// 转义双引号
            text = "\"" + text + "\"";          // 添加引号
      }

      return text;
    }
}</code></pre>
<h3>代码讲解</h3>
<ul>
<li><strong>PdfDocument</strong>:将 PDF 文件加载到内存</li>
<li><strong>PdfTableExtractor</strong>:逐页检测表格</li>
<li><strong>PdfTable</strong>:提供对行和列的访问</li>
<li><strong>escapeCsvField()</strong>:去掉换行并处理特殊字符</li>
<li><strong>StringBuilder</strong>:拼接单元格内容,使用逗号分隔</li>
<li>最终结果写入 Output.csv,可直接在 Excel 或任意编辑器中打开</li>
</ul>
<p>运行代码后生成的 CSV 文件示例:</p>
<p><img src="https://image.evget.com/attachment/keditor/image/20250901/141631_2.png"></p>
<p style="text-align: center"><span style="color: rgba(230, 126, 35, 1)"><strong>Spire.PDF for Java免费试用下载,请联系E-iceblue官方授权代理商慧都科技</strong></span></p>
<p style="text-align: center"><span style="color: rgba(230, 126, 35, 1)"><strong><em>加入Spire技术交流QQ群(125237868),与更多开发者一起提升文档开发技能。</em></strong></span></p>
<h2>处理复杂的 PDF 转 CSV 场景</h2>
<p>实际应用中,PDF 文件常常包含多个表格、跨多页,或表格结构不规则。下面介绍如何应对这些情况。</p>
<h3>1. 单页包含多个表格</h3>
<p><strong>extractTable(i)</strong>&nbsp;返回的&nbsp;<strong>PdfTable[]</strong>&nbsp;包含该页中检测到的所有表格,可以将每个表单独保存为不同的 CSV 文件:</p>
<pre class="prettyprint lang-js highlighter-hljs"><code>for (int i = 0; i &lt; pdf.getPages().getCount(); i++) {
    PdfTableExtractor extractor = new PdfTableExtractor(pdf);
    PdfTable[] tableLists = extractor.extractTable(i);

    if (tableLists != null) {
      for (int t = 0; t &lt; tableLists.length; t++) {
            PdfTable table = tableLists;
            StringBuilder tableContent = new StringBuilder();

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

            try (Writer writer = new OutputStreamWriter(
                  new FileOutputStream("output/Tables/Table_Page" + i + "_Index" + t + ".csv"), "UTF-8")) {
                writer.write(sb.toString());
            }
      }
    }
}</code></pre>
<p>示例:将单页的多个表格导出为独立 CSV 文件:</p>
<p><img src="https://image.evget.com/attachment/keditor/image/20250901/141803_5.png"></p>
<h3>2. 跨页或大表格</h3>
<p>如果表格跨越多页,可以逐页提取并&nbsp;<strong>追加写入</strong>,以避免覆盖:</p>
<pre class="prettyprint lang-java highlighter-hljs"><code>StringBuilder sb = new StringBuilder();

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

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

FileWriter writer = new FileWriter("MergedTables.csv");
writer.write(sb.toString());
writer.close();</code></pre>
<p>示例:将跨多页的大表格合并为一个 CSV 文件:</p>
<p><img src="https://image.evget.com/attachment/keditor/image/20250901/142201_7.png"></p>
<h3>3. 格式限制</h3>
<p>CSV 只能存储纯文本,像合并单元格、字体、图片等格式会丢失。如果需要保留样式,可以导出为 Excel(.xlsx)。</p>
<h3>4. CSV 特殊字符处理</h3>
<p>在写入 CSV 时,逗号、分号、双引号、换行等特殊字符可能会破坏文件结构。 上述 Java 示例中的&nbsp;<strong>escapeCsvField</strong>&nbsp;方法可以去除换行并安全转义。</p>
<p>更复杂的场景下,可以使用&nbsp;<strong><u>Spire.XLS for Java</u></strong><strong><u>,</u></strong>通过简单的&nbsp;Java 代码将表格数据写入 Excel,再将&nbsp;Excel 工作表保存为 CSV,无需手动处理特殊字符。</p>
<h2>总结</h2>
<p>在 Java 中将 PDF 转换为 CSV,本质上就是&nbsp;<strong>提取表格并保存为结构化格式</strong>。CSV 文件轻量、通用,非常适合存储和分析表格数据。通过搭建<strong>&nbsp;Spire.PDF for Java&nbsp;</strong>环境并参考本文示例代码,即可实现自动化转换,减少手动操作并提高效率。</p>
<h2>常见问题</h2>
<h3>Q: 可以把 PDF 转换为 CSV 吗?</h3>
<p>A: 可以。虽然图片和带格式的文本无法导出,但表格数据可以提取并保存为 CSV。</p>
<h3>Q: 如何在 Java 中从 PDF 提取数据</h3>
<p>A: 使用&nbsp;<strong><u>Spire.PDF for Java&nbsp;</u></strong>等 PDF 库,可以解析文档、检测表格并导出为 CSV 或 Excel。</p>
<h3>Q: 最好的 PDF 转 CSV 工具是什么?</h3>
<p>A: 对于 Java 开发者来说,<strong><u>Spire.PDF for Java</u></strong>&nbsp;等代码级解决方案比手动转换工具更灵活高效。</p>
<h3>Q: 如何使用 Java 将 PDF 转换为 Excel?</h3>
<p>A: 步骤与导出 CSV 类似,不同之处在于将数据保存为 Excel 格式,以便支持更多功能。</p>
<p style="text-align: center"><span style="color: rgba(230, 126, 35, 1)"><strong>Spire.PDF for Java免费试用下载,请联系E-iceblue官方授权代理商慧都科技</strong></span></p>
<p style="text-align: center"><span style="color: rgba(230, 126, 35, 1)"><strong><em>加入Spire技术交流QQ群(125237868),与更多开发者一起提升文档开发技能。</em></strong></span></p><br><br>
来源:https://www.cnblogs.com/software-Development/p/19068432
頁: [1]
查看完整版本: 国产化PDF处理控件Spire.PDF教程:在 Java 中将 PDF 转换为 CSV(轻松提取 PDF 表格)