獲取PDF中的布局信息——如何獲取段落

? PDF解析是極其復雜的問題。不可能靠一個工具解決全部問題,尤其是五花八門,格式不統一的PDF文件。除非有鈔能力。如果沒有那就看看可以分為哪些問題。

? 提取文本內容,提取表格內容,提取圖片。我認為這些應該是分開做的事情。python有一些組件,是有專長的。

? 問題分解以后,最重要的一個事情是,版面分析。怎么確定邊界,就是哪一塊是什么內容?是正文,還是表格,還是圖片?

??文本、圖片及形狀涵蓋了常見的PDF元素,本文介紹利用PyMuPDF提取這些頁面元素,及其基本數據結構。本文會提供可運行的代碼!

一、技術選型?PyMuPDF

PyMuPDFTextpage對象提供的extractDICT()extractRAWDICT()用以獲取頁面中的所有文本和圖片(內容、位置、屬性),基本數據結構如下:

看到這里,有分類,有位置信息。

二、代碼演示

2.1 安裝

pip install PyMuPDF

2.2 demo代碼?

import fitz  # PyMuPDFdef extract_text_blocks(pdf_path):# 打開 PDF 文件pdf_document = fitz.open(pdf_path)# 存儲文本塊和行塊信息text_blocks = []line_blocks = []# 遍歷 PDF 中的每一頁for page_number in range(len(pdf_document)):page = pdf_document.load_page(page_number)# 獲取文本塊和行塊信息blocks = page.get_text("dict")["blocks"]for b in blocks:for l in b["lines"]:line_blocks.append({"line": l["spans"],"bbox": l["bbox"],"height": l["bbox"][3] - l["bbox"][1]  # 計算行塊的高度})text_blocks.append({"block": b["lines"],"bbox": b["bbox"]})# 關閉 PDF 文件pdf_document.close()return text_blocks, line_blocks# 示例用法
pdf_path = "D:\\angus\\py\\困難pdf節選西藏奇正2022.pdf"
text_blocks, line_blocks = extract_text_blocks(pdf_path)# 打印提取的文本塊信息
for index, block in enumerate(text_blocks):print(f"Text Block {index + 1}:")for line_index, line in enumerate(block["block"]):print(f"  Line {line_index + 1}: '{line['spans']}' at position {block['bbox']}")# 打印提取的行塊信息
for index, line in enumerate(line_blocks):print(f"Line {index + 1}: '{line['line']}' at position {line['bbox']}, height={line['height']}")

三、效果展示

3.1 原文PDF內容

?3.2 解析后得到的結果

?3.3 分析原文和結果

對比輸出的結果和原文。我們可以發現,我們拿到了行的數據,也拿到了段落的數據。上述的代碼中已經給我們分好了塊!這樣解可以區分段落了。

3.4 獲取更多信息,包括位置

來看一個文本塊:

  1. size: 文本的大小。
  2. flags: 文本的標志。
  3. font: 字體名稱。
  4. color: 字體顏色。
  5. ascender: 文本的上升高度。
  6. descender: 文本的下降高度。
  7. text: 文本內容。
  8. origin: 文本的起始位置坐標。
  9. bbox: 文本的邊界框坐標,即左下角和右上角的坐標。

通過這些信息,我們可以獲取到每個文本塊的具體內容、大小、位置和格式等信息。這些信息對于分析和處理 PDF 文件中的文本內容非常有用。例如,你可以根據文本的大小、位置和格式來識別標題、正文和其他內容,并進行相應的處理和分析。當然,就以這個文檔為例,我們可以看到的是,因為文檔本身字體大小都一樣,所以很難根據字體和大小獲取到標題。

四、錯誤問題

?但是也發現了問題

4.1 段落有被分開了

原文

錯誤的問題如下

4.2 將表格錯當成了文本內容

原文表格內容如下

?

解析得到的內容如下

表格的一行為一個塊內容,

