攝影或3C

Python:如何使用 PyMuPDF (import fitz ) 提取 PDF 文本區塊並存儲為 DataFrame ; text: List[ Tuple[float|str|int] ] = page.get_text(“blocks”)

加入好友加入好友
加入社群加入社群
Python:如何使用 PyMuPDF (import fitz ) 提取 PDF 文本區塊並存儲為 DataFrame ; text: List[ Tuple[float|str|int] ] = page.get_text("blocks") - 儲蓄保險王Python:如何使用 PyMuPDF (import fitz ) 提取 PDF 文本區塊並存儲為 DataFrame ; text: List[ Tuple[float|str|int] ] = page.get_text("blocks") - 儲蓄保險王

以下是一段 Python 教學,
展示如何使用 PyMuPDF (也稱 fitz)
從 PDF 文件中提取每一頁的文本區塊內容,
並將其存儲到 pandas DataFrame 中。


需求背景

PDF 文件通常包含多種數據,
比如文本、圖片或矢量圖形。這段代碼的目的是:

  1. 遍歷多個 PDF 文件。
  2. 提取每個 PDF 文件每一頁的文本區塊(包括文本的坐標)。
  3. 將提取的數據存儲為結構化的表格(pandas DataFrame),便於後續分析。

代碼詳解

1. 基本代碼結構

以下是完整代碼:

import os
import fitz  # PyMuPDF
import pandas as pd
from typing import List, Tuple

# 假設 pathes 是包含 PDF 文件路徑的列表
pathes = ["path/to/pdf1.pdf", "path/to/pdf2.pdf"]

for pdf_path in pathes:
    # 獲取 PDF 文件的基礎名稱無擴展名
    main_fname_pdf = os.path.splitext(os.path.basename(pdf_path))[0]
    
    # 打開 PDF 文件
    doc = fitz.open(pdf_path)
    
    # 初始化用於存儲數據的列表
    data = []
    
    # 遍歷 PDF 的每一頁提取文字內容
    for page_num in range(len(doc)):
        page = doc[page_num]
        
        # 提取文本區塊返回一個包含多個區塊的列表
        text: List[Tuple[float, float, float, float, str, int, int]] = page.get_text("blocks")
        """
        [(18.0,   #x0
        13.59375, #y0
        166.0,    #x1
        21.59375, #y1
        'Confidential:20230901203757478_110548\n', #content
        0, #block_no
        0 #block_type),...]
        block_no在頁面中的順序
        block_type區塊的類型(0: 文本,1: 圖片,2: 矢量圖形
        """
        
        # 遍歷每個文本區塊
        for block in text:
            x0, y0, x1, y1, content, block_no, block_type = block
            
            # 僅處理文本類型的區塊block_type == 0)
            if block_type == 0:
                data.append([page_num + 1, x0, y0, x1, y1, content.strip()])
    
    # 將提取的數據轉為 pandas DataFrame
    df = pd.DataFrame(data, columns=["Page", "x0", "y0", "x1", "y1", "Text"])
    
    # 保存到 CSV 文件可選
    output_csv_path = f"{main_fname_pdf}_output.csv"
    df.to_csv(output_csv_path, index=False)
    print(f"已成功處理並保存文件:{output_csv_path}")

代碼拆解與說明

1. 文件路徑處理
main_fname_pdf = os.path.splitext(os.path.basename(pdf_path))[0]

os.path.basename(pdf_path): 獲取文件名稱(包含擴展名)。

os.path.splitext(...): 去掉文件擴展名,僅保留基礎名稱。

這樣可以方便生成輸出文件名稱。

2. 打開 PDF 文件
doc = fitz.open(pdf_path)
使用 fitz.open 打開 PDF 文件。

doc 是一個 PDF 文檔對象,包含所有頁面的數據。

3. 遍歷每一頁的內容
for page_num in range(len(doc)):
page = doc[page_num]

len(doc): 返回 PDF 的頁數。

doc[page_num]: 獲取對應頁面的內容。

4. 提取文本區塊
text: List[Tuple[float, float, float, float, str, int, int]] = page.get_text("blocks")
調用 page.get_text("blocks") 提取文本區塊,返回一個列表,每個元素是一個區塊,包含以下信息:

x0, y0: 區塊左上角的坐標。

x1, y1: 區塊右下角的坐標。

content: 區塊的文本內容。

block_no: 區塊在頁面中的順序。

block_type: 區塊類型(0: 文本,1: 圖片,2: 矢量圖形)。

5. 過濾文本區塊並存儲數據
if block_type == 0:
data.append([page_num + 1, x0, y0, x1, y1, content.strip()])

只處理文本類型的區塊(block_type == 0)。

使用 content.strip() 去除文本內容的首尾空格。

將每頁的數據存儲到 data 列表中。

6. 轉換為 DataFrame
df = pd.DataFrame(data, columns=["Page", "x0", "y0", "x1", "y1", "Text"])
data 是一個包含多個行的列表,每行對應一個文本區塊的數據。

使用 pandas.DataFrame 將數據轉換為結構化表格,方便後續處理。

7. 選擇性保存

df.to_csv(output_csv_path, index=False)
將提取的數據保存為 CSV 文件,文件名稱基於 PDF 的基礎名稱生成。


輸出示例

 結語

這段代碼展示了如何使用
PyMuPDF 提取 PDF 的結構化文本數據,
並將其轉換為可分析的格式(DataFrame)。
通過這種方式,你可以方便地處理文本內容,
進行進一步分析或存儲。

推薦hahow線上學習python: https://igrape.net/30afN

儲蓄保險王

儲蓄險是板主最喜愛的儲蓄工具,最喜愛的投資理財工具則是ETF,最喜愛的省錢工具則是信用卡