创建、读取、渲染和预览 PDF 文档。
PDF 创建、读取、渲染与预览:文本/图片/HTML 转 PDF、提取文字、单页截图、QuickLook 预览。
边界:操作本地文件路径;preview() 弹出系统 QuickLook 查看器。不含 PDF 表单填写、数字签名等高级编辑。
#模块概览
| 项 | 说明 |
|---|---|
| 导入 | import pdf |
| 适合做什么 | 导出报告、相册转 PDF、提取文字、预览文档 |
| 调用时机 | 创建/读取放按钮回调;preview() 会弹全屏查看器 |
| 推荐顺序 | 创建 → info() 确认页数 → preview() 或 extract_text() |
| 路径 | 使用 App 可写目录(如 ~/Documents) |
#快速开始
从纯文本创建 PDF 并读取元数据:
已复制
import os
import pdf
out = os.path.join(os.path.expanduser("~/Documents"), "note.pdf")
pdf.create_from_text(out, "第一行\n第二行", title="笔记")
print(pdf.info(out))
print(pdf.extract_text(out))
从 HTML 渲染:
已复制
import os
import pdf
path = os.path.join(os.path.expanduser("~/Documents"), "report.pdf")
pdf.from_html("<h1>周报</h1><p>本周进展良好。</p>", path)
pdf.preview(path)
#AppUI 示例
创建与预览放在按钮回调;界面展示页数与提取摘要。
已复制
import appui
import os
import pdf
DOC = os.path.join(os.path.expanduser("~/Documents"), "pdf-demo.pdf")
state = appui.State(
pages="—",
preview="未创建",
snippet="点击按钮生成示例 PDF",
)
def create_demo():
pdf.create_from_text(
DOC,
"PythonIDE PDF 示例\n\n这是第二段文字。",
title="PDF 演示",
)
meta = pdf.info(DOC) or {}
text = pdf.extract_text(DOC) or ""
state.batch_update(
pages=str(meta.get("page_count", "—")),
preview="已生成",
snippet=text[:120] + ("…" if len(text) > 120 else ""),
)
def open_preview():
if not os.path.exists(DOC):
state.snippet = "请先生成 PDF"
return
pdf.preview(DOC)
state.preview = "已打开 QuickLook"
def body():
return appui.NavigationStack(
appui.Form([
appui.Section("操作", [
appui.Button("生成示例 PDF", action=create_demo)
.button_style("bordered_prominent"),
appui.Button("QuickLook 预览", action=open_preview),
]),
appui.Section("状态", [
appui.LabeledContent("页数", value=state.pages),
appui.LabeledContent("文件", value=state.preview),
appui.Text(state.snippet).foreground_color("secondaryLabel"),
]),
]).navigation_title("PDF")
)
appui.run(body, state=state)
#API 参考
#速查
| API | 作用 |
|---|---|
create_from_text(path, text, title=None) | 纯文本 → PDF |
create_from_images(path, image_paths) | 多图 → 多页 PDF |
from_html(html, path) | HTML 字符串 → PDF |
extract_text(path) | 提取全文 |
info(path) | 元数据 page_count / title / author / encrypted |
page_image(path, index=0, scale=2.0) | 单页渲染为 PNG bytes |
preview(path) | 弹出 QuickLook 预览 |
#创建
已复制
pdf.create_from_text("/path/note.pdf", "Hello\nWorld", title="Note")
pdf.create_from_images("/path/album.pdf", ["/path/a.jpg", "/path/b.jpg"])
pdf.from_html("<h1>Report</h1>", "/path/report.pdf")
#读取
info(path) — 返回元数据字典。
extract_text(path) — 返回完整文本字符串。
page_image(path, index=0, scale=2.0) — 将指定页渲染为 PNG 原始字节;失败抛 PDFError。
#预览
preview(path) — 呈现原生 QuickLook 查看器,返回 True 表示成功弹出。
#异常
PDFError(message, code=None) — 原生能力入口不可用或操作失败时抛出。
#常见错误
| 错误写法 | 后果 | 修正 |
|---|---|---|
| 路径不可写 | 创建失败 | 使用 ~/Documents 等沙盒目录 |
在 body() 里调用 preview() | 每次刷新弹查看器 | 放进按钮回调 |
把 page_image 结果当路径用 | 类型错误 | 返回值是 bytes,需自行保存 |
| 期望编辑已有 PDF | 超出能力 | 仅支持创建、读取、渲染 |
#相关文档
| 文档 | 用途 |
|---|---|
| photos | 选图后 create_from_images |
| share | 生成后通过分享面板发送 |
| file_picker | 选择已有 PDF 路径 |
#预期效果
运行示例后,界面应出现文档描述的目标结果;若与预期不符,先看「失败路径」并按返回值或日志排查。