pdf (portable document format) 因其跨平台、格式固定的特性成为文档交换的标准。然而,由于其复杂的内部结构(文本流、图像、字体、矢量图形、注释、表单等都可能混合在一起),程序化操作 pdf 一直是个挑战。
python 生态提供了丰富的库来解决不同场景下的 pdf 操作需求。根据核心功能分类,介绍最流行和最实用的库,包括免费和付费的商业级选项,并分析它们的优缺点……本文将帮助你根据具体任务做出明智选择。
核心原则:没有“万能的钥匙”!选择哪个库取决于你想要做什么。主要就讲究一个门当户对和技术对口,不然就是事倍功半!
一、 基础操作
这些是最常见的 pdf 基础操作。
1.pypdf2 (及其继任者 pypdf)
定位: 老牌经典,功能全面,社区庞大,是处理基础任务的首选。
主要功能:
- 读取 pdf 元数据(作者、标题等)。
- 提取文本(但格式和位置信息可能不理想)。
- 合并多个 pdf 文件。
- 拆分 pdf(按页)。
- 旋转页面。
- 添加水印(通过覆盖页面)。
- 加密(设置密码)和解密 pdf。
优点: 纯 python 实现,安装简单 (pip install pypdf2
),api 相对成熟,文档较全,适合入门和基础操作。
缺点:
1.文本提取能力较弱,对复杂布局和编码支持不佳。
它提取文本时,遇到复杂排版可能像初次面对迷宫——格式和位置信息?能给你就不错了,别要求太高!
2.编辑能力有限(难以修改现有内容结构,主要是页面级操作)。
原 pypdf2
曾一度维护停滞 事实上,原 pypdf2
官方仓库已归档不再维护,但其继任者 pypdf
(pip install pypdf
)持续更新,故推荐使用pypdf
替代旧版pypdf2
。
适用场景: 简单的 pdf 合并、拆分、旋转、加密、解密、基础元数据读取和文本提取。
简单示例 (合并 - pypdf
):
from pypdf import pdfmerger merger = pdfmerger() merger.append("file1.pdf") merger.append("file2.pdf") merger.write("combined.pdf") merger.close()
2.pymupdf / fitz
定位: 高性能、功能强大的瑞士军刀。底层基于强大的 mupdf 库 (c/c++)。
主要功能:
- 包含
pypdf2/pypdf
的所有基础操作(且通常更快)。 - 精确而高性能的文本提取(支持获取文本位置、字体、颜色等丰富属性)。
- 强大的页面渲染(生成图片)与图像提取。
- 高级搜索(按矩形区域、按文本)。
- 注释(高亮、下划线、便签等)的添加、修改、删除。
- 处理表单 (acroforms)。
- 处理文档结构(书签/目录)。
优点:
- 速度快,尤其处理大文件时优势明显。
- 功能丰富,几乎涵盖 pdf 操作的所有方面。
- 文本提取精度高,信息丰富。
缺点:
- api 相对底层和复杂,学习曲线比
pypdf
陡峭。 - 安装稍复杂(依赖预编译的 mupdf 二进制包,但
pip install pymupdf
通常能搞定)。 - 文档虽然全面,但可能需要更多时间去理解和查找。
- 使用 agpl 许可证(商业应用需注意合规性)。
注意了!这个 agpl 许可证要求:“如果你分发(包括 saas 形式)基于 agpl 代码的软件,整个作品都必须以 agpl 许可证发布”,也就是说如果你的项目包含使用了 agpl 许可证的代码,那么你的一整个项目必须以 agpl 许可证发布,并向用户提供源代码。 你当然可以通过付费来获得商业授权,但是如果你的项目资金不充裕,其它的替代方案将是你最好的选择。
适用场景: 对性能要求高、需要精确文本提取(带位置信息)、处理注释和表单、将 pdf 页面转为图片、进行高级搜索等复杂操作。如果你需要“一个库解决大部分问题”且能接受学习成本,它是最有力的竞争者。
简单示例 (精确文本提取):
import fitz # pymupdf 的导入名是 fitz doc = fitz.open("document.pdf") page = doc[0] text = page.get_text("dict") # 获取包含丰富信息的字典结构 blocks = text["blocks"] for block in blocks: if block["type"] == 0: # 文本块 for line in block["lines"]: for span in line["spans"]: print( f"text: '{span['text']}', font: {span['font']},size: {span['size']}, position: {span['origin']}" ) doc.close()
3.free spire.pdf for python
定位: free spire.pdf 是 e-iceblue 公司推出的商业级 pdf 处理库的免费版本。提供清晰规范的商业级 api 设计,是体验 spire.pdf 核心功能与稳定性的理想起点。特别适合需要规范接口、企业级开发风格或特定高级功能的用户进行评估和轻量级应用。
主要功能:
- 文档安全性设置(密码、添加数字签名及带有时间戳的数字签名)
- 提取文本、附件和图片
- 合并、拆分、复制、裁剪 pdf 页面
- 添加骑缝章
- 更新元数据 (metadata)
- 设置文档结构 (section)
- 规范的绘图、插入图片、制作和加工表格 api
- 导入和导出 pdf 表单数据 (acroforms)
- 设置查看器首选项
优点:
- 商业级库的免费版本,与收费版本共享统一、规范、稳定的 api,设计清晰,符合企业开发规范,降低学习与集成成本。
- 完善的文档与示例: 提供详尽的官方文档和丰富示例,学习曲线平缓,开发效率高。
- 支持 .net 风格的面向对象设计,代码可读性和可维护性好。
- 无需复杂依赖,安装简单 (
pip install spire.pdf-free
) - 兼容性与稳定性,windows/linux/macos/国产系统等均能稳定运行,轻松部署至服务器环境.
- 特色功能支持,提供如骑缝章、数字签名(含时间戳) 等企业级文档处理功能。
免费版说明: 由于 free spire.pdf 是为了让用户零成本体验 spire.pdf 的核心能力和 api 设计优势,故它适用于评估和轻量级自动化任务,而非大规模商业目的应用。它存在以下特性:
- 页数限制: 单次文档处理最多支持 10 页,格式转换最多转换 3 页。
- 功能聚焦: 文本提取满足基础需求;编辑模式侧重于添加新元素和页面级操作,深度修改现有复杂内容结构非其主要目标。
free spire.pdf 或许不是把万能的钥匙,但它可以准确地打开对应着自己的那几把锁——它在文档自动化报表等领域表现相当优秀。
适用场景:
- 评估 spire.pdf 商业级 api 设计与核心功能。
- 轻量级自动化任务。
- 需要快速实现 骑缝章、基础数字签名、标准化表单处理等企业文档特性。
- 重视 api 规范性、代码可维护性及跨平台稳定性的开发环境。
- 快速概念验证(poc)和原型开发。
- (免费版适用场景)了解商业级 pdf 库的设计理念。
对于更大规模、更复杂需求或无限制场景,spire.pdf 商业版提供完整解决方案
简单示例:
from spire.pdf.common import * from spire.pdf import * # 创建pdf文档 pdf = pdfdocument() # 添加页面 page = pdf.pages.add() # 创建画刷和字体 brush = pdfsolidbrush(pdfrgbcolor(color.get_black())) font = pdffont(pdffontfamily.helvetica, 12.0) # 绘制文本 page.canvas.drawstring("hello from free spire.pdf!", font, brush, 50.0, 50.0) # 保存文档 pdf.savetofile("output.pdf") pdf.close()
二、 精确文本提取
如果你主要关心的是从 pdf 中准确、结构化地提取文本内容,特别是那些包含表格、多栏布局的复杂 pdf:
1.pdfplumber
定位: 专注于精准文本提取和表格识别,提供直观的页面和对象模型。
主要功能:
- 以清晰的方式访问页面上的每个字符、文本行、矩形、曲线等底层元素。 优秀的表格提取功能(基于线条和空白)。
- 获取文本的精确位置(x, y 坐标)、字体信息等。
- 可视化调试(绘制元素边界框)。
优点:
- 文本提取精度高,对理解 pdf 布局很友好。
- 表格提取能力是其核心亮点,效果通常优于其他通用库。
- api 设计更符合“分析页面元素”的直觉。
- 基于
pdfminer.six
(见下文)解析,但提供了更高级、易用的抽象。
缺点:
- 主要专注于分析(读取),写入/编辑能力很弱。
- 处理非常大的文件时速度可能不如
pymupdf
。
相比于其他库,pdfminer.six
更像是图书馆的管理员,而不是大作家。
适用场景: ocr 后处理、需要精确文本位置信息的抽取(如发票、报告解析)、表格数据提取。是做文本和表格分析的首选。
简单示例 (提取表格):
import pdfplumber with pdfplumber.open("document_with_tables.pdf") as pdf: page = pdf.pages[0] table = page.extract_table() # 提取页面上的第一个表格为二维列表 for row in table: print(row) # 或者获取所有表格 tables = page.extract_tables()
2.pdfminer.six
定位: pdfminer
的积极维护分支。是 pdf 文本提取领域的底层引擎。
主要功能:
- 核心专注于文本提取。
- 提供对 pdf 内部结构的深度访问(解析器、资源管理器、设备接口等)。
- 支持将 pdf 转换为 html、xml 等其他文本格式。
优点:
- 文本提取能力强大,是许多其他库(如
pdfplumber
)的基础。 - 社区维护活跃 (
pdfminer.six
)。
缺点:
- api 非常底层和复杂,直接使用通常需要理解其 pdfparser, pdfdocument, pdfpageinterpreter 等等一堆组件的协作,学习成本很高,学习曲线陡峭。
- 本身不提供高级功能(如易用的表格提取、页面操作)。
适用场景: 需要深度控制解析过程、进行高级文本处理或作为其他库开发的基础。对于大多数终端用户,更推荐使用构建在它之上的 pdfplumber
。
直接用它就像让你用镊子、电烙铁、螺丝刀去组装一台超算——功能强大,但过程可能让你怀疑人生。
三、 表格数据提取
如果核心目标就是从 pdf 中高效准确地提取表格数据:
1.camelot
定位: 专门为从 pdf 中提取表格数据而设计的库。
主要功能:
- 识别 pdf 页面中的表格区域。
- 精确提取表格数据为 pandas dataframe 或 csv/json/excel 等格式。
- 支持基于线条(
lattice
)和基于空白(stream
)两种解析模式,适应不同风格的表格。
优点:
- 专精于表格提取,效果通常很好。
- 输出直接是结构化数据(dataframe),方便后续分析。
- 提供调整和修复表格解析的功能。
缺点:
- 仅专注于表格提取,不做其他 pdf 操作。
- 安装依赖
tk
和ghostscript
。 lattice
模式依赖于清晰的表格线,较慢但精确;stream
模式(依赖空白)较快但在布局紧凑或嵌套表格时容易出错。
两个模式都是偏科战神,建议让它们轮番上阵,比比效果再选择具体要用哪一个。
适用场景: 从 pdf 报告、论文、文件中抽取结构化表格数据。是表格提取任务的强力候选。
简单示例:
import camelot # 提取第一页的所有表格 tables = camelot.read_pdf('document.pdf', pages='1') print(tables[0].df) # 将第一个表格转为 pandas dataframe # 导出所有表格为 csv tables.export('tables.csv', f='csv')
2.tabula-py
定位: python 对著名 java 库 tabula-java
的封装。也是专门用于表格提取。
主要功能:
- 调用
tabula-java
引擎提取 pdf 中的表格。 - 输出为 pandas dataframe 或 json/csv。
优点:
- 依赖成熟的
tabula-java
,表格提取能力也很强。 - 简单易用。
缺点:
- 依赖 java 运行时环境 (jre),环境配置麻烦。
- 本质上是一个包装器,性能和灵活性受限于底层的 java 库。
适用场景: 需要利用 tabula-java
能力的表格提取。如果环境允许安装 java,也是一个不错的选择。
配置 java 环境如同请外援:虽然效果显著,但过程非常麻烦和繁琐,还容易出问题(尤其是在多处部署的时候)。
四、 生成 pdf(报告、文档)
需要从头开始创建新的 pdf 文档(如生成报告、发票、动态文档):
1.reportlab(reportlab)
定位: python 生态中生成 pdf 的事实标准。功能强大且成熟。
主要功能:
- 提供低级 api (
canvas
) 进行像素级精确绘图(点、线、形状、图像、文本)。 - 提供高级框架 (
platypus
- paragraphs and tables using stylesheets) 用于流式文档生成,自动处理分页、样式(段落、表格、列表、页眉页脚)。 - 支持嵌入多种字体、图像。
- 可创建简单的交互式表单。
优点:
- 强大和灵活,几乎能生成任何你能想到的 pdf 布局。
- 历史悠久,社区支持好,文档详尽(虽然有些部分略显陈旧)。
- 开源版功能已足够强大,另有商业版
reportlab plus
提供额外支持。
缺点:
1.学习曲线非常陡峭,尤其是 platypus
框架的布局逻辑需要时间掌握。
学它就像爬山——只有登顶陡峭的山峰,才能看见壮丽的风景
2.纯创建库,几乎没有读取或修改现有 pdf 的能力。
适用场景: 需要程序化生成高度定制化、复杂布局的 pdf 报告、文档、票据等。是专业 pdf 生成的首选。
简单示例 (使用 canvas
画文字):
from reportlab.pdfgen import canvas c = canvas.canvas("hello.pdf") c.drawstring(100, 750, "hello, world!") # 位置 (x, y) 单位是点 (1/72 英寸) c.save()
2.fpdf2(pyfpdf 的现代版)
定位: 轻量级、简单易用的 pdf 生成库。灵感来源于 php 的 fpdf。
主要功能:
- 提供比
reportlab
更简单、直接的 api 来生成包含文本、图像、简单表格、基本图形的 pdf。 - 支持 unicode (utf-8)。
- 支持插件扩展(如页眉页脚、表格)。
优点:
- 轻量,api 简洁直观,学习成本低,快速上手。
- 纯 python 实现,安装简单 (
pip install fpdf2
)。 - 文档清晰。
缺点:
- 功能不如
reportlab
强大和精细(例如高级布局控制、复杂表格样式)。 - 主要面向简单到中等复杂度的文档生成。
适用场景: 需要快速、简单地生成不太复杂的 pdf 文档(如简单的文本报告、带图片的文档、基础表格)。是追求简单性和快速开发的绝佳选择。
简单示例:
from fpdf import fpdf pdf = fpdf() pdf.add_page() pdf.set_font("arial", size=12) pdf.cell(200, 10, txt="hello, world!", ln=true, align='c') pdf.output("simple_doc.pdf")
五、 pdf 转换
需要将 pdf 转换为其他格式(如 word, html, 图片)或 从其他格式生成 pdf:
1.pdf2docx
定位: 专门将 pdf 转换为 .docx
文件 (microsoft word)。
主要功能:
尽力保留原始 pdf 的文本、格式、表格、图片和布局到 word 文档中。
优点:
- 专注于 pdf->docx 转换,效果通常比通用库或在线工具更好。
- api 相对简单。
缺点:
- 转换复杂 pdf 时仍可能丢失格式或布局。
- 仅做转换,不做其他操作。
适用场景: 需要将 pdf 内容导入 word 进行进一步编辑。
简单示例:
from pdf2docx import converter cv = converter('input.pdf') cv.convert('output.docx') cv.close()
2.pymupdf(fitz)
再次上榜!它也能很好地将 pdf 页面转换为图片 (png, jpg 等):
import fitz doc = fitz.open("document.pdf") page = doc[0] pix = page.get_pixmap(matrix=fitz.matrix(2, 2)) # 缩放因子 2x pix.save("page0.png") doc.close()
3.pdfminer.six
可用于将 pdf 转换为 html 或 xml 等文本格式。
4.专用命令行工具 + subprocess
对于复杂的转换(如高质量 pdf->html),有时调用成熟的命令行工具如 pdftohtml
(poppler 工具集的一部分) 或 wkhtmltopdf
(html->pdf) 通过 python 的 subprocess
模块来执行,可能是更可靠或更高质量的选择。
特别注意:转换格式就像把钝刀放上角磨机——是磨利了,但难免有损耗(格式丢失)。
六、 商业解决方案
如果需要更稳定、功能更全面的 pdf 操作库(尤其是企业级应用),商业库通常是更好的选择。它们通常提供更完善的格式支持和更高的转换质量,并有专业技术支持。唯一的不足通常是价格,但在它们提供的价值面前总是十分值得。
spire.pdf for python 商业版
定位: spire.pdf for python 是 e-iceblue 提供的全功能商业级pdf解决方案,在免费版基础上解除限制并增强专业能力。
核心优势:
无页数限制:支持任意页数的pdf处理与转换
格式转换增强:
- pdf 转 word/excel/html 时保留复杂格式和布局
- 高质量 pdf 转图像(支持多种格式和 dpi 设置)
- 反向转换:office 文档转 pdf(保留超链接、表格样式等)
高级编辑能力:
- 深度修改现有 pdf 内容(文本/图像替换)
- 动态表单生成与处理
- 数字签名与加密强化
企业级支持:
- 专业技术支持与版本维护
- 定期功能更新与安全补丁
- 商业使用授权保障
适用场景:
- 企业级文档自动化系统
- 需要处理大型pdf(100+页)的项目
- 对转换质量和格式保真度要求高的场景
- 需要专业技术支持的商业应用
reportlab plus
定位: reportlab开源库的商业增强版,专注于pdf生成领域。
核心优势:
- 高级报表生成功能(动态图表、复杂表格)
- 专业技术支持和服务
- 增强的pdf/a标准支持
- 企业级部署工具
适用场景:
- 需要生成极其复杂的动态报表
- 已有reportlab基础需专业支持
- 符合严格pdf/a归档标准的需求
实事求是的讲,商业级的库往往具有较大的前期投入,但相对应的功能也会更丰富,支持也会更有保障,而当你使用它们创造了价值,这点付出就会显得非常值得了。
总结与选型建议
主要方案对比
你的主要需求 | 推荐库 | 关键考虑 |
基础操作 (合并/拆分/旋转/加密) | pypdf (原 pypdf2 继任者) | 简单易用,纯 python |
pymupdf (fitz) | 高性能,功能更全 | |
free spire.pdf for python | 商业级api,稳定规范,商业特色功能 | |
精确文本提取 (带位置/布局信息) | pdfplumber | 高精度,分析友好,基于 pdfminer.six |
pymupdf (fitz) | 速度快,信息丰富 | |
表格数据提取 | camelot | 专精表格,输出 dataframe |
tabula-py (依赖 java) | 成熟 tabula-java 的包装 | |
pdfplumber | 内置不错的表格提取功能 | |
生成新 pdf (报告/文档) | reportlab | 功能强大专业,但学习曲线陡峭 |
fpdf2 | 轻量简单,快速上手 | |
reportlab plus | reportlab商业版,提供额外支持 | |
处理注释/表单/书签/渲染图片 | pymupdf (fitz) | 功能全面 |
pdf -> word (.docx) | pdf2docx | 专注转换,效果较好 |
pdf -> 图片 | pymupdf (fitz) | 高质量,高性能 |
pdf -> html/xml | pdfminer.six, pymupdf, 或调用 pdftohtml | |
需要“一个库解决大部分问题” | pymupdf (fitz) | 性能高,功能覆盖广,注意 agpl 协议 |
spire.pdf for python 商业版 | 企业级支持、无限制处理、合规授权 |
商业方案对比
特性 | spire.pdf for python | reportlab plus |
核心定位 | 全功能pdf处理解决方案 | 高级pdf生成工具 |
核心优势 | 读取/编辑/生成/转换四位一体 | 行业领先的pdf生成能力 |
pdf处理能力 | 完整文档操作(合并/拆分/加密等) | 仅限生成新文档 |
文本提取精度 | 高保真提取(保留格式和位置) | 不提供文本提取功能 |
表格处理 | 动态表格生成+现有表格提取 | 高级表格生成(仅限新建) |
格式转换 | pdf↔word/excel/html/图像 | 不支持 |
数字签名/加密 | 完整支持(含时间戳证书) | 基础支持 |
现有文档修改 | 深度内容编辑(文本/图像替换) | 不支持 |
跨平台支持 | windows/linux/macos/国产系统 | 跨平台 |
学习曲线 | 中等(.net风格api) | 陡峭(复杂布局系统) |
授权模式 | 永久授权、订阅 | 纯订阅制 |
性价比优势 | 单次投入解决全流程需求 | 需搭配其他库完成完整工作流 |
选型建议:
选择 spire.pdf 当你需要:
- 端到端pdf解决方案(从处理到生成)
- 高性价比的永久授权模式
- 现有文档修改与格式转换需求
选择 reportlab plus 当你需要:
- 极端复杂的动态报告生成
- 已有reportlab经验且只需生成功能
- 预算充足的纯pdf生成场景
技术提示:spire.pdf的独特价值在于将文档处理、转换和生成整合在统一api下,减少多库集成复杂度。
重要提示
1.pdf 是“终点格式”:
pdf 本质上是为呈现设计的,不是为编辑设计的。程序化修改现有 pdf 的内容结构通常非常困难且容易出错。大部分库的“编辑”能力都局限于页面级操作(增删页、旋转)或添加覆盖层(水印、注释)。
2.扫描件/图像型 pdf:
- 上述库主要处理文本型 pdf。如果 pdf 是扫描生成的图片(没有内嵌文本层,也就是那种看起来像用手机拍了一本书的照片做成的 pdf),你需要先进行 ocr (光学字符识别),例如使用
pytesseract
(google tesseract 的封装) +pillow
/opencv
处理图像,或者使用专门的 ocr 服务或库(如easyocr
,paddleocr
和spire.ocr
)。 - ocr 后得到的文本,可以用
pdfplumber
或pymupdf
分析其结构(如果 ocr 工具保留了位置信息)。
3.库的活跃度与授权:
- python 生态变化快,关注库的 github 仓库、pypi 页面或官方网站,看其最近更新时间、issue 处理情况等,选择维护活跃的库。
- 注意授权协议:
pymupdf
使用 agplv3 协议,商业应用需谨慎;free spire.pdf
是免费但功能受限的商业产品;其他库多为 mit/bsd 等宽松协议。
再次强调! agpl 许可证要求:“如果你分发(包括 saas 形式)基于 agpl 代码的软件,整个作品都必须以 agpl 许可证发布”,也就是说如果你的项目包含使用了 agpl 许可证的代码,那么你的一整个项目必须以 agpl 许可证发布,并向用户提供源代码。
4.组合使用:
根据复杂需求,可能需要组合使用多个库。例如:用 pypdf
合并文件 -> 用 pdfplumber
提取关键文本和表格 -> 用 reportlab
生成包含提取结果的新报告 pdf。
5.企业级需求解决方案
free spire.pdf
旨在让用户体验 spire.pdf
的核心功能和 api 设计风格。对于评估和轻量级应用(单次处理 ≤ 10 页,格式转换 ≤ 3 页)完全足够。
如需处理更大文档或解锁全部高级功能,e-iceblue 提供功能完整、无页数限制、包含专业技术支持的 spire.pdf for python 商业版,具备以下企业级特性:
- 无限制处理:支持任意页数文档和复杂操作
- 优先技术支持:专业工程师团队提供及时技术支持
- 定期更新保障:持续的功能增强和安全更新
- 商业授权保障:避免agpl等开源协议的法律风险
- 企业定制服务:提供api定制和专属功能开发
6.商业支持选择:
对于需要长期稳定运行的企业系统,商业库提供更可靠的技术支持和持续更新。spire.pdf商业版以其全面的功能覆盖和合理的授权模式,特别适合需要处理多种pdf任务的中大型企业。
7.先试再定:
对于你的特定文档和任务,最好的方法是用候选库写个小脚本实际测试一下效果。不同库对同一份“复杂”pdf 的处理结果可能有显著差异。
到此这篇关于python操作pdf文档的主流库使用指南 的文章就介绍到这了,更多相关python操作pdf内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论