name: genek-extract-figures
1. 从论文 PDF 中识别 DOI 和 Figure 数量
│
2. 判断出版商 → 选择提取方式
├── 已知出版商 URL 模板 → 方法一:直接下载(推荐)
├── 未知出版商 → 方法二:浏览器访问论文网页版,手动定位图片 URL
└── 无法访问网页版 → 方法三:pdftoppm 整页转图 + 裁剪
│
3. 输出到 papers/{Author}{Year}/figures/ 目录,命名 fig1.png ~ figN.png
4. 删除中间文件,验证文件大小和完整性
| 优先级 | 方法 | 质量 | 适用场景 |
|---|---|---|---|
| 1 | 出版商网站下载 | 最佳,纯图表 | 已发表论文,出版商 URL 可推断 |
| 2 | 浏览器访问网页版 | 最佳 | 未知出版商,但论文有网页版 |
| 3 | pdftoppm + 裁剪 |
需后处理 | 无法访问网页版(预印本、内部文档等) |
| 4 | pdfimages |
碎片化,不推荐 | 仅作最后手段 |
从论文 PDF 中提取 DOI(通常在首页页脚或页眉),根据 DOI 前缀判断出版商:
| DOI 前缀 | 出版商 | URL 模板可用 |
|---|---|---|
10.1038/ |
Springer Nature | ✅ |
10.1186/ |
BMC (Springer) | ✅ |
10.1007/ |
Springer | ✅ |
10.1016/ |
Elsevier | ⚠️ 需从网页解析 |
10.1002/ |
Wiley | ⚠️ 需从网页解析 |
10.1371/ |
PLOS | ✅ |
10.3390/ |
MDPI | ✅ |
10.1093/ |
Oxford Univ Press | ⚠️ 需从网页解析 |
Springer Nature / BMC 系列(Nature, BMC Biology, Genome Biology 等):
https://media.springernature.com/full/springer-static/image/art%3A{DOI_ENCODED}/MediaObjects/{JOURNAL_ID}_{YEAR}_{ARTICLE_ID}_Fig{N}_HTML.png
DOI 解析规则(10.1186/s12915-022-01301-7 为例):
JOURNAL_ID = 12915(/s 后到首个 - 之间的数字)YEAR = 2022ARTICLE_ID = 1301(去掉末尾修订号 -7)下载脚本(替换前5个变量为目标论文参数):
#!/bin/bash
AUTHOR_YEAR="Li2022" # ← 替换:第一作者姓氏+年份
DOI="10.1186/s12915-022-01301-7" # ← 替换
JOURNAL_ID="12915" # ← 替换
YEAR="2022" # ← 替换
ARTICLE_ID="1301" # ← 替换
FIG_COUNT=6 # ← 替换为实际 Figure 数量
OUT="papers/${AUTHOR_YEAR}/figures"
DOI_ENCODED=$(echo "$DOI" | sed 's|/|%2F|g; s|:|%3A|g')
mkdir -p "$OUT"
for i in $(seq 1 $FIG_COUNT); do
url="https://media.springernature.com/full/springer-static/image/art%3A${DOI_ENCODED}/MediaObjects/${JOURNAL_ID}_${YEAR}_${ARTICLE_ID}_Fig${i}_HTML.png"
curl -sL -o "${OUT}/fig${i}.png" "$url"
size=$(wc -c < "${OUT}/fig${i}.png" 2>/dev/null || echo 0)
if [ "$size" -gt 10000 ]; then
echo "fig${i}.png: OK (${size} bytes)"
else
echo "fig${i}.png: FAILED (${size} bytes) - URL 可能不正确"
rm -f "${OUT}/fig${i}.png"
fi
done
其他出版商 URL 模板详见 → references/publishers.md
URL 模板未知或下载失败时:
https://doi.org/{DOI} 跳转到论文网页版curl -sL -o figures/figN.png "URL" 逐张下载前置条件:brew install poppler(macOS)或 apt install poppler-utils(Linux)
pdftoppm -png -r 300 paper.pdf figures/page
转换后人工确认 Figure 对应的页码,然后重命名:
mv figures/page-03.png figures/fig1.png
mv figures/page-05.png figures/fig2.png
# ...按实际页码调整
rm figures/page-*.png
from PIL import Image
img = Image.open("figures/fig1.png")
# (left, upper, right, lower) — 需逐张手动确定坐标
cropped = img.crop((35, 210, 2445, 2815))
cropped.save("figures/fig1.png")
已知问题:页眉位置因期刊不同而变化;图注与正文分界不清晰;耗时且效果不稳定。
pdfimages -png paper.pdf figures/img
学术 Figure 通常由多个子面板(A, B, C...)+ 向量图形混合存储,pdfimages 只能提取嵌入位图,结果碎片化。
每篇论文以 papers/{Author}{Year}/ 为根目录,PDF 和提取图片均放在该目录下:
papers/
├── Li2022/
│ ├── paper.pdf
│ └── figures/
│ ├── fig1.png
│ └── fig2.png
├── Zhang2023/
│ ├── paper.pdf
│ └── figures/
│ ├── fig1.png
│ └── fig2.png
└── Wang2024a/ ← 同姓同年加 a/b 后缀
├── paper.pdf
└── figures/
└── fig1.png
命名规则:
Li2022Wang2024a、Wang2024bfig1.png ~ fig{N}.pngsfig1.png ~ sfig{N}.pngpage-*.png、tmp-*.png、img-*.png)