這里調試了一版,可以去掉表格。

邏輯是:判斷相鄰的block,表格的特征是,當個block內的 lines的 bbox的第四位是相同的。且相鄰的block的lines一定是相同的,且lines不為空。邏輯本身沒有問題,就怕PDF有問題,識別出來的表格的同一行的bbox中的第四位不一樣,這樣會錯誤判斷!

import fitz  # PyMuPDFdef is_table_block(b1, b2):# 檢查連續相鄰的文本塊是否具有相同的行數,并且其 bbox 的高度也相同if len(b1["lines"]) == len(b2["lines"]) and b1["bbox"][3] - b1["bbox"][1] == b2["bbox"][3] - b2["bbox"][1]:return Truereturn Falsedef extract_text_blocks(pdf_path):# 打開 PDF 文件pdf_document = fitz.open(pdf_path)# 存儲文本塊信息text_blocks = []line_blocks = []# 遍歷 PDF 中的每一頁for page_number in range(len(pdf_document)):page = pdf_document.load_page(page_number)# 獲取文本塊和行塊信息blocks = page.get_text("dict")["blocks"]for i in range(len(blocks)):if i < len(blocks) - 1 and is_table_block(blocks[i], blocks[i+1]):  # 如果是表格,則跳過continuefor l in blocks[i]["lines"]:line_blocks.append({"line": l["spans"],"bbox": l["bbox"],"height": l["bbox"][3] - l["bbox"][1]  # 計算行塊的高度})text_blocks.append({"block": blocks[i]["lines"],"bbox": blocks[i]["bbox"]})# 關閉 PDF 文件pdf_document.close()return text_blocks, line_blocks# 示例用法
pdf_path = "D:\\angus\\py\\困難pdf節選西藏奇正2022.pdf"
text_blocks, line_blocks = extract_text_blocks(pdf_path)# 打印提取的文本塊信息
# 用于檢查兩個文本塊中的行是否相同
def check_lines_same(block1, block2):num_lines_block1 = len(block1["block"])num_lines_block2 = len(block2["block"])return num_lines_block1 == num_lines_block2for index, block in enumerate(text_blocks):# 獲取當前文本塊中行的個數num_lines = len(block["block"])# 如果當前文本塊是表格,則繼續檢查下一個文本塊是否是表格if num_lines > 1 and index < len(text_blocks) - 1:  # 需要多于一行,并且不是最后一個文本塊next_block = text_blocks[index + 1]if check_lines_same(block, next_block):# 如果下一個文本塊也是表格,則跳過,不進行打印輸出continue# 如果當前文本塊不是表格,則打印輸出print(f"Text Block {index + 1}:")for line_index, line in enumerate(block["block"]):print(f"  Line {line_index + 1}: '{line['spans']}' at position {block['bbox']}")# 打印提取的行塊信息
# for index, line in enumerate(line_blocks):
#     print(f"Line {index + 1}: '{line['line']}' at position {line['bbox']}, height={line['height']}")

4.3 解析丟失整行數據

測試了另外一個法律法規文件。

發現文件丟失了。原文件內容如下:

解析后的:

還沒找到bug的原因。?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/711871.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/711871.shtml
英文地址,請注明出處:http://en.pswp.cn/news/711871.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

百度百科數據爬取 python 詞條數據獲取

最近需要補充一些電力名詞的解釋&#xff0c;尤其是文字相關內容。百度百科上的詞條質量有差異&#xff0c;因此我們需要先手工選擇一些高質量詞條。 假設我們選擇了互感器頁面中的儀用變壓器詞條&#xff0c;首先&#xff1a; import requests from bs4 import BeautifulS…

DataSpell 2023:專注于數據,加速您的數據科學之旅 mac/win版

JetBrains DataSpell 2023是一款專為數據科學家和數據分析師設計的集成開發環境&#xff08;IDE&#xff09;。這款IDE提供了強大的數據分析和可視化工具&#xff0c;旨在幫助用戶更快速、更高效地進行數據科學工作。 DataSpell 2023軟件獲取 DataSpell 2023在保持其一貫的數…

