利用python處理PDF文本

你是不是經常被PDF煩惱???

在現有庫中,pdf的代碼操作大致分為頁面提取以及文字獲取兩個方面。在頁面處理上,有pypdf2可以使用,在提取文本上有pdfminer可以處理。

這裡舉兩個簡單的例子:

1,利用pypdf提取pdf文件前5頁文件:

from PyPDF2 import PdfFileReader, PdfFileWriterimport osdef split_pdf(infn, outfn): pdf_output = PdfFileWriter() with open(infn, rb) as f: pdf_input = PdfFileReader(f) #頁面數量 page_count = pdf_input.getNumPages() print(page_count) # 將 pdf 前5頁 for i in range(5): pdf_output.addPage(pdf_input.getPage(i)) with open(outfn, wb) as f: pdf_output.write(f)def merge_pdf(pdf_folder, outfn): """將多個文件合併為一個文件""" pdf_output = PdfFileWriter() #這裡文件夾中只有pdf文件 pdfs = os.listdur(os.path.join(pdf_folder)) for infn in infnList: pdf_input = PdfFileReader(open(infn, rb)) # 獲取 pdf 共用多少頁 page_count = pdf_input.getNumPages() print(page_count) for i in range(page_count): pdf_output.addPage(pdf_input.getPage(i)) pdf_output.write(open(outfn, wb))

2,根據關鍵字利用pdfminer獲取文本,並返回該頁面

例如,我想從一堆文本PDF文件中抽出某些含有關鍵字的文本,並返回帶有這些關鍵字的頁面,那麼改如何處理?

# -*- coding: utf-8 -*-"""目標:從pdf文件中抽取出含有關鍵字的頁面,並將這些頁面合併一個新的pdf文件"""from PyPDF2 import PdfFileReader, PdfFileWriterfrom pdfminer.pdfparser import PDFParserfrom pdfminer.pdfdocument import PDFDocumentfrom pdfminer.pdfpage import PDFPagefrom pdfminer.pdfpage import PDFTextExtractionNotAllowedfrom pdfminer.pdfinterp import PDFResourceManagerfrom pdfminer.pdfinterp import PDFPageInterpreterfrom pdfminer.pdfdevice import PDFDevicefrom pdfminer.layout import *from pdfminer.converter import PDFPageAggregatorfp = open(mypdf.pdf, rb)import reimport os#來創建一個pdf文檔分析器parser = PDFParser(fp)#創建一個PDF文檔對象存儲文檔結構document = PDFDocument(parser)# 檢查文件是否允許文本提取if not document.is_extractable: raise PDFTextExtractionNotAllowedelse: # 創建一個PDF資源管理器對象來存儲共賞資源 rsrcmgr=PDFResourceManager() # 設定參數進行分析 laparams=LAParams() # 創建一個PDF設備對象 # device=PDFDevice(rsrcmgr) device=PDFPageAggregator(rsrcmgr,laparams=laparams) # 創建一個PDF解釋器對象 interpreter=PDFPageInterpreter(rsrcmgr,device) # 處理每一頁 pageindex = [] i = 0 pattern = re.compile("collinear") for page in PDFPage.create_pages(document): interpreter.process_page(page) # # 接受該頁面的LTPage對象 layout=device.get_result() # return text image line curve for x in layout: if isinstance(x,LTText): if pattern.search(x.get_text()): pageindex.append(i) i +=1pdf_output = PdfFileWriter()pdf_input = PdfFileReader(fp)# 獲取 pdf 共用多少頁for j in pageindex: pdf_output.addPage(pdf_input.getPage(j))final_path =os.path.join(r"C:Users cDesktopfinal.pdf")with open(final_path,"wb") as f: pdf_output.write(f)fp.close()

好吧,到此結束???很多人會說,這些有什麼意思,我隨便點擊一下滑鼠就完事了?

----------------------------------垃圾分割線-------------------------------------------

別急,以上僅僅作為演示,乾貨在下面

-----------乾貨1-------------

技術:文章的封面是經過筆者仔細研究pypdfminer之後做出的圖,理清了該庫的主要邏輯。

----------乾貨2---------------

場景:A君為證券公司IPO小兵,近來在研究[共同實際控制人]問題,然而,這問題並不常見,通過網路關鍵搜索-即使派上了全文搜索以及牛逼哄哄的google-以及肉眼式的轟炸,僅僅找到了幾個老舊的案例。這顯然不是A君要的東西,對此他苦惱不堪。難道就沒有捷徑?

有的,不過,捷徑通常掌握在思考者手裡!

我們來思考剛剛提到的窘境

問題:搜尋共同實際控制人案例

問題的根本解決之路:從眾多IPO公司招股書中查找

手段:」人生苦膽,我學python「

思路:

1,利用爬蟲下載證監會招股說明書--PDF格式文件

2,利用pdfminer解析文本,獲取含有【共同實際控制人】招股書公司名字

PART ONE

以是下載證監會反饋意見scrapy項目的主要spider代碼:

# -*- coding: utf-8 -*-import scrapyimport osimport urllib.requestfrom scrapy.selector import Selectorfrom .tools import alreay_exit,create_worddoc,get_parafrom .tools import get_start_urlsclass YxplSpider(scrapy.Spider): name = yxpl allowed_domains = [http://www.csrc.gov.cn] start_urls = get_start_urls() exit_files = alreay_exit() def parse_page(self,response): final_dir =r"C:Users cPycharmProjectsyxplfiles" item = SeoItem() pre = "/".join(response.url.split("/")[:-1]) title = response.xpath("//head/title/text()").extract()[0] item["title"] = title #to get the pdf url urls = response.xpath(//div[@class="content"]/a/@href).extract() if len(urls) > 0: for j in urls: final_url = pre + j[1:] #最終網址 if item["title"] not in self.exit_files: try: item["content"] =urllib.request.urlopen(final_url).read() file = open(os.path.join(final_dir, item["title"] + ".pdf"), mode="wb") file.write(item["content"]) file.close() except urllib.request.HTTPError: print("Error with HTTPErro" + item["title"]) else: print(title) return item def parse(self, response): pre = r"http://www.csrc.gov.cn/pub/newsite/fxjgb/zrzfkyj/" urls = response.xpath(//ul[@id="myul"]/li/a/@href).extract() for i in urls: new_url = "http://www.csrc.gov.cn/pub/" + "/".join(i.split("/")[3:] yield scrapy.Request(new_url,callback=self.parse_page,dont_filter=True)

PART TWO

2,返回含有關鍵子的文件名

對於下載好的PDF,僅僅只需要打開文件並對比關鍵字即可。由於過程簡單,這裡就不展示代碼了。(實際上並不是我不願意展示,而是因為運行速度太慢了!,一個400頁的PDF大概需要一分多鐘才能運行完畢,下載的文件有1500份,最少需要15個小時,so,python庫確實 慢!慢!慢!)

含有【共同實際控制人】招股書名稱截圖

結語:對於PDF的操作介紹就到此結束。本文僅僅作為一種運用庫展示代碼編寫過程,具體技術還需要有興趣的朋友自己專研。

---------------ps-------------------

好吧,我還是透露在項目中發現的一個pycharm的一個重要功能--類的層級關係圖,並將它與官方網站的模型圖進行對比。

pycharm 層級圖

官網 層級圖

提示:層級關係圖,可以比較快的把握庫的層次關係,有利於摸清庫的對象之間的關係


推薦閱讀:

TAG:PDF轉換 | 招股書 | 網頁爬蟲 |