查看: 121|回复: 1

Python使用Spire.PDF库提取PDF文本、图片和表格的实践

[复制链接]
发表于 2 小时前 | 显示全部楼层 |阅读模式
在日常文档处理中,PDF 是一种常见格式,而通过 Python 批量提取 PDF 中的文本、图片和表格数据,可以大幅提升自动化效率。本文基于 Free Spire.PDF for Python 库(免费版限制每次最多处理 10 页),演示如何实现 PDF 的基本信息读取、文本提取、图片导出以及表格解析。

## 环境准备
首先通过 pip 安装依赖库:
  1. pip install Spire.Pdf.Free
复制代码
安装后在脚本中导入核心模块:
  1. from spire.pdf import *
  2. from spire.pdf.common import *
复制代码
注意:免费版对处理的 PDF 页数有限制(每次最多 10 页),以下示例均在此限制下运行。

## 基本工作流程
使用该库读取 PDF 的一般步骤为:
1. 创建 PdfDocument 对象。
2. 调用 LoadFromFile() 方法加载 PDF 文件。
3. 通过 Pages 集合访问每一页。
4. 使用对应的提取器(PdfTextExtractor、PdfImageHelper、PdfTableExtractor)提取内容。
5. 关闭文档释放资源。

## 读取 PDF 基本信息(页数、页面尺寸)
在提取具体内容前,先获取文档元数据,有助于了解文档结构。
  1. from spire.pdf import PdfDocument
  2. pdf = PdfDocument()
  3. pdf.LoadFromFile("sample.pdf")
  4. page_count = pdf.Pages.Count
  5. print(f"总页数: {page_count}")
  6. for i in range(page_count):
  7.     page = pdf.Pages.get_Item(i)
  8.     width = page.Size.Width
  9.     height = page.Size.Height
  10.     print(f"第 {i+1} 页尺寸: {width} x {height}")
  11. pdf.Close()
复制代码
输出示例中,A4 尺寸的页面宽高约为 595 x 842 点。

## 提取 PDF 中的文本
利用 PdfTextExtractor 逐页提取文本,可控制是否保留空白布局。注意:如果 PDF 中文字是扫描图片(无文本层),则无法直接提取,需借助 OCR 技术。
  1. from spire.pdf import *
  2. def extract_text_from_pdf(pdf_path, start_page=1, end_page=None):
  3.     pdf = PdfDocument()
  4.     pdf.LoadFromFile(pdf_path)
  5.     total_pages = pdf.Pages.Count
  6.     if end_page is None or end_page > total_pages:
  7.         end_page = total_pages
  8.     # 免费版限制最多处理前10页
  9.     end_page = min(end_page, 10)
  10.     for i in range(start_page - 1, end_page):
  11.         page = pdf.Pages.get_Item(i)
  12.         extractor = PdfTextExtractor(page)
  13.         options = PdfTextExtractOptions()
  14.         options.IsExtractAllText = True  # 提取全部文本(忽略表格/图片区域)
  15.         text = extractor.ExtractText(options)
  16.         print(f"--- 第 {i+1} 页文本 ---")
  17.         print(text)
  18.         print("\n")
  19.     pdf.Close()
  20. extract_text_from_pdf("sample.pdf", end_page=2)
复制代码

## 提取 PDF 中的图片
使用 PdfImageHelper 获取页面中的图片资源,并保存为 PNG 文件。
  1. import os
  2. from spire.pdf import *
  3. def extract_images_from_pdf(pdf_path, output_dir="images"):
  4.     if not os.path.exists(output_dir):
  5.         os.makedirs(output_dir)
  6.     pdf = PdfDocument()
  7.     pdf.LoadFromFile(pdf_path)
  8.     page_limit = min(pdf.Pages.Count, 10)
  9.     image_helper = PdfImageHelper()
  10.     for page_index in range(page_limit):
  11.         page = pdf.Pages.get_Item(page_index)
  12.         images_info = image_helper.GetImagesInfo(page)
  13.         for i, img_info in enumerate(images_info):
  14.             img_info.Image.Save(f"{output_dir}/page_{page_index}_img_{i}.png")
  15.             print(f"已保存: page_{page_index}_img_{i}.png")
  16.     pdf.Close()
  17.     print(f"图片提取完成,共处理 {page_limit} 页,保存在 {output_dir} 目录下")
  18. extract_images_from_pdf("sample.pdf")
复制代码
注意:Save() 方法会根据文件名后缀自动确定格式,推荐使用 .png。

## 提取 PDF 中的表格
该库没有直接导出表格为 CSV/Excel 的方法,但可通过 PdfTableExtractor 获取表格结构,再手动解析数据。注意此方法只能识别有明确边框和结构的表格,对扫描表格或复杂排版失效。
  1. from spire.pdf import *
  2. def extract_tables_from_pdf(pdf_path):
  3.     pdf = PdfDocument()
  4.     pdf.LoadFromFile(pdf_path)
  5.     page_limit = min(pdf.Pages.Count, 10)
  6.     extractor = PdfTableExtractor(pdf)
  7.     for i in range(page_limit):
  8.         page = pdf.Pages.get_Item(i)
  9.         tables = extractor.ExtractTable(i)
  10.         if tables:
  11.             print(f"第 {i+1} 页发现 {len(tables)} 个表格")
  12.             for t_idx, table in enumerate(tables):
  13.                 print(f"  表格 {t_idx+1}:")
  14.                 rows = table.GetRowCount()
  15.                 cols = table.GetColumnCount()
  16.                 print(f"  行数: {rows}, 列数: {cols}")
  17.                 if rows > 0:
  18.                     header = [table.GetText(0, c) for c in range(cols)]
  19.                     print(f"  表头: {header}")
  20.                 for r in range(min(rows, 4)):
  21.                     row_data = [table.GetText(r, c) for c in range(cols)]
  22.                     print(f"  第{r+1}行: {row_data}")
  23.         else:
  24.             print(f"第 {i+1} 页未发现表格")
  25.     pdf.Close()
  26. extract_tables_from_pdf("sample.pdf")
复制代码

## 注意事项
- 免费版每次只能处理 PDF 前 10 页,超出部分将被忽略。
- 文本提取依赖 PDF 内嵌的文本层,扫描件需配合 OCR 工具。
- 表格提取仅适用于有清晰边框的表格结构。
- 图片保存为 PNG 格式,无压缩损失。

掌握以上方法后,可轻松实现 PDF 文档的自动化数据提取,为文档分析、批量内容采集等场景提供基础支撑。实际使用时可根据需求选择合适的提取策略,并注意免费版的页数限制。
回复

使用道具 举报

发表于 2 小时前 | 显示全部楼层

Re: Python使用Spire.PDF库提取PDF文本、图片和表格的实践

谢谢分享!这个库的用法介绍得很清楚,特别是代码示例直接可以跑,对新手很友好。我也用过 Free Spire.PDF,确实方便,但免费版 10 页限制有时不够用,不知道有没有什么变通方法,比如分章节多次提取?另外提取图片那部分,保存为 PNG 挺实用,不过如果 PDF 里图片很多,生成的命名可能容易重名,能不能像表格那样按页和索引来区分?期待后续能补充一些处理扫描件或复杂排版表格的技巧,谢谢!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-6-10 12:04 , Processed in 0.031298 second(s), 18 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部