網站首頁 編程語言 正文
實戰場景
Python 工程師在日常的工作中,經常會碰到解析和處理PDF文件的情況,實戰中需求主要分為如下情況:
- 提取 PDF 中的文字
- 將 PDF 中每頁轉換為圖片
- word 轉換為PDF
- PDF生成,編輯,導入導出
- PDF在線渲染
除了最后一項需要前端配合以外,其余內容都可以直接在 python 端進行實現。
本次實戰選擇 pdfplumber
庫進行學習,可以提前安裝該庫,不過有一點需要注意,該庫主要用于讀取 PDF 進行操作,寫入和編輯無法實現,即本文學習一款專注于 PDF 內容提取的庫。
> pip install pdfplumber -i https://pypi.tuna.tsinghua.edu.cn/simple
pdfplumber
庫具備如下特點:
- 可以訪問PDF對象中的任意元素詳細信息;
- 可以提取文本和表格,而且用法簡單;
- 集成了可視化調試。
Python PDF 實戰編碼
下面可以編寫 PDF 操作的基礎代碼。
import pdfplumber with pdfplumber.open('./dddd.pdf') as pdf: for page in pdf.pages: print(page.extract_text()) # 每頁打印一分頁分隔 print('---------- 分頁分隔 ----------')
導入 pdfplumber
模塊之后,使用 pdfplumber.open('./dddd.pdf')
打開本地 pdf 文件,然后通過 pdf.pages
遍歷所有頁,在通過頁對象的 .extract_text()
方法,提取文本信息。
pdfplumber.open() 方法的簽名如下所示:
pdfplumber.open("文件名", password = "密碼", laparams = { "line_overlap": 0.7 })
其中各參數描述如下:
-
file_name
:文件名,必選參數; -
password
:PDF的密碼; -
laparams
:布局參數。
除此之外,如果希望讀取 PDF,還可以使用 load()
方法,該方法也會返回 pdfplumber.PDF
類的實例。
pdfplumber.PDF
對象實例,主要有兩個重要屬性:
-
.metadata
:從PDF的Info中獲取元數據鍵 /值對字典。 通常包括“ CreationDate”,“ ModDate”,“ Producer”等; -
.pages
:包含pdfplumber.Page
實例的列表,每一個實例代表PDF每一頁的信息。
上文提及的 pdfplumber.Page
實例是 pdfplumber
的核心,后續對 PDF 的操作大量圍繞該類的屬性和方法實施,其重要屬性如下所示:
-
page_number
:頁碼順序,第一頁的序號是 1; -
witdh
:寬度; -
height
:高度; -
.objects/.chars/.lines/.rects/.curves/.figures/.images
:獲取PDF頁中的重要數據。
核心方法如下所示:
-
extract_text()
:提取頁中的文本; -
extract_words()
:提取所有單詞及其相關信息; -
extract_tables()
: 提取頁面的表格。
extract_text()
呈現結果
extract_words()
呈現結果
extract_tables()
呈現效果,由于 PDF 中無表格,所有每頁得到的都是空!
補充
當然Python除了讀取PDF文件,還有一些其他功能,例如加密PDF,旋轉和疊加頁面等,下面是實現的示例代碼
旋轉和疊加頁面
import PyPDF2 from PyPDF2.pdf import PageObject # 創建一個讀PDF文件的Reader對象 reader = PyPDF2.PdfFileReader('resources/XGBoost.pdf') # 創建一個寫PDF文件的Writer對象 writer = PyPDF2.PdfFileWriter() # 對PDF文件所有頁進行循環遍歷 for page_num in range(reader.numPages): # 獲取指定頁碼的Page對象 current_page = reader.getPage(page_num) # type: PageObject if page_num % 2 == 0: # 奇數頁順時針旋轉90度 current_page.rotateClockwise(90) else: # 偶數頁反時針旋轉90度 current_page.rotateCounterClockwise(90) writer.addPage(current_page) # 最后添加一個空白頁并旋轉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文件,方法的參數就是rre #設置的密碼 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) # 將原始頁和水印頁進行合并 writer.addPage(current_page) # 將PDF寫入文件 with open('resources/XGBoost-watermarked.pdf', 'wb') as file: writer.write(file)
原文鏈接:https://juejin.cn/post/7129692963273179149
相關推薦
- 2022-06-29 docker容器狀態轉換管理命令實例詳解_docker
- 2022-05-09 shell腳本編程Makefile的使用_linux shell
- 2022-08-28 failed to configure a datasource: ‘url‘ attribute
- 2022-06-30 C++四種case的詳細介紹小結_C 語言
- 2022-06-29 python人工智能tensorflow構建循環神經網絡RNN_python
- 2022-10-01 Go語言異步API設計的扇入扇出模式詳解_Golang
- 2022-12-07 C語言程序中結構體的內存對齊詳解_C 語言
- 2022-10-04 混合棧跳轉導致Flutter頁面事件卡死問題解決_IOS
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支