Java實(shí)現(xiàn)PDF表格轉(zhuǎn)換為CSV的示例代碼
在很多企業(yè)辦公和數(shù)據(jù)分析的場(chǎng)景中,PDF 中常常存放著報(bào)表、清單或統(tǒng)計(jì)數(shù)據(jù)。相比 PDF,CSV 文件 更易于在 Excel 或數(shù)據(jù)庫(kù)中進(jìn)行進(jìn)一步處理。因此,我們常常需要一種方式,將 PDF 中的表格數(shù)據(jù)批量抽取并導(dǎo)出為 CSV 文件。
本文將介紹如何借助 Free Spire.PDF for Java,在 Java 程序中完成 PDF 表格到 CSV 的自動(dòng)轉(zhuǎn)換。
環(huán)境準(zhǔn)備
在項(xiàng)目中引入 Free Spire.PDF for Java,可以通過(guò) 下載 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 表格導(dǎo)出為 CSV:完整流程
通過(guò) Java 程序結(jié)合 Free Spire.PDF,可以實(shí)現(xiàn)從 加載 PDF、提取表格、到生成 CSV 文件 的完整自動(dòng)化流程,下面我們將詳細(xì)介紹如何實(shí)現(xiàn)這個(gè)自動(dòng)化流程。
Step 1: 加載 PDF 文檔
首先,創(chuàng)建 PdfDocument 對(duì)象并加載需要處理的 PDF 文件:
import com.spire.pdf.*;
PdfDocument pdf = new PdfDocument();
pdf.loadFromFile("Sample.pdf");
Step 2: 提取 PDF 表格數(shù)據(jù)
Spire.PDF 提供 PdfTableExtractor 類來(lái)專門識(shí)別表格。
我們識(shí)別指定 PDF 頁(yè)面中的指定表格,然后逐行逐列讀取表格內(nèi)容,并用 StringBuilder 拼接為 CSV 格式。
import com.spire.pdf.utilities.*;
import java.io.*;
StringBuilder sb = new StringBuilder();
PdfTableExtractor extractor = new PdfTableExtractor(pdf);
// 提取第一頁(yè)的表格
PdfTable[] tables = extractor.extractTable(0);
if (tables != null) {
// 獲取第一個(gè)表格
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");
}
}
這里我們還需要一個(gè)工具方法來(lái)處理 CSV 中的特殊字符(如逗號(hào)、引號(hào)):
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 文件
將拼接好的字符串寫入文件,最終得到一個(gè)標(biāo)準(zhǔn)的 CSV:
try (Writer writer = new OutputStreamWriter(
new FileOutputStream("output/PDFTable.csv"), "UTF-8")) {
writer.write(sb.toString());
}
pdf.close();
System.out.println("PDF 表格已成功導(dǎo)出為 CSV。");
PDF轉(zhuǎn)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 表格已成功導(dǎo)出為 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;
}
}
轉(zhuǎn)換結(jié)果示例:

進(jìn)階擴(kuò)展
上面的示例將 所有表格合并到一個(gè) CSV 文件 中。在實(shí)際業(yè)務(wù)中,我們還可能有不同的需求:
1. 每個(gè)表格單獨(dú)保存
如果 PDF 每頁(yè)包含多個(gè)表格,可以為每個(gè)表格生成獨(dú)立的 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());
}
}
}
}
這樣,每個(gè)表格會(huì)被單獨(dú)導(dǎo)出,命名為 Page0_Table0.csv 等。
2. 合并所有表格到一個(gè)文件
有時(shí)我們不想把每個(gè)表格拆開保存,而是希望把整份 PDF 中的表格內(nèi)容都匯總到同一個(gè) CSV 文件中,方便統(tǒng)一分析。下面的示例展示了如何實(shí)現(xiàn):
// 用于合并所有跨頁(yè)表格的內(nèi)容
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");
}
}
}
}
// 統(tǒng)一寫入一個(gè) CSV 文件
try (Writer writer = new OutputStreamWriter(
new FileOutputStream("output/MergedTable.csv"), "UTF-8")) {
writer.write(mergedTableContent.toString());
}
運(yùn)行后,PDF 中的所有表格會(huì)被逐一讀取并寫入 同一個(gè) CSV 文件,文件路徑為 output/MergedTables.csv。
總結(jié)
本文介紹了如何在 Java 中使用 Free Spire.PDF for Java 將 PDF 中的表格內(nèi)容導(dǎo)出為 CSV 文件。整體流程分為:
- 加載 PDF 文檔
- 提取表格數(shù)據(jù)
- 寫入 CSV 文件
并擴(kuò)展了 分表導(dǎo)出 與 合并導(dǎo)出 兩種常見應(yīng)用場(chǎng)景。
這種方式可以高效處理 PDF 報(bào)表、財(cái)務(wù)清單、問(wèn)卷統(tǒng)計(jì)等數(shù)據(jù),極大減少人工操作的工作量。
到此這篇關(guān)于Java實(shí)現(xiàn)PDF表格轉(zhuǎn)換為CSV的示例代碼的文章就介紹到這了,更多相關(guān)Java PDF表格轉(zhuǎn)CSV內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot項(xiàng)目集成第三方CAS-client jar包的方法
本文介紹了SpringBoot中集成第三方CAS-clientjar包的兩種核心方式,涵蓋了從背景原理到實(shí)操步驟、依賴沖突解決、打包配置及常見問(wèn)題排查的全面內(nèi)容,通過(guò)對(duì)比兩種集成方式,提出了選型建議,并強(qiáng)調(diào)了依賴管理的規(guī)范性,為實(shí)際項(xiàng)目開發(fā)提供了全面指導(dǎo),感興趣的朋友一起看看吧2025-12-12
XXL-Job端口額外占用問(wèn)題的解決方法小結(jié)
最近博主在Spring整合XXL-JOB到項(xiàng)目時(shí)發(fā)現(xiàn)了個(gè)問(wèn)題,注冊(cè)執(zhí)行器需要額外占用端口,也就是我們每啟動(dòng)一個(gè)程序,除了程序本身的API端口外,還需要額外開放一個(gè)執(zhí)行器端口,所以本文給大家分享了XXL-Job端口額外占用問(wèn)題的解決方法小結(jié),需要的朋友可以參考下2024-05-05
MyBatis-Plus中靜態(tài)工具Db的多種用法及實(shí)例分析
本文將詳細(xì)講解MyBatis-Plus中靜態(tài)工具Db的各種用法,并結(jié)合具體案例進(jìn)行演示和說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-03-03
詳解Java Fibonacci Search斐波那契搜索算法代碼實(shí)現(xiàn)
這篇文章主要介紹了詳解Java Fibonacci Search斐波那契搜索算法代碼實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10

