一文教會(huì)你用Python讀取PDF文件
實(shí)戰(zhàn)場(chǎng)景
Python 工程師在日常的工作中,經(jīng)常會(huì)碰到解析和處理PDF文件的情況,實(shí)戰(zhàn)中需求主要分為如下情況:
- 提取 PDF 中的文字
- 將 PDF 中每頁(yè)轉(zhuǎn)換為圖片
- word 轉(zhuǎn)換為PDF
- PDF生成,編輯,導(dǎo)入導(dǎo)出
- PDF在線渲染
除了最后一項(xiàng)需要前端配合以外,其余內(nèi)容都可以直接在 python 端進(jìn)行實(shí)現(xiàn)。
本次實(shí)戰(zhàn)選擇 pdfplumber
庫(kù)進(jìn)行學(xué)習(xí),可以提前安裝該庫(kù),不過(guò)有一點(diǎn)需要注意,該庫(kù)主要用于讀取 PDF 進(jìn)行操作,寫入和編輯無(wú)法實(shí)現(xiàn),即本文學(xué)習(xí)一款專注于 PDF 內(nèi)容提取的庫(kù)。
> pip install pdfplumber -i https://pypi.tuna.tsinghua.edu.cn/simple
pdfplumber
庫(kù)具備如下特點(diǎn):
- 可以訪問(wèn)PDF對(duì)象中的任意元素詳細(xì)信息;
- 可以提取文本和表格,而且用法簡(jiǎn)單;
- 集成了可視化調(diào)試。
Python PDF 實(shí)戰(zhàn)編碼
下面可以編寫 PDF 操作的基礎(chǔ)代碼。
import pdfplumber with pdfplumber.open('./dddd.pdf') as pdf: for page in pdf.pages: print(page.extract_text()) # 每頁(yè)打印一分頁(yè)分隔 print('---------- 分頁(yè)分隔 ----------')
導(dǎo)入 pdfplumber
模塊之后,使用 pdfplumber.open('./dddd.pdf')
打開(kāi)本地 pdf 文件,然后通過(guò) pdf.pages
遍歷所有頁(yè),在通過(guò)頁(yè)對(duì)象的 .extract_text()
方法,提取文本信息。
pdfplumber.open() 方法的簽名如下所示:
pdfplumber.open("文件名", password = "密碼", laparams = { "line_overlap": 0.7 })
其中各參數(shù)描述如下:
file_name
:文件名,必選參數(shù);password
:PDF的密碼;laparams
:布局參數(shù)。
除此之外,如果希望讀取 PDF,還可以使用 load()
方法,該方法也會(huì)返回 pdfplumber.PDF
類的實(shí)例。
pdfplumber.PDF
對(duì)象實(shí)例,主要有兩個(gè)重要屬性:
.metadata
:從PDF的Info中獲取元數(shù)據(jù)鍵 /值對(duì)字典。 通常包括“ CreationDate”,“ ModDate”,“ Producer”等;.pages
:包含pdfplumber.Page
實(shí)例的列表,每一個(gè)實(shí)例代表PDF每一頁(yè)的信息。
上文提及的 pdfplumber.Page
實(shí)例是 pdfplumber
的核心,后續(xù)對(duì) PDF 的操作大量圍繞該類的屬性和方法實(shí)施,其重要屬性如下所示:
page_number
:頁(yè)碼順序,第一頁(yè)的序號(hào)是 1;witdh
:寬度;height
:高度;.objects/.chars/.lines/.rects/.curves/.figures/.images
:獲取PDF頁(yè)中的重要數(shù)據(jù)。
核心方法如下所示:
extract_text()
:提取頁(yè)中的文本;extract_words()
:提取所有單詞及其相關(guān)信息;extract_tables()
: 提取頁(yè)面的表格。
extract_text()
呈現(xiàn)結(jié)果
extract_words()
呈現(xiàn)結(jié)果
extract_tables()
呈現(xiàn)效果,由于 PDF 中無(wú)表格,所有每頁(yè)得到的都是空!
補(bǔ)充
當(dāng)然Python除了讀取PDF文件,還有一些其他功能,例如加密PDF,旋轉(zhuǎn)和疊加頁(yè)面等,下面是實(shí)現(xiàn)的示例代碼
旋轉(zhuǎn)和疊加頁(yè)面
import PyPDF2 from PyPDF2.pdf import PageObject # 創(chuàng)建一個(gè)讀PDF文件的Reader對(duì)象 reader = PyPDF2.PdfFileReader('resources/XGBoost.pdf') # 創(chuàng)建一個(gè)寫PDF文件的Writer對(duì)象 writer = PyPDF2.PdfFileWriter() # 對(duì)PDF文件所有頁(yè)進(jìn)行循環(huán)遍歷 for page_num in range(reader.numPages): # 獲取指定頁(yè)碼的Page對(duì)象 current_page = reader.getPage(page_num) # type: PageObject if page_num % 2 == 0: # 奇數(shù)頁(yè)順時(shí)針旋轉(zhuǎn)90度 current_page.rotateClockwise(90) else: # 偶數(shù)頁(yè)反時(shí)針旋轉(zhuǎn)90度 current_page.rotateCounterClockwise(90) writer.addPage(current_page) # 最后添加一個(gè)空白頁(yè)并旋轉(zhuǎn)90度 page = writer.addBlankPage() # type: PageObject page.rotateClockwise(90) # 通過(guò)Writer對(duì)象的write方法將PDF寫入文件 with open('resources/XGBoost-modified.pdf', 'wb') as file: writer.write(file)
加密PDF文件
import PyPDF2 reader = PyPDF2.PdfFileReader('resources/XGBoost.pdf') writer = PyPDF2.PdfFileWriter() for page_num in range(reader.numPages): writer.addPage(reader.getPage(page_num)) # 通過(guò)encrypt方法加密PDF文件,方法的參數(shù)就是rre #設(shè)置的密碼 writer.encrypt('foobared') with open('resources/XGBoost-encrypted.pdf', 'wb') as file: writer.write(file)
批量添加水印
import PyPDF2 from PyPDF2.pdf import PageObject reader1 = PyPDF2.PdfFileReader('resources/XGBoost.pdf') reader2 = PyPDF2.PdfFileReader('resources/watermark.pdf') writer = PyPDF2.PdfFileWriter() # 獲取水印頁(yè) watermark_page = reader2.getPage(0) for page_num in range(reader1.numPages): current_page = reader1.getPage(page_num) # type: PageObject current_page.mergePage(watermark_page) # 將原始頁(yè)和水印頁(yè)進(jìn)行合并 writer.addPage(current_page) # 將PDF寫入文件 with open('resources/XGBoost-watermarked.pdf', 'wb') as file: writer.write(file)
到此這篇關(guān)于一文教會(huì)你用Python讀取PDF文件的文章就介紹到這了,更多相關(guān)Python讀取PDF文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
PyCM多類別混淆矩陣分析python庫(kù)功能使用探究
這篇文章主要為大家介紹了python編寫的PyCM多類混淆矩陣庫(kù),用于多類別混淆矩陣分析,幫助用戶從不同角度評(píng)價(jià)分類模型的表現(xiàn),這些指標(biāo)包括但不限于準(zhǔn)確率、召回率、F1分?jǐn)?shù)、Kappa?統(tǒng)計(jì)量等,支持二分類、多分類及多標(biāo)簽分類問(wèn)題2024-01-01Python之ThreadPoolExecutor線程池問(wèn)題
這篇文章主要介紹了Python之ThreadPoolExecutor線程池問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03用Python解決計(jì)數(shù)原理問(wèn)題的方法
計(jì)數(shù)原理是數(shù)學(xué)中的重要研究對(duì)象之一,分類加法計(jì)數(shù)原理、分步乘法計(jì)數(shù)原理是解決計(jì)數(shù)問(wèn)題的最基本、最重要的方法,也稱為基本計(jì)數(shù)原理,它們?yōu)榻鉀Q很多實(shí)際問(wèn)題提供了思想和工具。本文教大家怎么用Python解決在數(shù)學(xué)中遇到的計(jì)數(shù)原理問(wèn)題。2016-08-08Python中OpenCV實(shí)現(xiàn)查找輪廓的實(shí)例
本文將結(jié)合實(shí)例代碼,介紹 OpenCV 如何查找輪廓、獲取邊界框。具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-06-06Python中工作日類庫(kù)Busines Holiday的介紹與使用
Python語(yǔ)言是通過(guò)區(qū)分類庫(kù)的方式來(lái)劃分功能。用戶根據(jù)自身的需要加載合適的類庫(kù),來(lái)完成需要的功能。下面這篇文章主要給大家介紹了關(guān)于Python中工作日類庫(kù)Busines Holiday使用的相關(guān)資料,需要的朋友可以參考借鑒。2017-07-07