1 需求描述
最近工作需要從PDF文檔中按照章節(jié)解析出對應的文本和圖片(后續(xù)可能還會有表格),經過調研,找到了一個功能強大的解析工具MuPDF,對應的Python包是PyMuPDF。本篇博客記錄使用它來實現(xiàn)具體功能。
官方文檔:https://pymupdf.readthedocs.io/en/latest/index.html
2 利用書簽中標題劃分章節(jié)
在PDF中,點擊書簽或者目錄頁中具體一個標題時,文檔頁面會跳轉到對應的章節(jié),“跳轉”的實現(xiàn)說明了其背后有一套機制(交叉引用),記錄了各級標題和正文頁面的對應關系。
PyMuPDF解析書簽中各層級標題的接口為Document.get_toc(),該接口可以返回書簽的層級、名稱、點擊它跳轉到的頁碼及具體到目標頁的哪個位置。
-
接口介紹
get_toc(simple=True/False)
# 參數(shù)simple=True時,返回簡單版本的各級目錄,包括[標題層級, 標題名稱,跳轉到的頁碼],例如: [ 2, // 第二級 '旅行規(guī)劃', // 名稱 9, // 對應正文的第9頁(該字段index從1開始) ]
# 參數(shù)simple=False時,在跳轉到的頁碼基礎上,增加了'to'指向跳轉頁具體的坐標點(x, y) [2, '用戶手冊介紹 ', 9, {'kind': 1, 'xref': 3112, 'page': 8, 'to': Point(43.937, 29.877015), 'zoom': 0.0, 'collapse': False }]
-
詳細文檔
利用對書簽的解析,獲取到了:
(1)文檔的層級關系: 包含多少第一級大標題、每個第一級標題下又有多少二級標題,以此類推可以獲取完整的文檔結構;
(2)每一級標題在正文中的頁面范圍,例如從第3頁(43,40)到第5頁的(253, 400)。
因此可以實現(xiàn)按照章節(jié)的拆分。
3 基于章節(jié)的文本解析
劃分章節(jié)后,每一章節(jié)在正文中的位置由:起始頁面、起始頁面的坐標、結束頁面、結束頁面坐標描述,例如,start_page = 5, (start_x = 43, start_y = 36),end_page = 8, (end_x = 134, end_y=238)。
-
起始頁和結束頁只需要解析該章節(jié)范圍內的文字,選擇使用Page.get_textbox()方法獲取矩形框rect范圍內的文字:
-
中間頁需要在獲取頁面全部范圍內的文字后,過濾頁眉和頁腳。因此選擇使用Page.get_text(“blocks”)方法按塊獲取該頁內所有段落的坐標、文字內容及類型(文本、圖片),然后根據(jù)坐標過濾掉頁眉、頁碼等不需要的文字內容。
-
文本亂序問題:作者插入順序可能不是按照閱讀順序,導致解析出來的文字出現(xiàn)了亂序,例如第5行的文字解析出來之后在第10行文字的后面;解決亂序問題主要是通過設置參數(shù)sort=True(默認為False),將解析的文本按照坐標排序,來獲得按照自然閱讀順序的文本。
-
單雙列布局問題:雙列布局的頁面,根據(jù)頁碼的坐標來區(qū)分是左側還是右側。
4 掃描PDF解析
圖片掃描成的PDF并不是按照PDF標準形成的文檔,沒有包含文本信息,按照 3 中的方法獲取的文本是空的。
其中一種解決方法是使用OCR獲取圖片中的文本:
(1)OCR的工具有多種,如PyMuPDF文檔提及的OCRMyPDF(免費)。選擇OCRMyPDF的話需要配置依賴的兩個軟件:tesseract和gs,并且由于OCRMyPDF默認的文字識別模型支持英文,在中文情況下需下載對應的中文識別模型。

?
(2)OCR獲取文字會存在識別錯誤的情況,要考慮識別錯誤對后續(xù)處理是否會造成影響。
5 基于章節(jié)的圖片解析
-
使用Page.get_image_info(hashes=False, xrefs=False)接口獲取圖片的元信息,包括圖片的原始寬高、嵌入到pdf后的bbox以及交叉引用的序號xref;獲取元信息主要是為了使用位置信息來判斷圖片屬于哪個章節(jié);文章來源:http://www.zghlxwxcb.cn/news/detail-680495.html
-
然后使用Document.extract_image(xref)根據(jù)元信息中的xref獲取存儲的圖片信息并保存;文章來源地址http://www.zghlxwxcb.cn/news/detail-680495.html
6 小結
- 最近解析文檔最大收獲在于:要明確自己的需求,根據(jù)需求去選擇工具;PyMuPDF提供的接口功能很強大,面對布局多樣的文檔,不要急于動手,可以多查閱官方文檔尋找更合適的接口,在此基礎上設計方案。
- 分享發(fā)現(xiàn)的寶藏博客,博主的系列文章記錄了使用PyMuPDF將pdf文檔轉為word的過程。
到了這里,關于工具分享 | PDF文檔解析工具PyMuPDF的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!