摘要:能獲取頁面中文本的準確位置,以及字體或行等其他信息。安裝修改的源碼利用截取中的某幾頁,如果的中文字編碼為編碼,則無法解析。在簡體中文操作系統中,編碼代表編碼。其一在文件中第行,改為此處是為了適應含有的編碼的中文字符,提供對其的解碼能力。
任務
現在我們有大量的pdf文件,我們想要截取每個文件中感興趣的一部分,比如,我們下載了3500份上市公司的年度報告,我們想要找到包含“關鍵審計事項”部分內容,將pdf相關頁保存為新的pdf文件。
python環境:
anaconda3解析pdf文件 PDFMiner
pdfminer3k
pypdf2
PDFMiner是一個從PDF文檔中提取信息的工具。與其他PDF相關的工具不同,它只用于獲取和分析文本數據。PDFMiner能獲取頁面中文本的準確位置,以及字體或行等其他信息。它還有一個PDF轉換器,可以將PDF文件轉換成其他文本格式(如HTML)。還有一個可擴展的解析器PDF,可以用于文本分析以外的其他用途。
安裝pdfminer3k
pip install pdfminder3k
解析pdf,匹配關鍵字,返回其所在頁碼
參考
from pdfminer.pdfparser import PDFParser, PDFDocument from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter from pdfminer.converter import PDFPageAggregator from pdfminer.layout import LTTextBoxHorizontal, LAParams from pdfminer.pdfinterp import PDFTextExtractionNotAllowed path = r"./report/603999讀者傳媒2017年年度報告.pdf" def parse(path): """ #解析pdf文件,并將文字內容更保存在文本中 返回“關鍵字”所在的頁碼 """ fp = open(path, "rb") # 以二進制讀模式打開 # 用文件對象來創建一個pdf文檔分析器 praser = PDFParser(fp) # 創建一個PDF文檔 doc = PDFDocument() # 連接分析器 與文檔對象 praser.set_document(doc) doc.set_parser(praser) # 提供初始化密碼 # 如果沒有密碼 就創建一個空的字符串 doc.initialize() # 檢測文檔是否提供txt轉換,不提供就忽略 if not doc.is_extractable: raise PDFTextExtractionNotAllowed else: # 創建PDf 資源管理器 來管理共享資源 rsrcmgr = PDFResourceManager() # 創建一個PDF設備對象 laparams = LAParams() device = PDFPageAggregator(rsrcmgr, laparams=laparams) # 創建一個PDF解釋器對象 interpreter = PDFPageInterpreter(rsrcmgr, device) # 循環遍歷列表,每次處理一個page的內容 page_num=0 key_flag=False for page in doc.get_pages(): # doc.get_pages() 獲取page列表 if key_flag: #如果找到第一個關鍵字,則退出解析 break page_num=page_num+1 interpreter.process_page(page) # 接受該頁面的LTPage對象 layout = device.get_result() # 這里layout是一個LTPage對象 里面存放著 這個page解析出的各種對象 一般包括LTTextBox, LTFigure, LTImage, LTTextBoxHorizontal 等等 想要獲取文本就獲得對象的text屬性, for x in layout: if (isinstance(x, LTTextBoxHorizontal)): results = x.get_text() if "關鍵審計事項" in results: # 匹配到關鍵字,則退出該頁的循環 key_flag=True break return page_num裁剪pdf文件 PyPDF2
PyPDF2是一個python PDF庫,能夠分割、合并、裁剪和轉換PDF文件的頁面。它還可以向PDF文件中添加自定義數據、查看選項和密碼。它可以從PDF檢索文本和元數據,還可以將整個文件合并在一起。
安裝pypdf2:
pip install pypdf2
修改pypdf2的源碼
利用pypdf2截取pdf中的某幾頁,如果pdf的中文字編碼為ANSI編碼,則無法解析。對于pypdf2對于gbk不支持的現象,需要對以下兩處進行修改。參考
tips:
ANSI是一種字符代碼,為使計算機支持更多語言。ANSI編碼表示英文字符時用一個字節,表示中文用兩個或四個字節。在簡體中文Windows操作系統中,ANSI 編碼代表 GBK 編碼。
GBK是在國家標準GB2312基礎上擴容后兼容GB2312的標準。
其一:
在文件*Miniconda3libsite-packagesPyPDF2generic.py"中第488行,改為
此處是為了適應含有‘gbk’的編碼的中文字符,提供對其的解碼能力。
try: return NameObject(name.decode("utf-8")) except (UnicodeEncodeError, UnicodeDecodeError) as e: # Name objects should represent irregular characters # with a "#" followed by the symbol"s hex number ret=name.decode("gbk") return NameObject(ret)
其二:
在文件*Miniconda3libsite-packagesPyPDF2utils.py中,第238-241行,改為:
此處是為了適應‘utf-8’的編碼情況;
try: r = s.encode("latin-1") if len(s) < 2: bc[s] = r return r except Exception as e: print(s) r = s.encode("utf-8") if len(s) < 2: bc[s] = r return r
截取pdf特定頁
from PyPDF2 import PdfFileWriter, PdfFileReader def pdfCrap(path,start_page,save_path): """ 從pdf文件中截取幾頁,并保存在對應pdf文件中 """ # 開始頁 start_page = start_page - 1 # 截止頁 end_page = start_page + 5 # 這里設定截取5頁 output = PdfFileWriter() pdf_file = PdfFileReader(open(path, "rb"), strict=False) pdf_pages_len = pdf_file.getNumPages() for i in range(start_page, end_page): output.addPage(pdf_file.getPage(i)) # 在輸出流中添加頁 outputStream = open(save_path, "wb") output.write(outputStream)遍歷文件夾內所有文件
以上已經可以實現對單一pdf文件的解析以及提取特定頁了,剩下的就是將整個流程串聯起來,實現批量pdf文件的截取。
import os def file_name(file_dir): """ 獲取某文件夾下,特定擴展名的文件名, 返回特定擴展名文件列表 """ L=[] for root, dirs, files in os.walk(file_dir): for file in files: if os.path.splitext(file)[1] == ".pdf": #os.path.splitext()函數將路徑拆分為文件名+擴展名 L.append(file) return L出錯怎么辦
現在,我們已經能夠進行批量pdf文件的裁剪了,但在實際操作中,會發生許多意外,使得程序被中斷,為了避免中斷影響批處理的進程,現在添加異常處理功能。
file_path = "./report/" # 輸入文件所在的文件夾 result_path = "./result/" # 輸出文件所在文件夾 def getAll(): """ 批量裁剪pdf文件,添加程序log,記錄文件名,關鍵字起始頁碼,并且對異常情況進行記錄; """ files=file_name(file_path) for file in files: try: path = file_path + file page=parse(path) save_path=result_path+file pdfCrap(path,page,save_path) if page==0: #如果識別出起始頁碼為0,說明關鍵字未被找到,需要記錄。 raise Exception("page_num=0") with open(r"./log.txt", "a", encoding="utf-8") as f: f.write(file+" start_page: "+str(page)+" ") except Exception as e: # 捕獲錯誤 print("error: ", e) with open(r"./error_log.txt", "a", encoding="utf-8") as f: f.write(file+" start_page: "+str(page)+" ") continue
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/43179.html
摘要:任務批量抓取網頁文件有一個,里面有數千條指向下載鏈接的網頁地址,現在,需要批量抓取這些網頁地址中的文件。利用,具體邏輯是正常情況下,按次序下載文件,如果同一文件,下載失敗次數超過,則跳過,下載下一個文件,并記錄錯誤信息。 任務:批量抓取網頁pdf文件 有一個excel,里面有數千條指向pdf下載鏈接的網頁地址,現在,需要批量抓取這些網頁地址中的pdf文件。python環境: anaco...
摘要:任務批量抓取網頁文件有一個,里面有數千條指向下載鏈接的網頁地址,現在,需要批量抓取這些網頁地址中的文件。利用,具體邏輯是正常情況下,按次序下載文件,如果同一文件,下載失敗次數超過,則跳過,下載下一個文件,并記錄錯誤信息。 任務:批量抓取網頁pdf文件 有一個excel,里面有數千條指向pdf下載鏈接的網頁地址,現在,需要批量抓取這些網頁地址中的pdf文件。python環境: anaco...
摘要:復雜系統仿真的微博客虛假信息擴散模型研究面向影子分析的社交媒體競爭情報搜集面向人機協同的移動互聯網政務門戶探析經驗證。微博客的企業競爭情報搜集移動社交媒體用戶隱私保護對策研究注意這里的提示,原先的個文件沒有被再次抽取,只有個新文件被抽取。 showImg(https://segmentfault.com/img/bVbiU7y?w=1000&h=508); 本文為你展示,如何用Pyth...
摘要:軟件進入轉換狀態,稍等一下,轉就快速轉換完成。其實可以將格式的圖紙批量轉成格式的軟件有很多,但是小編教大家了一種最簡單的,希望可以對大家有所幫助哦 有沒有軟件可以將dwg格式的圖紙批量轉成pdf格式?當然是有的啊,那么我們常用的PC電腦端相關的轉換器軟件的話,在手機上,我們一樣是可以實現相關的操作應用的,那么在手機上又該怎么進行具體的實踐操作?其實方法也是很簡單的,和電腦上一樣,只需要...
摘要:假設我有下面這個文件,里面有很多圖片,我想把這些圖片批量導出,而不是在里一張張手動拷貝本文介紹一種快捷做法。 假設我有下面這個PDF文件,里面有很多圖片,我想把這些圖片批量導出,而不是在Adobe Acrobat Reader里一張張手動拷貝: showImg(https://segmentfault.com/img/remote/1460000017166430); 本文介紹一種快捷...
閱讀 2943·2021-10-18 13:33
閱讀 846·2019-08-30 14:20
閱讀 2631·2019-08-30 13:14
閱讀 2521·2019-08-29 18:38
閱讀 2890·2019-08-29 16:44
閱讀 1212·2019-08-29 15:23
閱讀 3484·2019-08-29 13:28
閱讀 1916·2019-08-28 18:00