用途
该技能用于通过 Python 库和命令行工具完成综合性的 PDF 操作,并集成 OpenAI Codex,实现智能的 PDF 转 Markdown 转换。资料明确建议:处理任何 PDF 文档时,先使用 OpenAI Codex 将内容转换为 .md 文件,再基于该 Markdown 进行后续工作。
主要能力
资料列出的使用场景包括:
- 将 PDF 转换为 Markdown(使用 OpenAI Codex 进行智能转换,被标注为推荐的第一步)
- 从 PDF 文件中提取文本与元数据
- 将多个 PDF 合并为单个文档
- 将大 PDF 拆分为单独页面
- 向 PDF 添加水印或注释
- 对 PDF 进行密码保护或解密
- 从 PDF 文档中提取图片
- 对扫描文档进行 OCR 处理
- 使用 reportlab 创建新 PDF
- 从结构化 PDF 中提取表格
为什么先转换为 Markdown
资料给出的理由包括:更好地保留结构(标题、列表、表格);更易于文本处理(标准 Markdown 格式);提升 AI 理解(Codex 理解文档结构);格式灵活(Markdown 可再转换为任意格式);便于版本控制(纯文本、易于 diff)。
使用方式
前置依赖与安装
pip install openai pypdf
export OPENAI_API_KEY="your-api-key-here"
基础转换(OpenAI Codex)
资料提供 pdf_to_markdown_codex(pdf_path, output_md_path=None, model="gpt-4.1") 函数:使用 PdfReader 逐页 extract_text() 提取文本,拼接为带页码标记的字符串,调用 openai.OpenAI() 的 client.chat.completions.create,system 消息要求将 PDF 文本转换为结构良好的 Markdown(保留标题、章节、列表、表格、代码块、链接等),user 消息为待转换文本,temperature=0.3,最后写入输出 .md 文件。若未提供输出路径,则在 PDF 同级目录下以原文件名生成 .md。
调用示例:
md_file = pdf_to_markdown_codex("document.pdf")
print(f"Markdown saved to: {md_file}")
批量转换
batch_pdf_to_markdown(pdf_directory, output_directory=None, model="gpt-4.1") 使用 Path.glob("*.pdf") 遍历目录,默认输出到 pdf_directory/markdown,逐个转换并记录日志,单个失败仅记录错误并继续。
batch_pdf_to_markdown("/path/to/pdfs", model="gpt-4.1")
大 PDF 分块转换
pdf_to_markdown_chunked(pdf_path, output_md_path=None, chunk_pages=10, model="gpt-4.1") 按 chunk_pages 分块逐段调用模型,每块完成后打印进度,最后以 --- 分隔符合并各段并写入文件。
md_file = pdf_to_markdown_chunked("large_document.pdf", chunk_pages=20)
工作流:PDF → Markdown → 后续处理
pdf_workflow(pdf_path) 演示:先调用 Codex 转为 Markdown,再读取 Markdown 内容,提取以 # 开头的标题行,统计词数,返回包含 PDF 路径、Markdown 路径、Markdown 内容、标题列表和词数的字典。
成本更低的做法
资料给出两种方式:使用 gpt-4.1-mini(如 pdf_to_markdown_codex("document.pdf", model="gpt-4.1-mini"));或采用混合方案 hybrid_conversion——用 pypdf 本地免费提取文本,仅用 gpt-4.1-mini 做 Markdown 格式化。资料称本地提取免费,混合方案成本更低。
最佳实践(资料原文要点)
- 始终先转换为 Markdown,便于下游处理
- 大 PDF 使用分块,避免 token 限制与 API 超时
- 缓存转换结果,避免重复转换
- 根据复杂度选择模型:复杂文档用 GPT-4.1,简单文档用 GPT-4.1-mini
- 校验输出,确认 Markdown 结构合理
- 优雅处理错误:记录失败并继续批量处理
命令行工具
资料提供可保存为 pdf2md.py 的脚本,使用 argparse 接收 input(PDF 文件或目录)、-o/--output、-m/--model(默认 gpt-4.1)、--chunk-pages(默认 10)。当输入为文件时执行单文件转换,否则执行批量转换。
# Single file
python pdf2md.py document.pdf
# Directory
python pdf2md.py /path/to/pdfs -o /path/to/markdown
# With GPT-4.1-mini (cheaper)
python pdf2md.py document.pdf --model gpt-4.1-mini
Python 库用法
pypdf — 核心操作
合并 PDF:
from pypdf import PdfMerger
merger = PdfMerger()
merger.append("file1.pdf")
merger.append("file2.pdf")
merger.write("merged.pdf")
merger.close()
拆分 PDF:
from pypdf import PdfReader, PdfWriter
reader = PdfReader("document.pdf")
for i, page in enumerate(reader.pages):
writer = PdfWriter()
writer.add_page(page)
writer.write(f"page_{i+1}.pdf")
提取元数据:
reader = PdfReader("document.pdf")
info = reader.metadata
print(f"Author: {info.author}")
print(f"Title: {info.title}")
print(f"Pages: {len(reader.pages)}")
pdfplumber — 高级文本提取
保留版面的文本提取:
import pdfplumber
with pdfplumber.open("document.pdf") as pdf:
for page in pdf.pages:
text = page.extract_text()
print(text)
表格提取:
import pdfplumber
with pdfplumber.open("document.pdf") as pdf:
page = pdf.pages[0]
tables = page.extract_tables()
for table in tables:
for row in table:
print(row)
reportlab — 创建 PDF
从零创建:
from reportlab.lib.pagesizes import letter
from reportlab.pdfgen import canvas
c = canvas.Canvas("output.pdf", pagesize=letter)
c.drawString(100, 750, "Hello, World!")
c.showPage()
c.save()
多页文档:
from reportlab.lib.pagesizes import letter
from reportlab.platypus import SimpleDocTemplate, Paragraph
from reportlab.lib.styles import getSampleStyleSheet
doc = SimpleDocTemplate("output.pdf", pagesize=letter)
styles = getSampleStyleSheet()
story = []
story.append(Par
(资料中 reportlab 多页文档示例在此处截断,未提供后续内容。)
适用场景
根据资料所列能力,该技能适用于需要对 PDF 进行读取、转换、拆分合并、元数据提取、表格提取、图片提取、OCR、加密解密与新建 PDF 等操作的场景,尤其是希望把 PDF 先转为结构清晰的 Markdown 再做后续文本处理或 AI 处理的工作流。
限制与缺失信息
- 资料未提供该技能的收费、价格信息。
- 资料未提供支持平台的具体限制说明。
- 资料未提供转换效果或准确率的量化保证。
- 使用 OpenAI Codex 转换需要自行提供
OPENAI_API_KEY。 - reportlab 多页文档示例在资料中被截断,后续步骤暂未提供。