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