以下是一段 Python 教學,
展示如何使用 PyMuPDF (也稱 fitz
)
從 PDF 文件中提取每一頁的文本區塊內容,
並將其存儲到 pandas DataFrame
中。
需求背景
PDF 文件通常包含多種數據,
比如文本、圖片或矢量圖形。這段代碼的目的是:
- 遍歷多個 PDF 文件。
- 提取每個 PDF 文件每一頁的文本區塊(包括文本的坐標)。
- 將提取的數據存儲為結構化的表格(
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. 轉換為 DataFramedf = 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