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 的一般步骤为:
- 创建
PdfDocument对象。 - 调用
LoadFromFile()方法加载 PDF 文件。 - 通过
Pages集合访问每一页。 - 使用对应提取器(如
PdfTextExtractor、PdfImageHelper)提取内容。 - 关闭文档释放资源。
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 文档的编程式读取任务。