我们也可以用同样的方法提取表格数据,然后搭配其他模块,如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();
}
}
提取结果