视觉画布设计
canvas-design
基于设计原则创作静态视觉作品,用于海报与品牌图形。
paper-summarize-pdf-to-feishu【文档与办公】总结论文 PDF 为飞书文档(含图表)。当用户发送 PDF 文件并要求总结、阅读、提取内容, 或要求将 PDF 内容写入飞书文档时激活。支持学术论文、技术报告、一般 PDF 文档。 自动检测扫描版 PDF 并回退 OCR,支持提取并上传论文图片到飞书文档。 含多模型自审核机制:生成 → 配图 → 审核 → 人工确认 → 完善。 **支持去重系统**:自动识别重复 PDF、同文章不同版本、补充材料,智能合并处理。 触发场景:发送 PDF 附件、"总结这个 PDF"、"帮我读一下这个论文"、"把 PDF 写成飞书文档"、 "论文总结"、"PDF 摘要"、"阅读 PDF 并输出到飞书"。
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
将 PDF 文件完整阅读后生成结构化总结,写入飞书文档,并将论文 Figure 精确插入对应章节。 含多模型审核 + 配置确认 + 人工确认机制,确保最终输出质量。
| 工具 | 用途 | 版本要求 |
|---|---|---|
pdftotext | PDF 文本提取 | poppler-utils ≥ 0.86 |
pdfinfo | PDF 元信息查看 | poppler-utils ≥ 0.86 |
pdfimages | PDF 图片提取 | poppler-utils ≥ 0.86 |
pdftoppm | PDF 转图片(截图/OCR) | poppler-utils ≥ 0.86 |
tesseract | OCR 识别 | ≥ 4.1 |
jq | JSON 处理 | ≥ 1.6 |
| 插件 | 用途 | 版本 |
|---|---|---|
feishu | 飞书文档操作 | 2026.3.13¹ |
feishu_doc | 文档读写/图片上传 | 内置 |
¹ OpenClaw 官方插件与主程序同步发布,版本号一致
检查依赖:
# 检查系统工具
which pdftotext pdfinfo pdfimages pdftoppm tesseract jq || \
sudo apt-get install -y poppler-utils tesseract-ocr tesseract-ocr-eng tesseract-ocr-chi-sim jq
# 检查版本
pdftotext -v # 应显示 poppler-utils 版本
tesseract --version # 应显示 tesseract 版本
jq --version
目标:避免重复处理,智能识别补充材料并合并
scripts/extract_metadata.sh <input.pdf> "$TEMP_DIR/metadata.json"
提取内容:
paper_id:<DOI> 或 hash_<指纹>scripts/check_duplicate.sh "$TEMP_DIR/metadata.json" "$PAPERS_DIR"
判断逻辑:
收到 PDF → 计算 paper_id → 查询 papers/ 目录
├─ 不存在 → 新论文,创建文件夹,进入阶段一
├─ 存在 + PDF 哈希相同 → 完全重复,跳过并告知用户
├─ 存在 + DOI 相同但哈希不同 → 同文章不同版本,询问是否更新
└─ 存在 + 判断为补充材料 → 合并到 supplements/,追加到飞书文档
文件名包含以下关键词视为补充材料:
supplement, suppl, _si_, supporting, appendixDOI 包含 .supp 或 supplementary 也视为补充材料。
papers/
├── 10.xxxx-xxxxxx/ # DOI 作为 ID(优先)
│ ├── metadata.json # 元数据(DOI、标题、作者等)
│ ├── paper.pdf # 主文章
│ ├── paper.txt # 提取的全文文本
│ ├── feishu_doc_token.txt # 飞书文档 token
│ ├── summary.md # 总结文档
│ ├── versions.json # 版本历史(如有更新)
│ ├── images/ # 提取的 Figure/Table
│ └── supplements/ # 补充材料
│ ├── 20260326_120000_suppl1.pdf
│ ├── 20260326_120000_suppl1_meta.json
│ └── 20260326_120000_suppl1.txt
│
└── hash_xxxxxxxxxxxx/ # 无 DOI 时用指纹哈希
└── ...
PAPER_DIR=<OpenClaw 工作目录>/papers/<paper_id>
mkdir -p "$PAPER_DIR"/{images,supplements}
cp <input.pdf> "$PAPER_DIR/paper.pdf"
cp "$TEMP_DIR/metadata.json" "$PAPER_DIR/metadata.json"
scripts/extract_pdf_text.sh "$PAPER_DIR/paper.pdf" "$PAPER_DIR/paper.txt"
策略:pdftotext → 检测字符密度(≥50 字符/页正常,<50 走 OCR 回退)
用 read 工具每次 500 行,直到读完全文。
关键要求:必须读完全文再总结,不要只读摘要或部分内容。
学术论文结构:
# 总结:<论文标题>
> 原文标题 / 发表日期 / 机构
---
## 📊 论文统计
- 总字数 / 总页数
- Figure(正文):X 张
- Figure(附录):X 张
- Table(正文):X 张
- Table(附录):X 张
---
## 一、研究背景与动机
## 二、研究设计
## 三、方法/系统架构
## 四、核心结果
### 4.1 结果 A
### 4.2 结果 B
## 五、讨论与局限性
## 六、结论
## 七、关键数据速览
{
"action": "create",
"title": "总结:<文档标题>",
"owner_open_id": "<用户的 open_id>"
}
{
"action": "write",
"doc_token": "<doc_token>",
"content": "<Markdown 格式总结>"
}
保存 feishu_doc_token.txt 以便后续补充材料合并时使用。
如果阶段零判断为补充材料,执行以下流程:
# 读取已有的飞书文档 token
DOC_TOKEN=$(cat "$PAPER_DIR/feishu_doc_token.txt")
# 步骤 1:合并补充材料(文件层面)
scripts/merge_supplement.sh "$PAPER_DIR" "<supplement.pdf>" "$DOC_TOKEN"
# 步骤 2:追加到飞书文档(调用 feishu_doc 工具)
feishu_doc action=append doc_token="$DOC_TOKEN" content="
## 📎 补充材料:$(basename $SUPPLEMENT_PDF)
- 添加时间:$(date +%Y-%m-%d %H:%M)
- 摘要:$(cat $SUPP_TXT | head -20)
"
合并逻辑:
merge_supplement.sh 负责文件层面操作:
supplements/ 目录(带时间戳命名)_meta.json).txt)feishu_doc 工具追加内容到飞书文档versions.json 记录(待实现)注意:merge_supplement.sh 不直接操作飞书文档,仅准备文件和数据。飞书文档更新由上层 Agent 调用 feishu_doc 工具完成。
scripts/locate_figures.sh "$PAPER_DIR/paper.pdf" "$PAPER_DIR/paper.txt" "$PAPER_DIR/images"
脚本会:
grep 找到所有 Figure/Table 标题行⚠️ 注意:行号→页码是粗略估算,必须经过审核验证!
对每个 Figure 的候选截图逐张审核:
for each Figure:
1. read 候选截图
2. 判断:图中是否包含目标 Figure?
- ✅ 包含 → 记录正确页码,复制为 Figure_XX_full.png
- ❌ 不包含 → 检查相邻页面
3. 如果所有候选页面都不对 → 扩大搜索范围
验证标准:
如果截图是纯文字:
pdftoppm -f X -l X paper.pdf output精确定位:
{
"action": "upload_image",
"doc_token": "<doc_token>",
"file_path": "<图片路径>",
"parent_block_id": "<doc_token>",
"index": <目标索引>
}
技巧:从文档末尾往前插(倒序),避免索引偏移。
核心思想:直接使用 fallback 模型审核 → 告知用户 → 主模型审查 → 人工确认
# 读取 OpenClaw 配置文件
CONFIG_FILE=<OpenClaw 配置文件路径>
# 提取 fallback 模型列表(取第一个作为审核模型)
FALLBACK_MODEL=$(jq -r '.agents.defaults.model.fallbacks[0]' "$CONFIG_FILE")
# 确认配置并启动审核
if [ -z "$FALLBACK_MODEL" ] || [ "$FALLBACK_MODEL" = "null" ]; then
echo "⚠️ 未配置 fallback 模型,将使用主模型自审"
# 降级方案:使用主模型重新阅读 PDF + 文档进行自审
sessions_spawn task="请审核这份飞书文档与原始 PDF 的一致性..."
else
echo "✅ 使用 fallback 模型进行审核:$FALLBACK_MODEL"
# 告知用户审核模型
echo "📋 已启动审核流程,使用模型:$FALLBACK_MODEL"
sessions_spawn task="请审核这份飞书文档与原始 PDF 的一致性..." \
model="$FALLBACK_MODEL"
fi
注意:
审核内容:
审核报告包含:
主模型审查流程:
1. 阅读审核报告
2. 逐条审查修改建议:
- ✅ 合理建议 → 标记为"采纳"
- ❌ 错误建议 → 标记为"拒绝"并说明原因
- ⚠️ 需确认 → 标记为"待用户确认"
3. 生成最终修改方案
注意:
向用户发送:
📋 文档已完成初稿和审核
✅ 已完成的修改:X 处
⚠️ 待您确认的修改:Y 处
❌ 拒绝的修改:Z 处(原因:...)
请查看文档后回复:
- "确认" → 应用所有修改,输出最终版
- "修改 XXX" → 指定需要调整的内容
- "跳过" → 直接输出当前版本
用户回复处理:
根据用户确认的修改方案:
格式标准化检查清单(必须逐项核对):
在文档末尾添加署名块(必须包含):
---
## 📝 文档信息
| 项目 | 信息 |
|------|------|
| 撰写人 | <Agent 名字>(<主模型名称>) |
| 审核模型 | <审核模型名称> |
| 审核状态 | ✅ 已通过 |
| 生成时间 | YYYY-MM-DD HH:MM |
| 文档版本 | v1.0 |
---
*本总结由 AI 助手自动生成,如有问题请指出。*
示例:
撰写人:Lux(qwen3.5-plus)
审核模型:kimi-k2.5
审核状态:✅ 已通过
生成时间:2026-03-26 17:13
文档版本:v1.0
注意:
qwencode/qwen3.5-plus)qwencode/kimi-k2.5)向用户发送:
| 脚本 | 功能 | 输出 |
|---|---|---|
extract_metadata.sh | 提取 PDF 元数据(DOI、标题、作者、页数),生成 paper_id | JSON:paper_id, doi, title, pdf_hash |
check_duplicate.sh | 检查是否已处理,判断重复/版本更新/补充材料 | JSON:action, file_type, message |
merge_supplement.sh | 复制补充材料到 supplements/,提取元数据和摘要 | JSON:文件路径 + 摘要,不操作飞书文档 |
| 脚本 | 功能 |
|---|---|
extract_pdf_text.sh | 智能文本提取(pdftotext + OCR 回退) |
extract_pdf_images.sh | 提取嵌入图片 + 生成清单 |
locate_figures.sh | 定位 Figure/Table 页码 + 截取候选页面 |
review_document.sh | 生成审核报告(对比 PDF 与飞书文档) |
/ 替换为 _),无 DOI 时用指纹哈希supplement/suppl/_si_/supporting/appendix/moesm/_esm 自动识别
papers/<paper_id>/,其中 paper_id 为 DOI(/→_)或 hash_<指纹>merge_supplement.sh 复制到 supplements/ + 提取元数据和摘要feishu_doc action=append 追加"补充材料"章节YYYYMMDD_HHMMSS_<原文件名>(带时间戳避免冲突)read 验证pdftoppm 整页截图 > pdfimages 嵌入图片agents.defaults.model.fallbacks 配置为确保每次生成的文档格式一致,必须遵守:
文档结构模板化:
##)###)表格样式统一:
**55.0%**)强制署名:
质量检查:
.index.json 索引文件维护versions.json 版本历史记录正确用法(已验证):
# 方法 1:上传到文档根目录,用 index 指定位置(0-based)
feishu_doc action=upload_image \
doc_token="<doc_token>" \
file_path="<image_path>" \
parent_block_id="<文档根 block ID>" \
index=20
# 方法 2:上传到指定章节下(parent_block_id 为章节 block ID)
feishu_doc action=upload_image \
doc_token="<doc_token>" \
file_path="<image_path>" \
parent_block_id="<章节 block ID>"
注意事项:
parent_block_id 为文档根 ID 时,index 表示在 children 数组中的位置parent_block_id 为章节 ID 时,图片会追加到该章节下insert + after_block_id 方式会报错,不推荐使用请注意 Token 消耗,建议使用包月套餐。
环境变量:
OPENCLAW_WORKSPACE:OpenClaw 工作目录(用于存储论文和临时文件)配置文件读取:
~/.openclaw/openclaw.json 获取 fallback 模型配置(用于多模型审核)本地存储:
<OPENCLAW_WORKSPACE>/papers/<paper_id>/paper.txt<OPENCLAW_WORKSPACE>/papers/<paper_id>/feishu_doc_token.txt<OPENCLAW_WORKSPACE>/papers/<paper_id>/images/系统依赖:
sudo apt-get install 安装 poppler-utils、tesseract-ocr 等工具(用于 PDF 处理和 OCR)权限说明:
sessions_spawn 启动子代理审核(使用 fallback 模型)版本: 1.0.0
许可证: MIT
作者: yy-fan
最后更新: 2026-03-26