在數據處理和分析領域,PDF 文件常常包含豐富的文本、表格和圖形信息。然而,從 PDF 中提取這些數據并非易事,尤其是當需要保留格式和顏色信息時。幸運的是,Python 社區提供了多個強大的庫來幫助我們完成這項任務,其中最常用的兩個庫是 PyMuPDF 和 pdfplumber。本文將詳細介紹這兩個庫的特點、使用方法,并通過實際案例對比它們的優缺點。
一、PyMuPDF 和 pdfplumber 簡介
1. PyMuPDF (fitz)
PyMuPDF 是一個基于 MuPDF 的高性能 Python 庫,用于處理 PDF 文件。它支持多種功能,包括文本提取、圖像提取、表格提取、頁面渲染等。PyMuPDF 的底層是用 C++ 編寫的,因此在處理大型文件時表現出色。
2. pdfplumber
pdfplumber 是一個基于 pdfminer.six 的 Python 庫,專注于從 PDF 文件中提取文本、表格和圖像。它提供了簡單直觀的 API,適合需要精確文本位置和表格提取的場景。
二、安裝方法
PyMuPDF
pip install pymupdf
PyMuPDF 支持 Python 3.8 及以上版本。
pdfplumber
pip install pdfplumber
pdfplumber 適合 Python 3.8、3.9、3.10 和 3.11。
三、功能對比
1. 文本提取
- PyMuPDF:支持多種文本提取格式,包括純文本、HTML、JSON 和 XML。
- pdfplumber:提取文本時保留原始布局,支持自定義提取參數,如
x_tolerance
和y_tolerance
。
2. 表格提取
- PyMuPDF:可以提取表格結構,但需要手動解析 JSON 或字典格式。
- pdfplumber:提供了更直觀的表格提取方法,支持直接將表格數據轉換為 Pandas DataFrame。
3. 圖像提取
- PyMuPDF:支持提取頁面中的所有圖像,并可以將頁面渲染為圖像。
- pdfplumber:支持提取圖像,但功能相對有限。
4. 性能
- PyMuPDF:處理速度更快,適合處理大型 PDF 文件。
- pdfplumber:在提取文本和表格時速度較慢,但提取精度更高。
四、實戰案例
1. 提取文本
PyMuPDF
import fitz # PyMuPDFdef extract_text_from_pdf(file_path, output_path):doc = fitz.open(file_path)full_text = ""for page in doc:full_text += page.get_text()doc.close()with open(output_path, "w", encoding="utf-8") as file:file.write(full_text)return f"文本已保存到 {output_path}"result = extract_text_from_pdf("example.pdf", "output.txt")
print(result)
pdfplumber
import pdfplumberwith pdfplumber.open("example.pdf") as pdf:first_page = pdf.pages[0]text = first_page.extract_text()print(text)
2. 提取表格
PyMuPDF
import fitz # PyMuPDFdoc = fitz.open("example.pdf")
page = doc[0]
table_data = page.get_text("dict")
print(table_data)
pdfplumber
import pdfplumber
import pandas as pdwith pdfplumber.open("example.pdf") as pdf:page = pdf.pages[0]table = page.extract_table()df = pd.DataFrame(table[1:], columns=table[0])print(df)
3. 提取圖像
PyMuPDF
import fitz # PyMuPDFdoc = fitz.open("example.pdf")
page = doc[0]
for img_index, img in enumerate(page.get_images(full=True)):xref = img[0]base_image = doc.extract_image(xref)img_bytes = base_image["image"]with open(f"page_{page.number+1}_img_{img_index+1}.png", "wb") as f:f.write(img_bytes)
pdfplumber
import pdfplumberwith pdfplumber.open("example.pdf") as pdf:page = pdf.pages[0]for img in page.images:x0, y0, x1, y1 = img["x0"], img["y0"], img["x1"], img["y1"]im = page.to_image().originalcropped_im = im.crop((x0, y0, x1, y1))cropped_im.save(f"page_{page.page_number}_img_{img['object_type']}.png")
五、總結與推薦
1. PyMuPDF
- 優點:高性能、功能全面,支持多種格式提取。
- 缺點:API 較復雜,文檔相對較少。
- 適用場景:適合處理大型 PDF 文件,需要提取多種格式數據。
2. pdfplumber
- 優點:API 簡單直觀,提取精度高,適合文本和表格提取。
- 缺點:性能稍弱,圖像提取功能有限。
- 適用場景:適合需要精確提取文本和表格的場景。
推薦
- 如果你需要高效處理大型 PDF 文件,并且需要提取多種格式數據,推薦使用 PyMuPDF。
- 如果你需要精確提取文本和表格,并且對提取精度要求較高,推薦使用 pdfplumber。
通過本文的介紹,希望你對這兩個庫有了更深入的了解,并能夠根據自己的需求選擇合適的工具。無論是 PyMuPDF 還是 pdfplumber,它們都能為你的 PDF 數據提取任務提供強大的支持。