快速导航
顶层函数
当你需要从”文件级任务”快速开始(打开、合并、批量渲染)时,优先看这一节。打开 PDF 文档
打开一个 PDF 文档,返回Document 实例。
接口签名: sopdf.open(path, password, *, stream)
PDF 文件的路径,与
stream 二选一。加密 PDF 的密码,无需密码时传
None。从内存字节打开,与
path 二选一。Document — 打开的文档对象。
| 异常 | 触发条件 |
|---|---|
PasswordError | 文档需要密码,但未提供或密码错误。 |
FileDataError | 文件损坏或无法解析为有效 PDF。 |
合并多个 PDF 文件
将多个 PDF 文件按顺序合并为一个输出文件。 接口签名:sopdf.merge(inputs, output)
待合并的 PDF 文件路径列表,按列表顺序拼接。
输出文件的目标路径。
| 异常 | 触发条件 |
|---|---|
ValueError | inputs 列表为空。 |
PasswordError | 某个输入文件需要密码。 |
FileDataError | 某个输入文件无法读取。 |
批量渲染页面为图像字节
批量将一组页面渲染为图像字节。 接口签名:sopdf.render_pages(pages, *, dpi, format, alpha, parallel)
待渲染的页面对象列表,通常来自
doc.pages。渲染分辨率(每英寸点数)。常用值:72(屏幕预览)、150(高清)、300(印刷)。
输出图像格式,
"png" 或 "jpeg"。是否包含透明通道(仅 PNG 有效)。
是否使用多进程并行渲染。开启后可绕过 GIL,多核机器上大幅提速。
| 场景 | 推荐参数 |
|---|---|
| 屏幕预览 | dpi=72, format="png", alpha=False, parallel=False |
| 高质量导出 | dpi=150, format="png", alpha=False, parallel=False |
| 大文档提速 | dpi=300, format="png", alpha=False, parallel=True |
list[bytes] — 与 pages 一一对应的编码图像字节列表。
批量渲染页面并写入文件
批量渲染页面并将结果写入目录,文件名为page_0.png、page_1.png 等。
接口签名: sopdf.render_pages_to_files(pages, output_dir, *, dpi, format, alpha, parallel)
待渲染的页面对象列表。
输出目录路径,不存在时自动创建。
渲染分辨率(每英寸点数)。
输出图像格式,
"png" 或 "jpeg"。是否包含透明通道(仅 PNG 有效)。
是否使用多进程并行渲染。
| 场景 | 推荐参数 |
|---|---|
| 批量预览图 | dpi=72, format="png", parallel=False |
| 文档归档图 | dpi=150, format="png", parallel=False |
| 多核高吞吐 | dpi=300, format="png", parallel=True |
文档对象操作
当你已经拿到Document 实例,想做页级管理、拆分、合并、保存时,重点看这一节。
Document 表示一个已打开的 PDF 文档。不应直接构造,始终通过 sopdf.open() 获取。
属性
总页数
成员:doc.page_count 或 len(doc)
len(doc) 等同于 doc.page_count。
元数据
文档大纲
len == 0 的空大纲。读取使用 pypdfium2,无 pikepdf 开销。
加密状态
True。
页面序列
render_pages() 配合使用。
页面访问
按索引获取页面
接口签名:doc[index] / doc.load_page(index)
doc[-1] 为最后一页)。
| 异常 | 触发条件 |
|---|---|
PageError | 索引超出范围。 |
迭代
分割
按页拆分文档
接口签名:doc.split(pages, output)
Document 对象。
待提取的页面 0-based 索引列表,顺序与列表顺序一致。
若提供,则同时将新文档写入该路径;否则仅在内存中返回。
Document — 包含指定页面的新文档对象。
逐页拆分为文件
接口签名:doc.split_each(output_dir)
page_0.pdf、page_1.pdf 等。
输出目录路径,不存在时自动创建。
合并
追加文档页面
接口签名:doc.append(other)
save() 或 to_bytes() 持久化。
被追加的文档对象。
保存
保存到文件
接口签名:doc.save(path, *, compress, garbage, linearize)
目标文件路径。
是否压缩内容流,可显著减小文件体积。
是否生成对象流(object streams),进一步压缩结构数据。
是否线性化 PDF,优化网络顺序读取(Fast Web View)。
导出为字节
接口签名:doc.to_bytes(*, compress)
是否压缩内容流。
bytes — 完整的 PDF 文件字节内容。
生命周期
关闭文档
接口签名:doc.close()
with 语句自动管理,避免手动调用。
上下文管理器
页面对象操作
当你要在单页维度做渲染、文本提取、文本检索时,使用这一节的方法。Page 表示文档中的单个页面。通过 doc[i] 或 doc.load_page(i) 获取,不应直接构造。
属性
页面序号
成员:page.number
页面尺寸
成员:page.rect
rect.width 和 rect.height 为页面的宽高。
页面旋转角度
成员:page.rotation
0、90、180、270 之一(可读写)。
| 异常 | 触发条件 |
|---|---|
PageError | 设置了非 0/90/180/270 的值。 |
渲染
渲染为图像字节
接口签名:page.render(*, dpi, format, alpha)
渲染分辨率(每英寸点数)。72 适合屏幕预览,300 适合印刷质量。
输出格式,
"png" 或 "jpeg"。是否包含透明通道(Alpha)。仅 PNG 格式有效;JPEG 不支持透明度。
| 场景 | 推荐参数 |
|---|---|
| 页面预览 | dpi=72, format="png", alpha=False |
| 清晰截图 | dpi=150, format="png", alpha=False |
| 打印级导出 | dpi=300, format="png", alpha=False |
bytes — 编码后的图像字节(PNG 或 JPEG)。
渲染并保存图像
接口签名:page.render_to_file(path, *, dpi, format, alpha)
render() 完全一致。
输出文件路径(含扩展名)。
渲染分辨率(每英寸点数)。
输出格式,
"png" 或 "jpeg"。是否包含透明通道(仅 PNG)。
文本提取
提取纯文本
接口签名:page.get_text(*, rect)
仅提取该矩形区域内的文本;为
None 时提取整页。str — 提取到的纯文本字符串。
提取文本块
接口签名:page.get_text_blocks(*, rect, format)
仅提取该矩形区域内的文本块;为
None 时提取整页。返回格式:
"list" 返回 TextBlock 对象列表;"dict" 返回字典列表,每项含 "text" 和 "rect" 键。format="list" → list[TextBlock];format="dict" → list[dict],每项形如 {"text": "...", "rect": {"x0": ..., "y0": ..., "x1": ..., "y1": ...}}
文本搜索
搜索文本位置
接口签名:page.search(query, *, match_case)
要搜索的文本字符串。
是否区分大小写,默认不区分。
list[Rect] — 每个命中位置的边界矩形列表,未找到时返回空列表。
搜索文本并返回上下文块
接口签名:page.search_text_blocks(query, *, match_case)
要搜索的文本字符串。
是否区分大小写。
list[dict],每个元素包含:
| 键 | 类型 | 说明 |
|---|---|---|
"text" | str | 命中所在文本块的完整文本内容。 |
"rect" | Rect | 命中所在文本块的边界矩形。 |
"match_rect" | Rect | 命中关键词本身的精确边界矩形。 |
数据类型
当你需要理解返回值结构(如Rect、TextBlock、Metadata)或做二次处理时,参考这一节。
Rect
表示一个矩形区域,坐标单位为 PDF 点(pt,1 pt = 1/72 英寸)。坐标系以页面左上角为原点,x 向右增大,y 向下增大。| 参数 | 类型 | 说明 |
|---|---|---|
x0 | float | 左边界(左上角 x 坐标)。 |
y0 | float | 上边界(左上角 y 坐标)。 |
x1 | float | 右边界(右下角 x 坐标)。 |
y1 | float | 下边界(右下角 y 坐标)。 |
| 属性 | 类型 | 说明 |
|---|---|---|
x0 | float | 左边界。 |
y0 | float | 上边界。 |
x1 | float | 右边界。 |
y1 | float | 下边界。 |
width | float | 矩形宽度,等于 x1 - x0。 |
height | float | 矩形高度,等于 y1 - y0。 |
Rect 实例,原对象不可变。
TextBlock
表示页面上一个带边界框的文本块。| 属性 / 方法 | 类型 | 说明 |
|---|---|---|
text | str | 文本块的文字内容。 |
rect | Rect | 文本块在页面上的边界矩形。 |
to_dict() | dict | 转换为 {"text": ..., "rect": {"x0": ..., "y0": ..., "x1": ..., "y1": ...}}。 |
Metadata
PDF Document Info 字典的读/写代理。通过doc.metadata 获取,不应直接构造。
读取路径(零 pikepdf 开销):每个属性调用 pypdfium2.get_metadata_dict() 并在自动同步后返回。
写入路径(懒加载 pikepdf):每个 setter 调用 _ensure_pike(),写入 pike_doc.docinfo 并将文档标记为脏,下次读取时自动同步。
核心字段(常用)
| 属性 | 类型 | 说明 |
|---|---|---|
title | str | None | 文档标题(/Title)。可读写。 |
author | str | None | 作者姓名(/Author)。可读写。 |
subject | str | None | 文档主题(/Subject)。可读写。 |
keywords | str | None | 搜索关键词(/Keywords)。可读写。 |
D:YYYYMMDDHHmmSSOHH'mm'(前缀 D: 和时区均可选)。
OutlineItem
文档大纲中的单个书签节点(不可变)。| 属性 / 方法 | 类型 | 说明 |
|---|---|---|
title | str | 阅读器目录面板中显示的书签标签。 |
page | int | 0-based 目标页码;无目标页时为 -1。 |
level | int | 嵌套深度;0 = 顶层项。 |
children | tuple[OutlineItem, ...] | 子节点(frozen tuple)。 |
to_dict() | dict | 递归序列化为普通字典。 |
Outline
只读大纲树管理器。通过doc.outline 获取,不应直接构造。首次访问时一次性构建,使用 pypdfium2 的 TOC 数据,无需 pikepdf 初始化。
| 成员 | 返回值 | 说明 |
|---|---|---|
items | list[OutlineItem] | 顶层大纲节点(每个可能含嵌套 children)。 |
to_list() | list[dict] | 深度优先扁平化列表,每项格式 {"level": int, "title": str, "page": int}。与 PyMuPDF get_toc() 兼容。 |
len(outline) | int | 所有层级节点的总数。 |
iter(outline) | — | 遍历顶层节点。 |
bool(outline) | bool | 文档有至少一个大纲节点时为 True。 |
异常
当你要把 PDF 处理流程接入线上服务,做稳定性与错误恢复设计时,先看这一节。 所有异常均继承自PDFError,后者继承自内置 RuntimeError。
| 异常类 | 触发场景 | 处理建议 | 可恢复 |
|---|---|---|---|
PDFError | 所有 sopdf 异常的基类,可用于统一捕获。 | 在最外层兜底记录日志并统一提示。 | 视子类而定 |
PasswordError | 打开加密 PDF 时密码缺失或错误。 | 重新请求密码,限制重试次数。 | 是 |
FileDataError | PDF 文件损坏、格式非法或无法解析。 | 提示用户重新上传或更换文件来源。 | 否 |
PageError | 页面索引超出范围,或设置了非法旋转角度(非 0/90/180/270)。 | 在调用前校验页码与角度范围。 | 是 |
PasswordError / FileDataError / PageError),最后再捕获 PDFError 作为兜底。

