
Python自动化操作PDF主要使用PyPDF2、pdfplumber、pandas、pymupdf、camelot-py、pillow等主流库,涵盖文本提取、表格提取、图片提取等高频需求,合理使用能提升自动化的水平与文档处理效率。
pip install PyPDF2 pdfplumber pandas pymupdf camelot-py pillowimport PyPDF2
def extract_text_pypdf2(pdf_path):
"""提取PDF中的文字内容"""
with open(pdf_path, 'rb') as file:
pdf_reader = PyPDF2.PdfReader(file)
text = ""
for page in pdf_reader.pages:
text += page.extract_text()
return text
# 使用示例
text_content = extract_text_pypdf2("E:\learn\云上业务稳定性.pdf")
print(text_content)代码运行结果:

import pdfplumber
import pandas as pd
def extract_pdf_content(pdf_path):
"""使用 pdfplumber 提取 PDF 的文字、表格、图片信息"""
results = {
'text': '',
'tables': [],
'images': []
}
with pdfplumber.open(pdf_path) as pdf:
for page in pdf.pages:
# 1. 文字
text = page.extract_text()
if text:
results['text'] += text + '\n'
# 2. 表格
tables = page.extract_tables()
for table in tables:
if table:
df = pd.DataFrame(table[1:], columns=table[0])
results['tables'].append(df)
# 3. 图片(兼容新版本)
for img in page.images:
results['images'].append({
'page': page.page_number,
'bbox': (img['x0'], img['y0'], img['x1'], img['y1']),
'width': img.get('width'),
'height': img.get('height')
})
return results
# 使用示例
if __name__ == '__main__':
content = extract_pdf_content(r"example.pdf")
print('文字内容:', content['text'][:500])
print('表格数量:', len(content['tables']))
print('图片数量:', len(content['images']))代码运行结果:

import fitz
from PIL import Image
import io
def extract_pdf_fitz(pdf_path):
doc = fitz.open(pdf_path)
results = {'text': '', 'images': []}
for page_num in range(len(doc)):
page = doc[page_num]
# 1. 文字
results['text'] += page.get_text()
# 2. 图片
for img in page.get_images():
xref = img[0]
pix = fitz.Pixmap(doc, xref)
if pix.n - pix.alpha < 4:
img_data = pix.tobytes("png")
results['images'].append(
{'page': page_num+1,
'image_data': Image.open(io.BytesIO(img_data)),
'size': (pix.width, pix.height)}
)
pix = None
doc.close()
return results
if __name__ == '__main__':
content = extract_pdf_fitz(r"example.pdf")
print('文字前 500 字符:', content['text'][:500])
print('共提取图片数:', len(content['images']))代码运行结果:

import camelot
def extract_tables_camelot(pdf_path):
"""使用camelot专门提取表格(适合复杂的表格)"""
tables = camelot.read_pdf(pdf_path, pages='all')
results = []
for i, table in enumerate(tables):
df = table.df
results.append({
'table_number': i + 1,
'accuracy': table.accuracy,
'dataframe': df,
'shape': df.shape
})
return results
# 使用示例
tables = extract_tables_camelot(r"E:\learn\云上业务稳定性.pdf")
for table_info in tables:
print(f"表格{table_info['table_number']}: 准确率{table_info['accuracy']}")
print(table_info['dataframe'])代码运行结果:

import pdfplumber
import fitz
from PIL import Image
import io
import pandas as pd
def comprehensive_pdf_extraction(pdf_path, save_images=False):
"""综合提取PDF的所有内容"""
results = {
'metadata': {},
'text': {},
'tables': {},
'images': {}
}
# 使用pdfplumber提取文字和表格
with pdfplumber.open(pdf_path) as pdf:
results['metadata']['pages'] = len(pdf.pages)
for page_num, page in enumerate(pdf.pages):
# 提取文字
text = page.extract_text()
results['text'][f'page_{page_num+1}'] = text
# 提取表格
tables = page.extract_tables()
table_list = []
for i, table in enumerate(tables):
if table and len(table) > 1:
df = pd.DataFrame(table[1:], columns=table[0])
table_list.append(df)
results['tables'][f'page_{page_num+1}'] = table_list
# 使用PyMuPDF提取图片
doc = fitz.open(pdf_path)
for page_num in range(len(doc)):
page = doc[page_num]
image_list = page.get_images(full=True)
page_images = []
for img_index, img in enumerate(image_list):
xref = img[0]
try:
pix = fitz.Pixmap(doc, xref)
if pix.n - pix.alpha < 4:
img_data = pix.tobytes("png")
img_pil = Image.open(io.BytesIO(img_data))
if save_images:
img_filename = f"page_{page_num+1}_img_{img_index+1}.png"
img_pil.save(img_filename)
page_images.append({
'index': img_index + 1,
'size': img_pil.size,
'format': 'PNG',
'filename': img_filename if save_images else None
})
pix = None
except Exception as e:
print(f"跳过图片 page={page_num+1} img={img_index+1} 原因:{e}")
continue
results['images'][f'page_{page_num+1}'] = page_images
doc.close()
return results
# 使用示例
pdf_content = comprehensive_pdf_extraction(r"E:\learn\云上业务稳定性.pdf", save_images=True)
# 打印结果摘要
print(f"PDF页数: {pdf_content['metadata']['pages']}")
for page in range(1, pdf_content['metadata']['pages'] + 1):
page_key = f'page_{page}'
text_len = len(pdf_content['text'][page_key])
tables_count = len(pdf_content['tables'][page_key])
images_count = len(pdf_content['images'][page_key])
print(f"第{page}页: 文字{text_len}字符, 表格{tables_count}个, 图片{images_count}张")代码运行结果:

库名称 | 文字提取 | 表格提取 | 图片提取 | 特点 |
|---|---|---|---|---|
PyPDF2 | 基础 | 不支持 | 不支持 | 轻量级,基础文字提取 |
pdfplumber | 优秀 | 优秀 | 基础 | 表格提取能力强,推荐使用 |
PyMuPDF | 优秀 | 一般 | 优秀 | 图片提取效果好,速度快 |
camelot | 一般 | 专业 | 不支持 | 专门用于表格提取 |
推荐组合:使用 pdfplumber + PyMuPDF 的组合可以获得最好的提取效果。
“无他,惟手熟尔”!有需要的用起来!更多Python阅读去主页。
如果你觉得这篇文章有用,欢迎点赞、转发、收藏、留言、推荐❤!
本文分享自 Nicholas与Pypi 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!