使用Python將PDF表格提取到文本,CSV和Excel文件中
從PDF文檔中提取表格并將其轉(zhuǎn)換為更易于處理的格式(如文本、CSV和Excel文件),是數(shù)據(jù)分析和信息管理中的常見需求。此過程可顯著簡(jiǎn)化表格數(shù)據(jù)的處理,使數(shù)據(jù)的操作、分析和與其他數(shù)據(jù)集的集成更加便捷。無(wú)論是財(cái)務(wù)報(bào)表、研究論文,還是包含結(jié)構(gòu)化信息的其他文檔,掌握這些表格準(zhǔn)確轉(zhuǎn)換的方法對(duì)于充分發(fā)揮數(shù)據(jù)潛力至關(guān)重要。
本文將介紹如何使用簡(jiǎn)單的Python代碼從PDF文檔中提取表格數(shù)據(jù)并將其寫入文本、CSV和Excel文件,從而輕松實(shí)現(xiàn)PDF表格的自動(dòng)化提取。
本文所需的庫(kù)為Spire.PDF for Python。可通過PyPI安裝:pip install spire.pdf
。
用于操作的示例PDF
如何使用Python提取PDF表格數(shù)據(jù)
庫(kù)中的PdfTableExtractor類用于處理PDF文檔的表格提取??梢酝ㄟ^PdfTableExtractor.ExtractTable(pageIndex: int)方法從PDF頁(yè)面中提取表格,并以Utilities_PdfTable對(duì)象的集合形式返回表格數(shù)據(jù)。接著,可通過遍歷表格并使用Utilities_PdfTable.GetCellText(rowIndex: int, columnIndex: int)方法獲取每個(gè)單元格中的數(shù)據(jù)。
提取PDF表格數(shù)據(jù)的一般步驟如下:
- 創(chuàng)建一個(gè)PdfDocument實(shí)例并使用PdfDocument.LoadFromFile()方法加載PDF文檔。
- 使用該文檔創(chuàng)建PdfTableExtractor實(shí)例。
- 使用PdfTableExtractor.ExtractTable(pageIndex: int)方法提取文檔中每頁(yè)的表格。
- 遍歷每個(gè)表格并使用Utilities_PdfTable.GetCellText(rowIndex: int, columnIndex: int)方法獲取單元格值。
- 將提取的表格數(shù)據(jù)寫入其他文件。
注意:當(dāng)使用提取的表格數(shù)據(jù)構(gòu)建字符串時(shí),如果單元格文本中包含換行符,最終生成的文本文件中可能會(huì)多出額外的換行符。為了避免造成混淆,應(yīng)將這些換行符去除或替換為空格。
用Python將PDF表格數(shù)據(jù)提取為文本文件
提取PDF文檔中的表格數(shù)據(jù)后,可直接將每個(gè)表格的數(shù)據(jù)寫入字符串并保存到文本文件中,從而實(shí)現(xiàn)將PDF表格數(shù)據(jù)導(dǎo)出為文本文件。
具體步驟如下:
1.導(dǎo)入所需模塊:PdfDocument和PdfTableExtractor。
2.創(chuàng)建PdfDocument實(shí)例并使用PdfDocument.LoadFromFile()方法加載PDF文檔。
3.使用該文檔創(chuàng)建PdfTableExtractor實(shí)例。
4.使用PdfTableExtractor.ExtractTable(pageIndex: int)方法提取每頁(yè)中的表格。
5.遍歷提取的表格:
- 創(chuàng)建一個(gè)str對(duì)象以存儲(chǔ)表格數(shù)據(jù)。
- 使用Utilities_PdfTable.GetCellText(rowIndex: int, columnIndex: int)方法獲取單元格值。
- 將單元格值追加到str對(duì)象中。
- 將str對(duì)象寫入文件。
6.釋放資源
代碼示例
from spire.pdf import PdfDocument, PdfTableExtractor # 創(chuàng)建一個(gè) PdfDocument 對(duì)象 pdf = PdfDocument() # 加載一個(gè) PDF 文檔 pdf.LoadFromFile("Sample.pdf") # 創(chuàng)建一個(gè) PdfTableExtractor 對(duì)象 extractor = PdfTableExtractor(pdf) # 遍歷所有頁(yè)面 for pageIndex in range(pdf.Pages.Count): # 從每個(gè) PDF 頁(yè)面中提取表格 tables = extractor.ExtractTable(pageIndex) # 如果存在多個(gè)表格,則遍歷這些表格 if tables is not None: for tableIndex in range(len(tables)): # 獲取一個(gè)表格 table = tables[tableIndex] # 創(chuàng)建一個(gè)字符串對(duì)象來(lái)存儲(chǔ)表格數(shù)據(jù) tableData = "" # 遍歷表格的行和列 for rowIndex in range(table.GetRowCount()): for colIndex in range(table.GetColumnCount()): # 獲取單元格文本 text = table.GetText(rowIndex, colIndex) text = text.replace("\n", " ") # 將單元格文本添加到表格數(shù)據(jù)中 tableData += text if colIndex < table.GetColumnCount() - 1: tableData += "\t" tableData += "\n" # 將表格數(shù)據(jù)寫入文本文件 with open(f"output/Tables/Page{pageIndex+1}-Table{tableIndex+1}.txt", "w", encoding="utf-8") as f: f.write(tableData) # 釋放資源 pdf.Dispose()
輸出結(jié)果
用Python將PDF表格數(shù)據(jù)提取為CSV文件
同樣,可以使用類似方法從PDF文檔中提取表格數(shù)據(jù),并利用Python標(biāo)準(zhǔn)庫(kù)中的CSV模塊將每個(gè)表格寫入CSV文件。在此過程中也需注意去除或替換換行符,以改善CSV文件的結(jié)果。具體步驟如下:
1.導(dǎo)入所需模塊:PdfDocument、PdfTableExtractor和CSV。
2.創(chuàng)建PdfDocument實(shí)例并使用PdfDocument.LoadFromFile()方法加載PDF文檔。
3.使用該文檔創(chuàng)建PdfTableExtractor實(shí)例。
4.使用PdfTableExtractor.ExtractTable(pageIndex: int)方法提取每頁(yè)中的表格。
5.遍歷提取的表格:
- 創(chuàng)建CSV文件。
- 遍歷表格中的行并創(chuàng)建列表以存儲(chǔ)行數(shù)據(jù)。
- 使用Utilities_PdfTable.GetCellText(rowIndex: int, columnIndex: int)方法獲取每行的單元格值并追加到列表中。
- 使用csv.writer().writerow()方法將每行寫入CSV文件。
6.釋放資源。
代碼示例
from spire.pdf import PdfDocument, PdfTableExtractor import csv # 創(chuàng)建一個(gè) PdfDocument 對(duì)象 pdf = PdfDocument() # 加載一個(gè) PDF 文檔 pdf.LoadFromFile("Sample.pdf") # 創(chuàng)建一個(gè) PdfTableExtractor 對(duì)象 extractor = PdfTableExtractor(pdf) # 遍歷所有頁(yè)面 for pageIndex in range(pdf.Pages.Count): # 從每個(gè) PDF 頁(yè)面中提取表格 tables = extractor.ExtractTable(pageIndex) # 如果存在多個(gè)表格,則遍歷這些表格 if tables is not None: for tableIndex in range(len(tables)): # 獲取一個(gè)表格 table = tables[tableIndex] # 創(chuàng)建一個(gè) CSV 文件 with open("output/Tables/Page" + str(pageIndex+1) + "-Table" + str(tableIndex+1) + ".csv", "w", newline='', encoding='utf-8') as csvFile: writer = csv.writer(csvFile) # 遍歷表格的行和列 for rowIndex in range(table.GetRowCount()): row = [] for colIndex in range(table.GetColumnCount()): # 獲取單元格文本 text = table.GetText(rowIndex, colIndex) text = text.replace('\n', ' ') row.append(text) writer.writerow(row) # 釋放資源 pdf.Dispose()
輸出結(jié)果
用Python將PDF表格數(shù)據(jù)提取到Excel工作表
可使用另一庫(kù)Spire.XLS for Python將提取的PDF表格數(shù)據(jù)寫入Excel工作表。通過PyPI獲取Spire.PDF for Python:pip install spire.xls
。
具體步驟如下:
1.導(dǎo)入所需模塊:PdfDocument、PdfTableExtractor、Workbook和spire.xls.FileFormat。
2.創(chuàng)建PdfDocument實(shí)例并使用PdfDocument.LoadFromFile()方法加載PDF文檔。
3.創(chuàng)建Workbook實(shí)例用于存儲(chǔ)表格,并使用Workbook.Worksheets.Clear()方法清除默認(rèn)工作表。
4.使用該文檔創(chuàng)建PdfTableExtractor實(shí)例。
5.使用PdfTableExtractor.ExtractTable(pageIndex: int)方法提取每頁(yè)中的表格。
6.遍歷提取的表格:
- 使用Workbook.Worksheets.Add(sheetName: str)方法為每個(gè)表格添加工作表。
- 使用Utilities_PdfTable.GetCellText(rowIndex: int, columnIndex: int)方法獲取表格的單元格值。
- 通過Worksheet.Range[rowIndex + 1, colIndex + 1].Text屬性將單元格值寫入相應(yīng)的工作表單元格。
7.使用Workbook.SaveToFile()方法保存工作簿。
8.釋放資源。
代碼示例
from spire.pdf import PdfDocument, PdfTableExtractor from spire.xls import Workbook, FileFormat, HorizontalAlignType # 創(chuàng)建一個(gè) PdfDocument 對(duì)象 pdf = PdfDocument() # 加載一個(gè) PDF 文檔 pdf.LoadFromFile("Sample.pdf") # 創(chuàng)建一個(gè) Workbook 對(duì)象 workbook = Workbook() # 清除默認(rèn)的工作表 workbook.Worksheets.Clear() # 創(chuàng)建一個(gè) PdfTableExtractor 對(duì)象 extractor = PdfTableExtractor(pdf) # 從每個(gè) PDF 頁(yè)面中提取表格 for pageIndex in range(pdf.Pages.Count): tables = extractor.ExtractTable(pageIndex) # 如果存在多個(gè)表格,則遍歷這些表格 if tables is not None: for tableIndex in range(len(tables)): # 獲取一個(gè)表格 table = tables[tableIndex] # 為表格創(chuàng)建一個(gè)工作表 sheet = workbook.Worksheets.Add(f"Page{pageIndex + 1}-Table{tableIndex + 1}") # 遍歷表格的行和列 for rowIndex in range(table.GetRowCount()): for colIndex in range(table.GetColumnCount()): # 獲取單元格值 text = table.GetText(rowIndex, colIndex) cellText = text.replace("\n", "") # 將單元格值寫入工作表的相應(yīng)單元格 sheet.Range[rowIndex + 1, colIndex + 1].Text = cellText # 可選:自定義表格的外觀 # 設(shè)置標(biāo)題行樣式 sheet.Rows.get_Item(0).Style.Font.FontName = "Yu Gothic UI" sheet.Rows.get_Item(0).Style.Font.Size = 12 sheet.Rows.get_Item(0).Style.Font.IsBold = True sheet.Rows.get_Item(0).Style.HorizontalAlignment = HorizontalAlignType.Center # 設(shè)置數(shù)據(jù)行樣式 for i in range(1, sheet.Rows.Count): sheet.Rows.get_Item(i).Style.Font.FontName = "Yu Gothic UI" sheet.Rows.get_Item(i).Style.Font.Size = 12 sheet.Rows.get_Item(i).Style.HorizontalAlignment = HorizontalAlignType.Left # 自動(dòng)調(diào)整列寬 for j in range(1, sheet.Columns.Count): sheet.AutoFitColumn(j) # 保存工作簿 workbook.SaveToFile("output/PDFTableToExcel.xlsx", FileFormat.Version2016) # 釋放資源 workbook.Dispose() pdf.Close()
輸出結(jié)果
使用Python直接將PDF轉(zhuǎn)換為Excel文件
還可以使用PdfDocument.SaveToFile(fileName: str, FileFormat.XLSX)方法將PDF文檔直接轉(zhuǎn)換為Excel文件。此方法適用于以表格為主的PDF文檔,有助于盡可能保留表格的原始外觀。
為減少轉(zhuǎn)換后Excel表格中的空白,可以在轉(zhuǎn)換前去除PDF文檔的邊距。參考以下文章:
直接將PDF文檔轉(zhuǎn)換為Excel文件的具體步驟如下:
1.導(dǎo)入所需模塊:PdfDocument和FileFormat。
2.創(chuàng)建一個(gè)PdfDocument實(shí)例。
3.使用PdfDocument.LoadFromFile()方法加載PDF文檔。
4.將文檔轉(zhuǎn)換為Excel文件并使用PdfDocument.SaveToFile(fileName: str, FileFormat.XLSX)方法保存。
5.釋放資源。
代碼示例
from spire.pdf import PdfDocument, FileFormat # 創(chuàng)建一個(gè) PdfDocument 實(shí)例 pdf = PdfDocument() # 加載一個(gè) PDF 文檔 pdf.LoadFromFile("Sample.pdf") # 將 PDF 文檔轉(zhuǎn)換為 Excel 文件 pdf.SaveToFile("output/PDFToExcel.xlsx", FileFormat.XLSX) # 關(guān)閉 PDF 文檔 pdf.Close()
輸出結(jié)果
到此這篇關(guān)于使用Python將PDF表格提取到文本,CSV和Excel文件中的文章就介紹到這了,更多相關(guān)Python PDF表格提取內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python 爬取騰訊視頻評(píng)論的實(shí)現(xiàn)步驟
這篇文章主要介紹了python 爬取騰訊視頻評(píng)論的實(shí)現(xiàn)步驟,幫助大家更好的理解和學(xué)習(xí)使用python爬蟲,感興趣的朋友可以了解下2021-02-02Python抓新型冠狀病毒肺炎疫情數(shù)據(jù)并繪制全國(guó)疫情分布的代碼實(shí)例
在本篇文章里小編給大家整理了一篇關(guān)于Python抓新型冠狀病毒肺炎疫情數(shù)據(jù)并繪制全國(guó)疫情分布的代碼實(shí)例,有興趣的朋友們可以學(xué)習(xí)下。2020-02-02python實(shí)現(xiàn)DNS正向查詢、反向查詢的例子
這篇文章主要介紹了python實(shí)現(xiàn)DNS正向查詢、反向查詢的例子,需要的朋友可以參考下2014-04-04pandas.DataFrame刪除/選取含有特定數(shù)值的行或列實(shí)例
今天小編就為大家分享一篇pandas.DataFrame刪除/選取含有特定數(shù)值的行或列實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2018-11-11