PDF文件正文抽取:学术论文与文献 PDF 批量抽取实战
# PDF文件正文抽取:学术论文与文献 PDF 批量抽取实战
> 接口 PDF文件正文抽取(apiCode=10,接入点 10-1) · 免费服务 · 请求方式 POST · 返回格式 JSON · 适用人群 研究者、学生、文献管理员 · 阅读时间 约 6 分钟
## 核心要点
- 批量抽取的本质是「逐份上传 PDF → 取 `text` → 落盘」,循环即可,无特殊批量接口。
- 免费服务有「使用档次限制」,批量时必须做**限流 + 重试**,否则易触发限制或超时。
- 落盘建议按原文件名生成 `.txt`,并保留 `showapi_res_id` 便于追溯。
## Why:为什么需要批量抽取
研究生、综述写作者、图书馆馆员常年面对成百上千篇 PDF 文献:要做全文检索、做引用管理、做文本挖掘,第一步永远是把 PDF 变成可搜索的文本。手动一份份上传不现实,用脚本批量跑才是正解。本文给你一套能直接用的批量方案。
## What:方案速览
| 项目 | 说明 |
|------|------|
| 核心动作 | 遍历目录 → 逐份 POST → 解析 `text` → 写 `.txt` |
| 关键约束 | 免费档位限制,需限流与重试 |
| 推荐语言 | Python(requests + 标准库即可) |
| 并发建议 | 免费档位下建议串行 + 间隔,或极小的并发上限 |
## How:批量抽取脚本
下面脚本遍历 `papers/` 下的 PDF,逐个调用,限流为「每次间隔 1 秒 + 失败退避重试」,并把正文写入同名 `.txt`。
```python
import os, time, requests
APP_KEY = "YOUR_APPKEY" # 替换为真实 AppKey
IN_DIR = "papers" # 存放 PDF 的目录
OUT_DIR = "papers_txt" # 输出目录
os.makedirs(OUT_DIR, exist_ok=True)
def extract(pdf_path):
url = "https://route.showapi.com/10-1"
for attempt in range(3): # 最多重试 3 次
try:
resp = requests.post(
url, params={"appKey": APP_KEY},
files={"pdf": open(pdf_path, "rb")},
timeout=15,
).json()
if resp.get("showapi_res_code") != 0:
raise RuntimeError(resp.get("showapi_res_error"))
body = resp["showapi_res_body"]
if body.get("ret_code") != "0":
raise RuntimeError(body.get("remark"))
return body.get("text", "")
except Exception as e:
if attempt == 2:
return f"[ERROR] {e}"
time.sleep(2 ** attempt) # 指数退避
return "[ERROR] 未知失败"
for name in os.listdir(IN_DIR):
if not name.lower().endswith(".pdf"):
continue
src = os.path.join(IN_DIR, name)
text = extract(src)
out = os.path.join(OUT_DIR, name[:-4] + ".txt")
with open(out, "w", encoding="utf-8") as f:
f.write(text)
print(f"done: {name} -> {out}")
time.sleep(1) # 限流:免费档位下务必加间隔
```
## 返回示例与解析
每份 PDF 的返回结构与单条调用一致,`text` 即该篇正文。批量场景的差异在于:你要把这些 `text` 稳定地落盘,并对失败项单独标记(如上方的 `[ERROR]` 前缀),而不是让整批中断。
## 进阶 / 边界
- **限流是第一原则**:免费服务有使用档次限制,串行 + 1 秒间隔是最稳妥的起步配置;若需提速,先确认你的档位额度再上调并发。
- **断点续跑**:给脚本加一个「目标 `.txt` 已存在则跳过」的判断,避免重复消耗额度。
- **编码**:写文件统一用 `utf-8`,避免不同系统下的乱码。
- **空正文**:若某篇 `text` 为空但成功,按 [能力边界篇](https://www.showapi.com/guides/pdf-extract-limits-10) 排查(多为无文字层扫描件)。
## FAQ
**Q:有没有官方的「批量接口」可以一次传多份?**
A:本接口文档仅提供单一接入点(10-1),为「每次上传一个 `pdf` 文件」的同步模式,没有批量上传端点。批量靠你在客户端循环调用实现。
**Q:跑几百篇会被封吗?**
A:接口本身不会因数量封禁,但免费档位有调用限制;不加限流可能触发限制导致大量失败。建议限流 + 重试 + 断点续跑。
**Q:速度太慢怎么提速?**
A:先到 [免费 API 档位说明](https://www.showapi.com/free-api) 确认你的额度,再在「不超额度」前提下适度提高并发或缩短间隔。
**Q:抽取正文里有页码/页眉噪声怎么办?**
A:这是源 PDF 排版决定的,接口按原文字层抽取;如需清洗,在拿到 `text` 后用正则/规则做后处理即可。
## 相关能力 / 下一步阅读
- [PDF文件正文抽取:免费档位限制与频率/成本控制](https://www.showapi.com/guides/pdf-extract-free-tier-10)
- [PDF文件正文抽取:把抽取结果转存为 TXT / DOCX](https://www.showapi.com/guides/pdf-extract-export-10)
- **本系列共 10 篇**:查看[PDF文件正文抽取指南总目录](https://www.showapi.com/guides/pdf-extract-guides-10)