Python PDF 解析入门:提取信息、表格与元数据

PDF是日常工作中最常用的文档格式之一。借助 Python,我们可以批量提取 PDF 中的文本、图片、表格等数据,从而实现自动化处理。本文将介绍如何使用 Free Spire.PDF for Python 这个免费库来完成常见的 PDF 读取任务。


1. 环境准备

1.1 安装免费 Python PDF 库

可以通过 pip 直接安装:

bash 复制代码
pip install Spire.Pdf.Free

安装后,在代码中导入所需模块即可:

python 复制代码
from spire.pdf import *
from spire.pdf.common import *

注意:该库的免费版本对处理的 PDF 页数有限制(每次最多 10 页),本文示例均基于免费版的功能范围。

1.2 基本工作流程

使用该库读取 PDF 的一般步骤为:

  1. 创建 PdfDocument 对象。
  2. 调用 LoadFromFile() 方法加载 PDF 文件。
  3. 通过 Pages 集合访问每一页。
  4. 使用对应提取器(如 PdfTextExtractorPdfImageHelper)提取内容。
  5. 关闭文档释放资源。

2. 读取 PDF 基本信息(页数、页面尺寸等)

在提取具体内容前,通常需要先了解文档的元数据。

python 复制代码
from spire.pdf import PdfDocument

# 加载 PDF 文档
pdf = PdfDocument()
pdf.LoadFromFile("sample.pdf")

# 获取页数
page_count = pdf.Pages.Count
print(f"总页数: {page_count}")

# 遍历每一页,获取页面尺寸
for i in range(page_count):
    page = pdf.Pages.get_Item(i)
    width = pdf.Size.Width
    height = page.Size.Height
    print(f"第 {i+1} 页尺寸: {width} x {height}")

pdf.Close()

输出示例:

复制代码
总页数: 5
第 1 页尺寸: 595.0 x 842.0
第 2 页尺寸: 595.0 x 842.0
...

3. 提取 PDF 中的文本

文本提取是最常见的需求。PdfTextExtractor 类提供了逐页提取文本的方法。

python 复制代码
from spire.pdf import *

def extract_text_from_pdf(pdf_path, start_page=1, end_page=None):
    pdf = PdfDocument()
    pdf.LoadFromFile(pdf_path)
    
    total_pages = pdf.Pages.Count
    if end_page is None or end_page > total_pages:
        end_page = total_pages
    
    # 免费版最多处理前10页,此处限制输出
    end_page = min(end_page, 10)
    
    for i in range(start_page - 1, end_page):
        page = pdf.Pages.get_Item(i)
        extractor = PdfTextExtractor(page)
        
        # 提取文本,可以设置提取参数(如是否保留空白布局)
        options = PdfTextExtractOptions()
        options.IsExtractAllText = True   # 提取全部文本(忽略表格/图片区域)
        text = extractor.ExtractText(options)
        
        print(f"--- 第 {i+1} 页文本 ---")
        print(text)
        print("\n")
    
    pdf.Close()

extract_text_from_pdf("sample.pdf", end_page=2)

说明:如果 PDF 中的文字为扫描图片(无文本层),则无法直接提取,需要配合 OCR 技术(该库不提供 OCR 功能)。


4. 提取 PDF 中的图片

Free Spire.PDF 提供了 PdfImageHelper 来提取页面中的图片资源。

python 复制代码
import os
from spire.pdf import *

def extract_images_from_pdf(pdf_path, output_dir="images"):
    """
    提取 PDF 中所有图片并保存到指定文件夹
    注意:免费版最多处理前 10 页
    """
    # 创建输出目录
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)
    
    # 加载 PDF 文档
    pdf = PdfDocument()
    pdf.LoadFromFile(pdf_path)
    
    # 免费版限制:最多处理前 10 页
    page_limit = min(pdf.Pages.Count, 10)
    
    # 准备图片提取器
    image_helper = PdfImageHelper()
    
    # 遍历页面
    for page_index in range(page_limit):
        page = pdf.Pages.get_Item(page_index)
        images_info = image_helper.GetImagesInfo(page)
        
        # 保存当前页的所有图片
        for i, img_info in enumerate(images_info):
            # Image.Save() 方法会根据扩展名自动保存为 PNG 格式
            img_info.Image.Save(f"{output_dir}/page_{page_index}_img_{i}.png")
            print(f"已保存: page_{page_index}_img_{i}.png")
    
    pdf.Close()
    print(f"图片提取完成,共处理 {page_limit} 页,图片保存在 {output_dir} 目录下")

# 使用示例
extract_images_from_pdf("sample.pdf")

5. 提取 PDF 中的表格

该库未提供直接导出表格为 CSV/Excel 的一键方法,但可以借助 PdfTableExtractor 获取表格结构,然后手动解析。

python 复制代码
from spire.pdf import *

def extract_tables_from_pdf(pdf_path):
    pdf = PdfDocument()
    pdf.LoadFromFile(pdf_path)
    
    # 免费版最多处理前10页
    page_limit = min(pdf.Pages.Count, 10)
    extractor = PdfTableExtractor(pdf)
    
    for i in range(page_limit):
        page = pdf.Pages.get_Item(i)
        # 提取当前页的所有表格
        tables = extractor.ExtractTable(i)
        if tables:
            print(f"第 {i+1} 页发现 {len(tables)} 个表格")
            for t_idx, table in enumerate(tables):
                print(f"  表格 {t_idx+1}:")
                rows = table.GetRowCount()
                cols = table.GetColumnCount()
                print(f"    行数: {rows}, 列数: {cols}")
                # 获取表头(第一行)
                if rows > 0:
                    header = []
                    for c in range(cols):
                        header.append(table.GetText(0, c))
                    print(f"    表头: {header}")
                # 获取前3行数据示例
                for r in range(min(rows, 4)):
                    row_data = []
                    for c in range(cols):
                        row_data.append(table.GetText(r, c))
                    print(f"    第{r+1}行: {row_data}")
        else:
            print(f"第 {i+1} 页未发现表格")
    
    pdf.Close()

extract_tables_from_pdf("sample.pdf")

注意:PdfTableExtractor 只能识别有明确边框和结构的表格,对于扫描表格或复杂排版可能失效。


结语

通过上述方法,可以较为全面地实现对 PDF 文件的读取操作,涵盖基本信息、文本、图片和表格数据获取等核心功能。这些能力为文档自动化处理、数据采集和内容分析等场景提供了基础支撑。根据实际需求选择适当的提取方式,能够高效地完成 PDF 文档的编程式读取任务。