首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Python 4个提取PDF内容的方法,能直接用,效率翻倍

Python 4个提取PDF内容的方法,能直接用,效率翻倍

作者头像
用户11081884
发布2026-07-20 18:52:42
发布2026-07-20 18:52:42
230
举报

Python自动化操作PDF主要使用PyPDF2、pdfplumber、pandas、pymupdf、camelot-py、pillow等主流库,涵盖文本提取、表格提取、图片提取等高频需求,合理使用能提升自动化的水平与文档处理效率。

安装所需的库

代码语言:javascript
复制
pip install PyPDF2 pdfplumber pandas pymupdf camelot-py pillow

1. 使用PyPDF2提取文字

代码语言:javascript
复制
import 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)

代码运行结果:

2. 使用pdfplumber - 提取文字、表格、图片

代码语言:javascript
复制
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']))

代码运行结果:

3. 使用PyMuPDF(fitz)提取所有内容

代码语言:javascript
复制
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']))

代码运行结果:

4. 使用camelot提取表格

代码语言:javascript
复制
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'])

代码运行结果:

5. 完整的综合提取方法

代码语言:javascript
复制
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阅读去主页

如果你觉得这篇文章有用,欢迎点赞、转发、收藏、留言、推荐❤!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-10-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Nicholas与Pypi 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 安装所需的库
  • 1. 使用PyPDF2提取文字
  • 2. 使用pdfplumber - 提取文字、表格、图片
  • 3. 使用PyMuPDF(fitz)提取所有内容
  • 4. 使用camelot提取表格
  • 5. 完整的综合提取方法
  • 各库的特点对比
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档