網(wǎng)站首頁 編程語言 正文
實戰(zhàn)場景
Python 工程師在日常的工作中,經(jīng)常會碰到解析和處理PDF文件的情況,實戰(zhàn)中需求主要分為如下情況:
- 提取 PDF 中的文字
- 將 PDF 中每頁轉(zhuǎn)換為圖片
- word 轉(zhuǎn)換為PDF
- PDF生成,編輯,導(dǎo)入導(dǎo)出
- PDF在線渲染
除了最后一項需要前端配合以外,其余內(nèi)容都可以直接在 python 端進(jìn)行實現(xiàn)。
本次實戰(zhàn)選擇 pdfplumber
庫進(jìn)行學(xué)習(xí),可以提前安裝該庫,不過有一點需要注意,該庫主要用于讀取 PDF 進(jìn)行操作,寫入和編輯無法實現(xiàn),即本文學(xué)習(xí)一款專注于 PDF 內(nèi)容提取的庫。
> pip install pdfplumber -i https://pypi.tuna.tsinghua.edu.cn/simple
pdfplumber
庫具備如下特點:
- 可以訪問PDF對象中的任意元素詳細(xì)信息;
- 可以提取文本和表格,而且用法簡單;
- 集成了可視化調(diào)試。
Python PDF 實戰(zhàn)編碼
下面可以編寫 PDF 操作的基礎(chǔ)代碼。
import pdfplumber with pdfplumber.open('./dddd.pdf') as pdf: for page in pdf.pages: print(page.extract_text()) # 每頁打印一分頁分隔 print('---------- 分頁分隔 ----------')
導(dǎo)入 pdfplumber
模塊之后,使用 pdfplumber.open('./dddd.pdf')
打開本地 pdf 文件,然后通過 pdf.pages
遍歷所有頁,在通過頁對象的 .extract_text()
方法,提取文本信息。
pdfplumber.open() 方法的簽名如下所示:
pdfplumber.open("文件名", password = "密碼", laparams = { "line_overlap": 0.7 })
其中各參數(shù)描述如下:
-
file_name
:文件名,必選參數(shù); -
password
:PDF的密碼; -
laparams
:布局參數(shù)。
除此之外,如果希望讀取 PDF,還可以使用 load()
方法,該方法也會返回 pdfplumber.PDF
類的實例。
pdfplumber.PDF
對象實例,主要有兩個重要屬性:
-
.metadata
:從PDF的Info中獲取元數(shù)據(jù)鍵 /值對字典。 通常包括“ CreationDate”,“ ModDate”,“ Producer”等; -
.pages
:包含pdfplumber.Page
實例的列表,每一個實例代表PDF每一頁的信息。
上文提及的 pdfplumber.Page
實例是 pdfplumber
的核心,后續(xù)對 PDF 的操作大量圍繞該類的屬性和方法實施,其重要屬性如下所示:
-
page_number
:頁碼順序,第一頁的序號是 1; -
witdh
:寬度; -
height
:高度; -
.objects/.chars/.lines/.rects/.curves/.figures/.images
:獲取PDF頁中的重要數(shù)據(jù)。
核心方法如下所示:
-
extract_text()
:提取頁中的文本; -
extract_words()
:提取所有單詞及其相關(guān)信息; -
extract_tables()
: 提取頁面的表格。
extract_text()
呈現(xiàn)結(jié)果
extract_words()
呈現(xiàn)結(jié)果
extract_tables()
呈現(xiàn)效果,由于 PDF 中無表格,所有每頁得到的都是空!
補(bǔ)充
當(dāng)然Python除了讀取PDF文件,還有一些其他功能,例如加密PDF,旋轉(zhuǎn)和疊加頁面等,下面是實現(xiàn)的示例代碼
旋轉(zhuǎn)和疊加頁面
import PyPDF2 from PyPDF2.pdf import PageObject # 創(chuàng)建一個讀PDF文件的Reader對象 reader = PyPDF2.PdfFileReader('resources/XGBoost.pdf') # 創(chuàng)建一個寫PDF文件的Writer對象 writer = PyPDF2.PdfFileWriter() # 對PDF文件所有頁進(jìn)行循環(huán)遍歷 for page_num in range(reader.numPages): # 獲取指定頁碼的Page對象 current_page = reader.getPage(page_num) # type: PageObject if page_num % 2 == 0: # 奇數(shù)頁順時針旋轉(zhuǎn)90度 current_page.rotateClockwise(90) else: # 偶數(shù)頁反時針旋轉(zhuǎn)90度 current_page.rotateCounterClockwise(90) writer.addPage(current_page) # 最后添加一個空白頁并旋轉(zhuǎn)90度 page = writer.addBlankPage() # type: PageObject page.rotateClockwise(90) # 通過Writer對象的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)) # 通過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() # 獲取水印頁 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) # 將原始頁和水印頁進(jìn)行合并 writer.addPage(current_page) # 將PDF寫入文件 with open('resources/XGBoost-watermarked.pdf', 'wb') as file: writer.write(file)
原文鏈接:https://juejin.cn/post/7129692963273179149
相關(guān)推薦
- 2021-12-11 Docker容器編譯LNMP的實現(xiàn)示例_docker
- 2022-03-14 Token跨域問題Response to preflight request doesn‘t pas
- 2022-04-22 uniapp小程序報錯 TypeError: Cannot read property ‘call‘
- 2022-08-12 Python中深拷貝與淺拷貝的區(qū)別介紹_python
- 2022-06-25 C++鏈表類的封裝詳情介紹_C 語言
- 2022-04-26 Jquery+bootstrap實現(xiàn)表格行置頂置底上移下移操作詳解_jquery
- 2022-03-29 python中format函數(shù)與round函數(shù)的區(qū)別_python
- 2022-03-16 Nginx配置SSL和WSS步驟介紹_nginx
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支