如何精準地提取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教程查看。