快速导航
顶层函数
当你需要从”文件级任务”快速开始(打开、合并、批量渲染)时,优先看这一节。打开 PDF 文档
打开一个 PDF 文档,返回Document 实例。
接口签名: sopdf.open(path, password, *, stream)
str | Path | None
默认值:"None"
PDF 文件的路径,与
stream 二选一。str | None
默认值:"None"
加密 PDF 的密码,无需密码时传
None。bytes | None
默认值:"None"
从内存字节打开,与
path 二选一。Document — 打开的文档对象。
合并多个 PDF 文件
将多个 PDF 文件按顺序合并为一个输出文件。 接口签名:sopdf.merge(inputs, output)
list[str | Path]
待合并的 PDF 文件路径列表,按列表顺序拼接。
str | Path
输出文件的目标路径。
批量渲染页面为图像字节
批量将一组页面渲染为图像字节。 接口签名:sopdf.render_pages(pages, *, dpi, format, alpha, parallel)
list[Page]
待渲染的页面对象列表,通常来自
doc.pages。int
默认值:"72"
渲染分辨率(每英寸点数)。常用值:72(屏幕预览)、150(高清)、300(印刷)。
str
默认值:"\"png\""
输出图像格式,
"png" 或 "jpeg"。bool
默认值:"False"
是否包含透明通道(仅 PNG 有效)。
bool
默认值:"False"
是否使用多进程并行渲染。开启后可绕过 GIL,多核机器上大幅提速。
返回值:
list[bytes] — 与 pages 一一对应的编码图像字节列表。
批量渲染页面并写入文件
批量渲染页面并将结果写入目录,文件名为page_0.png、page_1.png 等。
接口签名: sopdf.render_pages_to_files(pages, output_dir, *, dpi, format, alpha, parallel)
list[Page]
待渲染的页面对象列表。
str | Path
输出目录路径,不存在时自动创建。
int
默认值:"72"
渲染分辨率(每英寸点数)。
str
默认值:"\"png\""
输出图像格式,
"png" 或 "jpeg"。bool
默认值:"False"
是否包含透明通道(仅 PNG 有效)。
bool
默认值:"False"
是否使用多进程并行渲染。
文档对象操作
当你已经拿到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] 为最后一页)。
迭代
分割
按页拆分文档
接口签名:doc.split(pages, output)
Document 对象。
list[int]
待提取的页面 0-based 索引列表,顺序与列表顺序一致。
str | Path | None
默认值:"None"
若提供,则同时将新文档写入该路径;否则仅在内存中返回。
Document — 包含指定页面的新文档对象。
逐页拆分为文件
接口签名:doc.split_each(output_dir)
page_0.pdf、page_1.pdf 等。
str | Path
输出目录路径,不存在时自动创建。
合并
追加文档页面
接口签名:doc.append(other)
save() 或 to_bytes() 持久化。
Document
被追加的文档对象。
保存
保存到文件
接口签名:doc.save(path, *, compress, garbage, linearize)
str | Path
目标文件路径。
bool
默认值:"True"
是否压缩内容流,可显著减小文件体积。
bool
默认值:"False"
是否生成对象流(object streams),进一步压缩结构数据。
bool
默认值:"False"
是否线性化 PDF,优化网络顺序读取(Fast Web View)。
导出为字节
接口签名:doc.to_bytes(*, compress)
bool
默认值:"True"
是否压缩内容流。
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 之一(可读写)。
渲染
渲染为图像字节
接口签名:page.render(*, dpi, format, alpha)
int
默认值:"72"
渲染分辨率(每英寸点数)。72 适合屏幕预览,300 适合印刷质量。
str
默认值:"\"png\""
输出格式,
"png" 或 "jpeg"。bool
默认值:"False"
是否包含透明通道(Alpha)。仅 PNG 格式有效;JPEG 不支持透明度。
返回值:
bytes — 编码后的图像字节(PNG 或 JPEG)。
渲染并保存图像
接口签名:page.render_to_file(path, *, dpi, format, alpha)
render() 完全一致。
str | Path
输出文件路径(含扩展名)。
int
默认值:"72"
渲染分辨率(每英寸点数)。
str
默认值:"\"png\""
输出格式,
"png" 或 "jpeg"。bool
默认值:"False"
是否包含透明通道(仅 PNG)。
文本提取
提取纯文本
接口签名:page.get_text(*, rect)
Rect | None
默认值:"None"
仅提取该矩形区域内的文本;为
None 时提取整页。str — 提取到的纯文本字符串。
提取文本块
接口签名:page.get_text_blocks(*, rect, format)
Rect | None
默认值:"None"
仅提取该矩形区域内的文本块;为
None 时提取整页。str
默认值:"\"list\""
返回格式:
"list" 返回 TextBlock 对象列表;"dict" 返回字典列表,每项含 "text" 和 "rect" 键。format="list" → list[TextBlock];format="dict" → list[dict],每项形如 {"text": "...", "rect": {"x0": ..., "y0": ..., "x1": ..., "y1": ...}}
文本搜索
搜索文本位置
接口签名:page.search(query, *, match_case)
str
要搜索的文本字符串。
bool
默认值:"False"
是否区分大小写,默认不区分。
list[Rect] — 每个命中位置的边界矩形列表,未找到时返回空列表。
搜索文本并返回上下文块
接口签名:page.search_text_blocks(query, *, match_case)
str
要搜索的文本字符串。
bool
默认值:"False"
是否区分大小写。
list[dict],每个元素包含:
数据类型
当你需要理解返回值结构(如Rect、TextBlock、Metadata)或做二次处理时,参考这一节。
Rect
表示一个矩形区域,坐标单位为 PDF 点(pt,1 pt = 1/72 英寸)。坐标系以页面左上角为原点,x 向右增大,y 向下增大。
核心属性(常用)
所有几何运算均返回新的
Rect 实例,原对象不可变。
TextBlock
表示页面上一个带边界框的文本块。Metadata
PDF Document Info 字典的读/写代理。通过doc.metadata 获取,不应直接构造。
读取路径(零 pikepdf 开销):每个属性调用 pypdfium2.get_metadata_dict() 并在自动同步后返回。
写入路径(懒加载 pikepdf):每个 setter 调用 _ensure_pike(),写入 pike_doc.docinfo 并将文档标记为脏,下次读取时自动同步。
核心字段(常用)
PDF 日期格式:
D:YYYYMMDDHHmmSSOHH'mm'(前缀 D: 和时区均可选)。
OutlineItem
文档大纲中的单个书签节点(不可变)。Outline
只读大纲树管理器。通过doc.outline 获取,不应直接构造。首次访问时一次性构建,使用 pypdfium2 的 TOC 数据,无需 pikepdf 初始化。
异常
当你要把 PDF 处理流程接入线上服务,做稳定性与错误恢复设计时,先看这一节。 所有异常均继承自PDFError,后者继承自内置 RuntimeError。
推荐捕获顺序: 先捕获具体异常(
PasswordError / FileDataError / PageError),最后再捕获 PDFError 作为兜底。

