
Pdfmd
- 8 installs
- 14 repo stars
- Updated November 30, 2025
- wordflowlab/agentsdk
Helps with ai & agent building tasks.
About
pdfmd is a Claude Code skill for ai & agent building. It helps solo builders move faster with AI-assisted development.
- pdfmd
- AI & Agent Building
- AI-coding skill
Pdfmd by the numbers
- 8 all-time installs (skills.sh)
- Ranked #12,321 of 16,546 AI & Agent Building skills by installs in the Skillselion catalog
- Data as of Jul 27, 2026 (Skillselion catalog sync)
npx skills add https://github.com/wordflowlab/agentsdk --skill pdfmdAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 8 |
|---|---|
| repo stars | ★ 14 |
| Last updated | November 30, 2025 |
| Repository | wordflowlab/agentsdk ↗ |
What it does
Helps with ai & agent building tasks.
Files
PDF to Markdown 转换 Skill(示例)
何时使用
当出现以下任一情况时,可以考虑启用本 Skill:
- 用户说“把这个 PDF 转成 Markdown / MD / 文本 / 文档”
- 用户上传或引用 PDF 文件,并要求“提取里面的正文”“翻译成中文 Markdown”等
如果用户只是一般性阅读 / 总结 PDF,而不要求导出 Markdown,可以直接阅读 PDF 文本或使用其他技能。
工作目录结构
在当前示例项目中,本 Skill 所在目录如下:
workspace/
skills/
pdfmd/
SKILL.md
pdf_extract.py其中:
SKILL.md为本说明文件pdf_extract.py是一个 Python 脚本,仅负责从 PDF 中提取纯文本(不调用任何大模型),
再由当前 Agent 使用已有的大模型配置完成翻译和 Markdown 转换。
注意:本 Skill 假设在执行环境中已经安装了 Python 以及依赖:
- pypdf给 Claude 的操作步骤(使用 SDK 内置能力)
当你判断应当使用本 Skill 时,请按以下顺序操作:
1. 确认 PDF 文件路径
- 如果用户提供了路径(例如
docs/report.pdf),先确认该路径在当前工作区内。 - 如果用户上传了 PDF 文件,将其保存到本地工作目录(如
./docs/),并记住实际路径。
2. 选择输出路径
- 如果用户希望生成一个 Markdown 文件,可以选定输出路径,例如:
- 输入:
docs/report.pdf - 输出:
docs/report.md
3. 使用 `Bash` 调用 Python 脚本提取 PDF 文本
使用 Bash 工具执行 Python 脚本来读取 PDF 内容,例如(注意:命令在沙箱工作目录 workspace/ 下执行,因此路径从 skills/ 开始):
python skills/pdfmd/pdf_extract.py \
--input "<PDF 文件路径>" \
--pages "<页码范围,可选,如 1-3,5>"说明:
--input:要读取的 PDF 文件路径(必填)--pages:可选页码范围,例如"1-3,5"- 脚本不会调用任何大模型,只会将提取出的纯文本打印到 stdout。
Bash 工具的返回中:
ok: 命令是否执行成功(exit code 为 0)output: 包含脚本的标准输出(即提取出的 PDF 文本)
4. 在当前对话中使用大模型进行转换
在拿到 Bash 的输出后,不需要在 Skill 或脚本中直接调用任何外部大模型 API。 而是:
- 将
output字段中的内容视为原始 PDF 文本; - 在当前 Agent 的对话中,结合本 Skill 的说明,向大模型发出请求:
- 将文本翻译成中文;
- 调整结构为合理的标题、段落、列表等;
- 输出为标准的 Markdown 格式。
所有大模型调用由 SDK 的 provider/router 统一负责,自动使用当前 Agent 配置好的模型和路由策略,
Skill 不负责管理 API Key 或模型选择。
5. 使用 `Write` 将 Markdown 保存到文件(如用户有此需求)
如果用户明确要求生成 Markdown 文件,可以在得到最终 Markdown 文本后,调用 Write 工具写入文件:
{
"path": "<输出 Markdown 文件路径>",
"content": "<模型生成的中文 Markdown 文本>"
}然后可以通过正常的文件系统操作(如下载或后续处理)使用该文件。
6. 根据用户需求做二次加工(可选)
- 如果用户还有额外要求(例如“只保留某几章”“简化为摘要”),在拿到 Markdown 后再用模型进行二次加工。
- 对于特别长的 Markdown,可以按章节或段落拆分处理,避免超出上下文限制。
错误处理与限制
- 若 Python 脚本执行失败(
Bash返回ok == false或 exit code 非 0): - 检查 PDF 路径是否正确;
- 确认文件存在且为有效 PDF;
- 检查是否已安装
pypdf依赖。
- 若生成的 Markdown 明显缺失内容或大量乱码:
- 向用户说明这是 PDF 原始排版 / 内嵌字体导致的限制。
- 根据情况建议尝试只转换部分页面,或改用其它方式获取内容。
安全注意事项
- 本 Skill 通过 Python 脚本仅读取 PDF 文本,不执行其中任何代码,但仍建议只对可信来源的 PDF 使用本 Skill。
- 大模型调用由 SDK 内部统一管理,Skill 不直接处理任何 API Key。
#!/usr/bin/env python3
"""
examples/skills/workspace/skills/pdfmd/pdf_extract.py
使用 Python 从 PDF 中提取纯文本(不调用任何大模型),将结果输出到 stdout。
依赖:
pip install pypdf
用法示例 (在 examples/skills 根目录执行):
python workspace/skills/pdfmd/pdf_extract.py --input docs/report.pdf
python workspace/skills/pdfmd/pdf_extract.py --input docs/report.pdf --pages "1-3,5"
"""
import argparse
import os
import sys
from typing import Optional, Set
from pypdf import PdfReader
def parse_page_range(page_range: str, max_page: int) -> Optional[Set[int]]:
"""
将类似 "1-3,5,7-8" 的字符串解析为页码集合。
页码从 1 开始;超出范围的页码会被忽略。
"""
if not page_range:
return None
result: Set[int] = set()
parts = page_range.split(",")
for part in parts:
part = part.strip()
if not part:
continue
if "-" in part:
start_str, end_str = part.split("-", 1)
try:
start = int(start_str)
end = int(end_str)
except ValueError:
continue
if start > end:
start, end = end, start
for p in range(start, end + 1):
if 1 <= p <= max_page:
result.add(p)
else:
try:
p = int(part)
except ValueError:
continue
if 1 <= p <= max_page:
result.add(p)
return result or None
def extract_pdf_text(path: str, page_range: str) -> str:
"""
使用 pypdf 提取 PDF 文本,并按页加上分隔标记。
"""
reader = PdfReader(path)
page_count = len(reader.pages)
pages = parse_page_range(page_range, page_count)
chunks = []
for i, page in enumerate(reader.pages, start=1):
if pages is not None and i not in pages:
continue
text = page.extract_text() or ""
chunks.append(f"\n===== 第 {i} 页 =====\n{text}")
return "\n".join(chunks)
def main() -> None:
parser = argparse.ArgumentParser(description="Extract plain text from a PDF file (no LLM calls).")
parser.add_argument("--input", "-i", required=True, help="输入 PDF 文件路径")
parser.add_argument("--pages", "-p", default="", help="页面范围,如 '1-3,5,7-8'")
args = parser.parse_args()
pdf_path = args.input
if not os.path.exists(pdf_path):
print(f"输入文件不存在: {pdf_path}", file=sys.stderr)
sys.exit(1)
try:
pdf_text = extract_pdf_text(pdf_path, args.pages)
except Exception as e:
print(f"提取 PDF 文本失败: {e}", file=sys.stderr)
sys.exit(1)
# 直接输出到 stdout,供上层 Bash 工具捕获。
sys.stdout.write(pdf_text)
if __name__ == "__main__":
main()