CAJ(China Academic Journal)是知网早期使用的专有文献格式,全称常被写作 CAJ / CDB / KDH 等一串变体。它不像 PDF 那样有公开规范,版本迭代又多,因此「CAJ 转 PDF」几乎是学术场景里最棘手的一类需求。要理解它的难点,得先从结构差异说起。

因此判断一份 CAJ 值不值得「直接解析」,就看它的版本号与内嵌文本层质量:老版本基本只能渲染,新版本才谈得上结构化。
实务建议是「双轨制」:先用解析库批量跑一遍,把失败的文件收集成清单,再统一丢给客户端人工兜底。不要指望单一路线覆盖全部版本,这是 CAJ 场景下最基本的心智模型。
| 问题 | 典型表现 | 处理策略 |
|---|---|---|
| 页序错乱 | 奇偶页颠倒或乱序 | 按内部页码索引排序,勿按文件名 |
| 尺寸不一 | 混入 A3 折页与 A4 正文 | 逐页保留原始尺寸,勿强制统一 |
| 清晰度不足 | 文字发虚、边缘锯齿 | 提高渲染 DPI 至 300,或优先走矢量层 |
| 文本层错位 | 复制内容与显示不符 | 若不可靠,宁可不嵌文本层 |
清晰度是 CAJ 转 PDF 最容易妥协又最不该妥协的一项。期刊扫描件本身分辨率有限,若再用 96 DPI 渲染,放大后完全不可读;建议直接以 300 DPI 渲染整页位图,宁可文件大一点,也不要牺牲可读性。
import os, glob, subprocess
SRC, DST = "caj_in", "pdf_out"
os.makedirs(DST, exist_ok=True)
for f in glob.glob(os.path.join(SRC, "*.caj")):
out = os.path.join(DST, os.path.splitext(os.path.basename(f))[0] + ".pdf")
r = subprocess.run(["caj2pdf", "convert", f, "-o", out],
capture_output=True, text=True)
if r.returncode != 0 or not os.path.exists(out):
print("[FAIL]", f, r.stderr.strip()[:120])
else:
print("[ OK ]", f, os.path.getsize(out), "bytes")
要点是失败必须显式记录并保留原始文件,方便二次处理;同时对输出做最小校验(文件非零、页数不小于 1、可打开),避免产出「0 字节的成功」。
CAJ 文献绝大多数来自付费数据库,转换本身属于格式迁移,但若用于二次分发、批量入库或对外提供下载,就可能越过授权范围。合规做法是把转换产物限于个人学习或已获授权的研究用途,并在流程中保留来源标识(DOI、题名、期号),既便于溯源,也符合学术规范。
CAJ 转 PDF 没有一劳永逸的方案,正确的策略是:先按版本分流,客户端导出保底、解析库批量提速;渲染优先保清晰度,页序按内部索引而非文件名;失败文件显式留痕并二次处理。再加上版权上的自觉,这套流程才能在学术场景里长期跑下去。
标签: PDF转换 技术升级 效率提升