PDF文件是官方報告、發票和數據表的通用語言,然而從PDF文件中提取表格數據可能是一項挑戰。盡管Adobe Acrobat等工具提供了解決方案,但它們并不總是易于獲取或可自動化運行,而Python則是編程語言中的瑞士軍刀。本文將探討如何利用Python輕松實現PDF數據提取,而無需使用昂貴的軟件。
PDF文件是為展示而設計的,而不是為提取數據。它們通常包含復雜的布局,在視覺上很吸引人,但在計算上卻無法訪問。因此,提取表格等結構化信息非常困難。
PyMuPDF是一款輕量級的庫,擅長讀取PDF文件并提取文本。只需幾行代碼,就可以讀取PDF并從任意頁面提取文本。本文從奔馳集團2022年第四季度年度報告中提取“股東權益變動綜合報表(Consolidated Statement of Changes in Equity)”,代碼如下。
import fitz import pandas as pdimport re# --- PDF處理 ---# 定義PDF文件的路徑并打開文檔pdf_path = '..../Merc 2022Q4 Rep.pdf'pdf_document = fitz.open(pdf_path)# 選擇要閱讀的特定頁面page = pdf_document[200]# 獲取頁面的尺寸page_rect = page.rectpage_width, page_height = page_rect.width, page_rect.height# 定義感興趣區域的矩形(不包括腳注)non_footnote_area_height = page_height * 0.90clip_rect = fitz.Rect(0, 0, page_width, non_footnote_area_height)# 從定義的區域提取文本page_text = page.get_text("text", clip=clip_rect)lines_page = page_text.strip().split('/n')
提取的文本通常帶有不需要的字符或格式。這就是預處理發揮作用的地方。Python的字符串處理功能使用戶能夠清洗和準備數據以轉換為表格格式。
# --- 數據清洗 ---# 定義要搜索的字符串并查找其索引search_string = 'Balance at 1 January 2021 (restated) 'try: index = lines_page.index(search_string) data_lines = lines_page[index:]except ValueError: print(f"The string '{search_string}' is not in the list.") data_lines = []# 如果不是數字或連字符,則合并連續字符串條目def combine_consecutive_strings(lines): combined = [] buffer = '' for line in lines: if isinstance(line, str) and not re.match(r'^[-/d,.]+$', line.strip()): buffer += ' ' + line if buffer else line else: if buffer: combined.append(buffer) buffer = '' combined.append(line.strip()) if buffer: combined.append(buffer) return combinedcleaned_data = combine_consecutive_strings(data_lines)
一旦數據清洗完成,就可以使用pandas了。這個功能強大的數據分析庫可以將一系列數據點轉換為DataFrame,即一個二維的、大小可變的、可能是異構的帶有標記軸的表格數據結構。
# --- 創建DataFrame ---# 根據列數將清洗后的數據分割成塊num_columns = 6data_chunks = [cleaned_data[i:i + num_columns] for i in range(0, len(cleaned_data), num_columns)]# 定義DataFrame的表頭headers = [ 'Description', 'Share capital', 'Capital reserves', 'Retained earnings (restated)', 'Currency translation (restated)', 'Equity instruments / Debt instruments']# 使用數據塊和表頭創建DataFramefinancial_df = pd.DataFrame(data_chunks, columns=headers)# Display the head of the DataFrame to verify its structurefinancial_df.head()
如下所示是從PDF文件中提取的表格結果。
圖片
通過利用Python強大的庫,可以自動化繁瑣的PDF數據提取任務。這種方法不僅成本低,而且提供了Python開發者所喜愛的靈活性和強大功能。
本文鏈接:http://www.www897cc.com/showinfo-26-34615-0.html用Python替代Adobe,零成本從PDF提取數據
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com
上一篇: 秒殺系統 Go 并發編程實踐!
下一篇: 層次分析法--可以幫助你做決策的簡單算法