【多線程】常見鎖策略詳解(面試常考題型)

目錄 &#x1f334; 樂觀鎖 vs 悲觀鎖&#x1f38d;重量級鎖 vs 輕量級鎖&#x1f340;自旋鎖&#xff08;Spin Lock&#xff09;&#x1f38b;公平鎖 vs ?公平鎖&#x1f333;可重?鎖 vs 不可重?鎖&#x1f384;讀寫鎖?相關面試題 常?的鎖策略 注意: 接下來講解的鎖策略不…

udp丟包問題研究

//發現udp 有收不到數據包現象. 一: 觀察丟包 1. ifconfig enp8s0 2. netstat -s -u 二: 修改系統緩存參數. recv_buffer_size 修改系統buffer_size sysctl -w net.core.rmem_max26214400 sysctl -w net.core.rmem_default26214400 三: 應用程序考慮 av_dict_set(&m_o…

cpp基礎學習筆記03:類型轉換

static_cast 靜態轉換 用于類層次結構中基類和派生類之間指針或者引用的轉換。up-casting (把派生類的指針或引用轉換成基類的指針或者引用表示)是安全的&#xff1b;down-casting(把基類指針或引用轉換成子類的指針或者引用)是不安全的。用于基本數據類型之間的轉換&#xff…

【C# 】進度條控件 ProgressBar 使用

進度條控件ProgressBar控件&#xff0c;一般作為UI界面表示某個事情進行到某個程度的外觀的體現。 那么進度條控件ProgressBar控件&#xff0c;在form中是怎么使用的呢&#xff1f; 該控件必須要用的屬性如下&#xff1a; private System.Windows.Forms.ProgressBar progressB…

Flutter Version Manager (FVM): Flutter的版本管理終極指南

Flutter筆記 Flutter Version Manager (FVM) - 文章信息 - Author: 李俊才 (jcLee95) Visit me at: https://jclee95.blog.csdn.netEmail: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_28550263/article/details/136300307 my-websit…

SQL-Labs靶場“26-28”關通關教程

君衍. 一、二十六關 基于GET過濾空格以及注釋報錯注入1、源碼分析2、繞過思路3、updatexml報錯注入 二、二十六a關 基于GET過濾空格注釋字符型注入1、源碼分析2、繞過思路3、時間盲注 三、二十七關 基于union及select的過濾單引號注入1、源碼分析2、繞過思路3、聯合查詢注入4、…

laravel cache

一、基本操作 Cache::put() 創建緩存&#xff08;鍵&#xff0c;值&#xff0c;有效期&#xff08;單位是秒&#xff09;&#xff09; Cache::get() 獲取緩存 Cache::add() 只會在緩存項不存在的情況下添加數據到緩存&#xff0c;如果數據被成功返回 true&#xff0c;否則&…

Android在后臺讀取UVC攝像頭的幀數據流并推送

Android在后臺讀取UVC攝像頭的幀數據流并推送 添加UvcCamera依賴庫 使用原版的 saki4510t/UVCCamera 在預覽過程中斷開可能會閃退&#xff0c;這里使用的是 jiangdongguo/AndroidUSBCamera 中修改的版本&#xff0c;下載到本地即可。 https://github.com/jiangdongguo/AndroidU…

Rust學習筆記:基礎工具和基本名詞

不要用共享內存來通信&#xff0c;要用通信來共享內存 rustup: 一個用于管理 Rust 版本和相關工具的命令行工具 rustup update cargo: Rust 的構建系統和包管理工具 構建代碼下載依賴庫并構建下載庫 crate: 代碼包/庫 trait: 特性、功能 ///: 生成 html 格式的 doc&#…

CELL文獻速遞 | 了解微生物如何在社會中傳播并塑造我們的健康

