如何精准地提取PDF格式中嵌入的表格数据,并将其无缝转换为更加易于分析和操作的形式,如纯文本、CSV文件或Excel工作表,是一项重要的文档处理技巧。使用Java,我们可以简单地实现这一过程。本文将介绍如何利用Java从PDF文档提取表格数据,并写入文本文件、CSV文件以及Excel工作表。
文章目录
- 提取PDF表格数据写入文本文件
- 提取PDF表格数据写入CSV文件
- 提取PDF表格数据写入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()
方法获取单元格数据后,我们可以通过构建字符串并写入文本文件来实现提取表格并保存为文本文件的目的。以下是详细操作步骤:
- 导入所需模块。
- 创建
PdfDocument
对象并使用PdfDocument.loadFromFile()
方法载入PDF文档。 - 使用载入的PDF文档创建
PdfTableExtractor
对象。 - 遍历页面,使用
PdfTableExtractor.extractTable()
方法提取每个页面上的所有表格。 - 遍历提取到的表格,为每个表格创建一个
StringBuilder
对象。 - 遍历表格中的行和列,使用
PdfTable.getText()
方法获取每个单元格的数据并去除换行符。然后将单元格数据添加到StringBuilder
对象。 - 将
StringBuilder
对象写入文本文件。 - 释放资源。
代码示例
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文件的操作步骤:
- 导入所需模块。
- 创建
PdfDocument
对象并使用PdfDocument.loadFromFile()
方法载入PDF文档。 - 使用载入的PDF文档创建
PdfTableExtractor
对象。 - 历页面面,使用
PdfTableExtractor.extractTable()
方法提取每个页面上的所有表格。 - 遍历提取的表格,并构建CSV文件名。
- 创建
CSVWriter
对象,遍历表格行以及行中的列,使用PdfTable.getText()
方法获取每个单元格的数据并去除换行符,将提取的每行表格数据构建为字符串列表。最后将字符串列表写入为CSV数据行。 - 释放资源。
代码示例
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>
以下是详细操作步骤:
- 导入所需模块。
- 创建
PdfDocument
对象并使用PdfDocument.loadFromFile()
方法载入PDF文档。 - 创建
Workbook
对象,并使用Workbook.getWorksheets().clear()
方法清除默认工作表。 - 使用载入的PDF文档创建
PdfTableExtractor
对象。 - 历页面面,使用
PdfTableExtractor.extractTable()
方法提取每个页面上的所有表格。 - 遍历提取的表格,使用
Workbook.getWorksheets().add()
方法为每个表格创建一个指定名称的工作表。 - 遍历表格行和列,使用
PdfTable.getText()
方法获取每个单元格的数据并去除换行符,然后使用Worksheet.getRange().setText()
方法将单元格数据写入到工作表的相应单元格。 - 设置工作表单元格的格式。
- 使用
Worksheet.autoFitRow()
和Worksheet.autoFitColumn()
方法自动调整行高和列宽。 - 可以使用
Worksheet.saveToFile()
方法将工作表保存为CSV文件。 - 使用
Workbook.saveToFile()
方法保存工作簿为Excel文件。 - 释放资源。
代码示例
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文件。
更多PDF文档操作技巧请前往Spire.PDF for Java教程查看。