利用Java提取PDF表格到文本、CSV及excel工作表
引言
如何精準(zhǔn)地提取PDF格式中嵌入的表格數(shù)據(jù),并將其無(wú)縫轉(zhuǎn)換為更加易于分析和操作的形式,如純文本、CSV文件或Excel工作表,是一項(xiàng)重要的文檔處理技巧。使用Java,我們可以簡(jiǎn)單地實(shí)現(xiàn)這一過(guò)程。本文將介紹如何利用Java從PDF文檔提取表格數(shù)據(jù),并寫(xiě)入文本文件、CSV文件以及Excel工作表。
本文所使用的方法提取PDF表格主要需要免費(fèi)的Free Spire.PDF for Java庫(kù),可下載導(dǎo)入或通過(guò)Maven導(dǎo)入:
<dependency> <groupId>e-iceblue</groupId> <artifactId>spire.pdf.free</artifactId> <version>9.13.0</version> </dependency>
提取PDF表格需要用到庫(kù)中的PdfTableExtractor類(lèi)。我們可以為載入的PDF文件創(chuàng)建PdfTableExtractor對(duì)象,然后使用PdfTableExtractor.extractTable()方法根據(jù)頁(yè)面在文檔中的參數(shù)提取指定PDF頁(yè)面上所有表格,最后再使用PdfTable.getText()方法即可獲取表格中的數(shù)據(jù)。以下是一般操作步驟示例:
- 創(chuàng)建
PdfDocument
對(duì)象并使用PdfDocument.loadFromFile()
方法載入PDF文檔。 - 使用載入的PDF文檔創(chuàng)建
PdfTableExtractor
對(duì)象。 - 使用
PdfTableExtractor.extractTable()
方法提取每個(gè)頁(yè)面上的表格。 - 使用
PdfTable.getText()
方法獲取PDF表格的單元格數(shù)據(jù)。
使用上述方法獲取表格數(shù)據(jù)后,我們就可以將其寫(xiě)入文本文件,或搭配其他工具制作CSV或Excel文件了。
提取PDF表格數(shù)據(jù)寫(xiě)入文本文件
使用PdfTableExtractor.extractTable()
方法提取表格并使用PdfTable.getText()
方法獲取單元格數(shù)據(jù)后,我們可以通過(guò)構(gòu)建字符串并寫(xiě)入文本文件來(lái)實(shí)現(xiàn)提取表格并保存為文本文件的目的。以下是詳細(xì)操作步驟:
- 導(dǎo)入所需模塊。
- 創(chuàng)建
PdfDocument
對(duì)象并使用PdfDocument.loadFromFile()
方法載入PDF文檔。 - 使用載入的PDF文檔創(chuàng)建
PdfTableExtractor
對(duì)象。 - 遍歷頁(yè)面,使用
PdfTableExtractor.extractTable()
方法提取每個(gè)頁(yè)面上的所有表格。 - 遍歷提取到的表格,為每個(gè)表格創(chuàng)建一個(gè)
StringBuilder
對(duì)象。 - 遍歷表格中的行和列,使用
PdfTable.getText()
方法獲取每個(gè)單元格的數(shù)據(jù)并去除換行符。然后將單元格數(shù)據(jù)添加到StringBuilder
對(duì)象。 - 將
StringBuilder
對(duì)象寫(xiě)入文本文件。 - 釋放資源。
代碼示例
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 { // 創(chuàng)建一個(gè)PdfDocument對(duì)象 PdfDocument pdf = new PdfDocument(); // 加載一個(gè)PDF文檔 pdf.loadFromFile("Sample.pdf"); // 創(chuàng)建一個(gè)PdfTableExtractor對(duì)象 PdfTableExtractor extractor = new PdfTableExtractor(pdf); // 從每一頁(yè)中提取表格 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]; // 創(chuàng)建一個(gè)StringBuilder對(duì)象 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"); } } } // 將表格寫(xiě)入文本文件 try (FileWriter writer = new FileWriter("output/Tables/Page" + (pageIndex+1) + "-Table" + (tableIndex+1) + ".txt")) { writer.write(tableText.toString()); } } } } } }
提取結(jié)果
提取PDF表格數(shù)據(jù)寫(xiě)入CSV文件
我們也可以用同樣的方法提取表格數(shù)據(jù),然后搭配其他模塊,如opencsv,將提取到的數(shù)據(jù)寫(xiě)入CSV文件。也可以使用下面的提取PDF表格寫(xiě)入Excel文件,最后保存時(shí)保存為CSV文件。
opencsv:
<dependency> <groupId>com.opencsv</groupId> <artifactId>opencsv</artifactId> <version>5.9</version> </dependency>
以下是搭配opencsv提取PDF表格數(shù)據(jù)并寫(xiě)入CSV文件的操作步驟:
- 導(dǎo)入所需模塊。
- 創(chuàng)建
PdfDocument
對(duì)象并使用PdfDocument.loadFromFile()
方法載入PDF文檔。 - 使用載入的PDF文檔創(chuàng)建
PdfTableExtractor
對(duì)象。 - 歷頁(yè)面面,使用
PdfTableExtractor.extractTable()
方法提取每個(gè)頁(yè)面上的所有表格。 - 遍歷提取的表格,并構(gòu)建CSV文件名。
- 創(chuàng)建
CSVWriter
對(duì)象,遍歷表格行以及行中的列,使用PdfTable.getText()
方法獲取每個(gè)單元格的數(shù)據(jù)并去除換行符,將提取的每行表格數(shù)據(jù)構(gòu)建為字符串列表。最后將字符串列表寫(xiě)入為CSV數(shù)據(jù)行。 - 釋放資源。
代碼示例
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 { // 創(chuàng)建一個(gè)PdfDocument對(duì)象 PdfDocument pdf = new PdfDocument(); // 加載一個(gè)PDF文檔 pdf.loadFromFile("Sample.pdf"); // 創(chuàng)建一個(gè)PdfTableExtractor對(duì)象 PdfTableExtractor extractor = new PdfTableExtractor(pdf); // 從每一頁(yè)中提取表格 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]; // 創(chuàng)建CSV文件名 String csvFileName = "output/Tables/Page" + (pageIndex + 1) + "-Table" + (tableIndex + 1) + ".csv"; // 創(chuàng)建一個(gè)CSVWriter對(duì)象 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; } // 將行寫(xiě)入CSV文件 writer.writeNext(row); } } } } } // 關(guān)閉PDF文檔 pdf.close(); } }
提取結(jié)果
提取PDF表格數(shù)據(jù)寫(xiě)入Excel文件
保存PDF表格到表格需要用到Free Spire.XLS for Java。我們可以提取到PDF文檔表格單元格數(shù)據(jù)后,使用Worksheet.getRange().setText()方法將數(shù)據(jù)寫(xiě)入到創(chuàng)建的Excel工作表的相應(yīng)單元格并保存,從而實(shí)現(xiàn)PDF表格數(shù)據(jù)到Excel文件的提取。同時(shí),我們還可以在保存文件時(shí)將格式參數(shù)設(shè)置為CSV,實(shí)現(xiàn)PDF表格數(shù)據(jù)到CSV文件的提取。
Free Spire.XLS for Java:
<dependency> <groupId>e-iceblue</groupId> <artifactId>spire.xls.free</artifactId> <version>5.3.0</version> </dependency>
以下是詳細(xì)操作步驟:
- 導(dǎo)入所需模塊。
- 創(chuàng)建
PdfDocument
對(duì)象并使用PdfDocument.loadFromFile()
方法載入PDF文檔。 - 創(chuàng)建
Workbook
對(duì)象,并使用Workbook.getWorksheets().clear()
方法清除默認(rèn)工作表。 - 使用載入的PDF文檔創(chuàng)建
PdfTableExtractor
對(duì)象。 - 歷頁(yè)面面,使用
PdfTableExtractor.extractTable()
方法提取每個(gè)頁(yè)面上的所有表格。 - 遍歷提取的表格,使用
Workbook.getWorksheets().add()
方法為每個(gè)表格創(chuàng)建一個(gè)指定名稱(chēng)的工作表。 - 遍歷表格行和列,使用
PdfTable.getText()
方法獲取每個(gè)單元格的數(shù)據(jù)并去除換行符,然后使用Worksheet.getRange().setText()
方法將單元格數(shù)據(jù)寫(xiě)入到工作表的相應(yīng)單元格。 - 設(shè)置工作表單元格的格式。
- 使用
Worksheet.autoFitRow()
和Worksheet.autoFitColumn()
方法自動(dòng)調(diào)整行高和列寬。 - 可以使用
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) { // 創(chuàng)建一個(gè)PdfDocument對(duì)象 PdfDocument pdf = new PdfDocument(); // 加載一個(gè)PDF文檔 pdf.loadFromFile("G:/Documents/Sample73.pdf"); // 創(chuàng)建一個(gè)Workbook對(duì)象 Workbook workbook = new Workbook(); workbook.getWorksheets().clear(); // 創(chuàng)建一個(gè)PdfTableExtractor對(duì)象 PdfTableExtractor extractor = new PdfTableExtractor(pdf); // 從每一頁(yè)中提取表格 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++) { // 向工作簿中添加一個(gè)工作表 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", ""); // 將單元格文本寫(xiě)入工作表 sheet.getCellRange(rowIndex+1, colIndex+1).setText(cellText); } } // 設(shè)置單元格樣式 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); } // 自動(dòng)調(diào)整行和列 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"); // 關(guān)閉PDF文檔 pdf.close(); // 釋放工作簿資源 workbook.dispose(); } }
提取結(jié)果
本文演示了如何使用Java提取PDF表格數(shù)據(jù)寫(xiě)入文本、CSV以及Excel文件。
以上就是利用Java提取PDF表格到文本、CSV及excel工作表的詳細(xì)內(nèi)容,更多關(guān)于Java提取PDF表格的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
一步步教你JAVA如何優(yōu)化Elastic?Search
想要榨干Java操作Elasticsearch的所有性能潛力?本指南將一步步教你如何優(yōu)化Java與Elasticsearch的交互!從此,提升ES查詢(xún)速度、降低資源消耗不再是難題,趕快一起來(lái)探索Java?Elasticsearch優(yōu)化的秘訣吧!2024-01-01java用靜態(tài)工廠代替構(gòu)造函數(shù)使用方法和優(yōu)缺點(diǎn)
這篇文章主要介紹了java用靜態(tài)工廠代替構(gòu)造函數(shù)使用方法和優(yōu)缺點(diǎn),需要的朋友可以參考下2014-02-02springboot升級(jí)到j(luò)dk21最新教程(2023年)
你還在使用jdk8?快來(lái)看看最新出爐的SpringBoot+jdk21如何使用,下面這篇文章主要給大家介紹了關(guān)于springboot升級(jí)到j(luò)dk21的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-10-10基于Spring整合mybatis注解掃描是否成功的問(wèn)題
這篇文章主要介紹了Spring整合mybatis注解掃描是否成功的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10Java基于socket服務(wù)實(shí)現(xiàn)UDP協(xié)議的方法
這篇文章主要介紹了Java基于socket服務(wù)實(shí)現(xiàn)UDP協(xié)議的方法,通過(guò)兩個(gè)簡(jiǎn)單實(shí)例分析了java通過(guò)socket實(shí)現(xiàn)UDP發(fā)送與接收的技巧,需要的朋友可以參考下2015-05-05