谷禾健康 當人還是嬰兒時&#xff0c;會從父母那里得到微生物&#xff1b;和寵物玩耍或接觸時&#xff0c;也會從寵物那得到微生物&#xff1b;有時候人沒有直接和動物玩耍&#xff0c;只是接觸動物的糞便&#xff0c;甚至其他環境的微生物&#xff0c;都會交換微生物... 這些其…

智慧治水丨計訊物聯水利RTU助推小型水庫出險加固工程建設與管理

日前&#xff0c;水利部印發《關于健全小型水庫除險加固和運行管護機制的意見》&#xff08;以下簡稱《意見》&#xff09;&#xff0c;健全小型水庫除險加固和運行管護常態化機制&#xff0c;提高小型水庫安全管理水平。《意見》提出了“十四五”的兩大管理機制&#xff0c;通…

adb下載安裝及使用教程

adb下載安裝及使用教程 一、ADB的介紹1.ADB是什么&#xff1f;2.內容簡介3.ADB常用命令1. ADB查看設備2. ADB安裝軟件3. ADB卸載軟件4. ADB登錄設備shell5. ADB從電腦上發送文件到設備6. ADB從設備上下載文件到電腦7. ADB顯示幫助信息 4.為什么要用ADB 二、ADB的下載1.Windows版…

Flutter GetX 之 暗黑模式

我們緊接上篇文章,今天繼續講解一下強大的 GetX 的另一個功能,就是 暗黑模式 ,在iOS 13開始蘋果的應用慢慢的都開始適配 暗黑模式,andr。oid 也慢慢的 開始跟進,截止到目前,商店的大部分應用都已經完成了 暗黑模式 的適配。 原生開發為我們提供對應的 API,那么Flutter呢…

機器學習相關概念及術語總結

目錄 1.機器學習2.監督學習3.無監督學習4.線性回歸5.邏輯回歸 1.機器學習 機器學習的定義&#xff1a;一個計算機程序可從經驗E&#xff08;Experience&#xff09;中學習如何完成任務T&#xff08;Task&#xff09;&#xff0c;并且隨著經驗E的增加&#xff0c;性能指標P&…

Python中reduce函數和lambda表達式的學習

reduce函數將一個數據集合&#xff08;鏈表&#xff0c;元組等&#xff09;中的所有數據進行下列操作&#xff1a;用傳給 reduce 中的函數 function&#xff08;有兩個參數&#xff09;先對集合中的第 1、2 個元素進行操作&#xff0c;得到的結果再與第三個數據用 function 函數…

【論文精讀】DINOv2

摘要 學習與特定任務無關的預訓練表示已經成為自然語言處理的標準&#xff0c;這些表示不進行微調&#xff0c;即可在下游任務上明顯優于特定任務模型的性能。其主要得益于使用無監督語言建模目標對大量原始文本進行預訓練。 遵循NLP中的這種范式轉變&#xff0c;以探索計算機視…

iSlide插件2024免費版(包含52 個PPT設計輔助功能,9 大在線資源庫,以及超 50 萬 專業)

一、功能介紹 iSlide是一款專為PowerPoint設計的插件&#xff0c;它集合了眾多設計與效率提升的功能&#xff0c;幫助用戶更快速、更美觀地制作演示文稿。 主題設計&#xff1a;提供多種設計主題&#xff0c;用戶只需一鍵應用&#xff0c;即可為幻燈片賦予統一的視覺風格。智…

每次提出一個bug都讓測試重現,描述得那么清楚,自己操作下不會嗎?

一說到測試和開發的關系&#xff0c;你一定會想到一個詞“冤家”。 開發的工作就是按照PM的設計將產品最終造出來&#xff0c;而測試則是在開發已完成的工作里糾錯。so&#xff0c;測試的工作會讓開發很不爽&#xff0c;人之常情&#xff0c;誰都不喜歡自己的勞動成果被別人挑…