准备提交 EI 会议或 IEEE 格式论文时,很多问题并不复杂,却很容易在最后一步被忽略:PDF 页数不足、某一页导出为空白、中文内容没有完全替换、图片型 PDF 无法检索文字......
如果每次都靠人工逐项检查,不但费时,也容易在临近投稿时漏掉细节。
本文用 Python 和 pypdf 写一个轻量级论文投稿自检工具,可以快速完成:
- 检查 PDF 是否能够正常读取;
- 检查论文是否达到最低页数;
- 找出疑似空白页或扫描页;
- 粗略判断论文是否以英文为主;
- 输出投稿前仍需人工确认的项目。
这也是一个适合 Python 初学者的 PDF 文本提取实战案例。文末还整理了智能光子学、光通信、智能传感和 AI 与光子学交叉方向的 IPAT 2026 会议信息。
说明:程序只能辅助发现基础问题,不能替代人工校对、论文查重、AI 内容检测或会议官方审核。
一、安装运行环境
建议使用 Python 3.10 或更高版本。首先安装 PDF 读取库:
bash
python -m pip install -U pypdf
如果系统使用 python3 命令,则执行:
bash
python3 -m pip install -U pypdf
二、完整 Python 代码
新建文件 paper_precheck.py,复制以下代码:
python
#!/usr/bin/env python3
"""论文 PDF 投稿前轻量级自检工具。"""
from __future__ import annotations
import argparse
import re
import sys
from dataclasses import dataclass
from pathlib import Path
from pypdf import PdfReader
from pypdf.errors import PdfReadError
LATIN_RE = re.compile(r"[A-Za-z]")
CJK_RE = re.compile(r"[\u3400-\u4dbf\u4e00-\u9fff]")
@dataclass
class CheckResult:
level: str
item: str
detail: str
def visible_char_count(text: str) -> int:
"""统计去除空白字符后的文本长度。"""
return len(re.sub(r"\s+", "", text))
def get_english_ratio(text: str) -> tuple[float, int, int]:
"""计算拉丁字母在拉丁字母与中日韩文字中的占比。"""
latin_count = len(LATIN_RE.findall(text))
cjk_count = len(CJK_RE.findall(text))
total = latin_count + cjk_count
ratio = latin_count / total if total else 0.0
return ratio, latin_count, cjk_count
def open_pdf(pdf_path: Path) -> PdfReader:
try:
reader = PdfReader(str(pdf_path))
except (PdfReadError, OSError, ValueError) as exc:
raise RuntimeError(f"无法读取 PDF:{exc}") from exc
if reader.is_encrypted:
try:
unlocked = reader.decrypt("")
except Exception as exc:
raise RuntimeError("PDF 已加密,请先移除密码保护。") from exc
if unlocked == 0:
raise RuntimeError("PDF 已加密,请先移除密码保护。")
return reader
def check_pdf(
pdf_path: Path,
min_pages: int = 4,
min_text_chars: int = 40,
min_english_ratio: float = 0.90,
) -> list[CheckResult]:
results: list[CheckResult] = []
if not pdf_path.exists():
raise RuntimeError(f"文件不存在:{pdf_path}")
if not pdf_path.is_file():
raise RuntimeError(f"路径不是文件:{pdf_path}")
if pdf_path.suffix.lower() != ".pdf":
raise RuntimeError("只支持 .pdf 文件。")
reader = open_pdf(pdf_path)
page_count = len(reader.pages)
if page_count >= min_pages:
results.append(CheckResult("PASS", "页数", f"共 {page_count} 页,不少于 {min_pages} 页"))
else:
results.append(CheckResult("FAIL", "页数", f"共 {page_count} 页,少于要求的 {min_pages} 页"))
all_text: list[str] = []
low_text_pages: list[tuple[int, int]] = []
for page_number, page in enumerate(reader.pages, start=1):
try:
text = page.extract_text() or ""
except Exception:
text = ""
all_text.append(text)
char_count = visible_char_count(text)
if char_count < min_text_chars:
low_text_pages.append((page_number, char_count))
if low_text_pages:
details = ", ".join(
f"第 {page} 页({count} 字符)" for page, count in low_text_pages
)
results.append(
CheckResult(
"WARN",
"疑似空白页/扫描页",
f"{details};请打开原 PDF 人工核对",
)
)
else:
results.append(CheckResult("PASS", "页面文本", "各页均提取到足量文本"))
merged_text = "\n".join(all_text)
ratio, latin_count, cjk_count = get_english_ratio(merged_text)
if latin_count + cjk_count == 0:
results.append(
CheckResult(
"WARN",
"语言比例",
"未提取到拉丁字母或中日韩文字,PDF 可能由扫描图片组成",
)
)
elif ratio >= min_english_ratio:
results.append(
CheckResult(
"PASS",
"语言比例",
f"拉丁字母占比 {ratio * 100:.1f}%(正文以英文为主)",
)
)
else:
results.append(
CheckResult(
"WARN",
"语言比例",
f"拉丁字母占比 {ratio * 100:.1f}%,低于阈值 {min_english_ratio * 100:.0f}%",
)
)
results.append(
CheckResult(
"INFO",
"人工复核",
"请继续检查 IEEE 模板、作者信息、图表、参考文献、查重及投稿要求",
)
)
return results
def print_report(pdf_path: Path, results: list[CheckResult]) -> None:
print("=" * 64)
print("论文 PDF 投稿前自检报告")
print(f"文件:{pdf_path.resolve()}")
print("=" * 64)
for result in results:
print(f"[{result.level:<4}] {result.item}:{result.detail}")
print("=" * 64)
def parse_args() -> argparse.Namespace:
parser = argparse.ArgumentParser(
description="检查论文 PDF 的页数、页面文本和英文比例"
)
parser.add_argument("pdf", type=Path, help="待检查的论文 PDF 路径")
parser.add_argument("--min-pages", type=int, default=4, help="最低页数,默认 4")
parser.add_argument(
"--min-text-chars",
type=int,
default=40,
help="页面最低可提取字符数,默认 40",
)
parser.add_argument(
"--min-english-ratio",
type=float,
default=0.90,
help="最低拉丁字母比例(0-1),默认 0.90",
)
args = parser.parse_args()
if args.min_pages < 1:
parser.error("--min-pages 必须大于等于 1")
if args.min_text_chars < 0:
parser.error("--min-text-chars 不能小于 0")
if not 0 <= args.min_english_ratio <= 1:
parser.error("--min-english-ratio 必须位于 0 和 1 之间")
return args
def main() -> int:
args = parse_args()
try:
results = check_pdf(
args.pdf,
min_pages=args.min_pages,
min_text_chars=args.min_text_chars,
min_english_ratio=args.min_english_ratio,
)
except RuntimeError as exc:
print(f"[ERROR] {exc}", file=sys.stderr)
return 2
print_report(args.pdf, results)
return 1 if any(result.level == "FAIL" for result in results) else 0
if __name__ == "__main__":
raise SystemExit(main())
三、运行方法
假设论文文件名为 my_paper.pdf,并且与脚本放在同一目录:
bash
python paper_precheck.py my_paper.pdf
Windows 路径包含空格时,需要加英文双引号:
bash
python paper_precheck.py "D:\papers\IPAT 2026\my paper.pdf"
如果 Windows 旧版 PowerShell 出现中文乱码,可先执行:
powershell
$env:PYTHONIOENCODING="utf-8"
还可以修改检查阈值。例如,要求至少 5 页、每页至少提取 60 个字符:
bash
python paper_precheck.py my_paper.pdf --min-pages 5 --min-text-chars 60
四、输出结果怎么看?
正常运行后会看到类似结果:
text
================================================================
论文 PDF 投稿前自检报告
文件:D:\papers\my_paper.pdf
================================================================
[PASS] 页数:共 6 页,不少于 4 页
[PASS] 页面文本:各页均提取到足量文本
[PASS] 语言比例:拉丁字母占比 99.3%(正文以英文为主)
[INFO] 人工复核:请继续检查 IEEE 模板、作者信息、图表、参考文献、查重及投稿要求
================================================================
各状态的含义如下:
PASS:程序未发现该检查项存在明显问题;WARN:存在可疑情况,需要打开原 PDF 人工检查;FAIL:没有达到脚本设置的基础要求;INFO:程序无法替代的人工检查提醒。
例如,某页只有图片、公式或扫描内容时,pypdf 可能提取不到文字。程序会把它标记为"疑似空白页/扫描页",但这并不代表该页真的为空白。
五、代码实现思路
1. 使用 pypdf 读取 PDF
PdfReader 可以获取 PDF 页数,并逐页提取文字。程序也会识别打不开的文件和加密文件,避免直接抛出一大段异常信息。
2. 使用文本长度寻找异常页面
代码去掉空格和换行后统计字符数。若某页少于 40 个可提取字符,就将它列为警告页。这个阈值可以通过 --min-text-chars 调整。
3. 使用字符比例粗略判断语言
程序分别统计拉丁字母和中日韩文字。如果拉丁字母占二者总量的 90% 以上,就认为正文大体以英文为主。
这只是启发式检查。作者姓名、公式、特殊符号、参考文献以及扫描 PDF 都可能影响结果,因此不能把它当作语言审核工具。
六、程序检查不到的内容
提交 IEEE 格式或 EI 会议论文前,仍建议人工完成以下检查:
- 论文题目、作者顺序、单位和邮箱是否正确;
- 正文是否使用会议要求的最新模板;
- 页眉、页脚、版权信息是否符合要求;
- 图片、坐标轴和表格文字是否清晰;
- 图表编号是否都在正文中被引用;
- 参考文献格式、DOI、卷期和页码是否完整;
- 是否存在批注、修订痕迹或未替换的占位文字;
- 论文是否为原创成果,是否存在一稿多投;
- 查重、AI 内容检测及其他材料是否符合当前投稿要求。
工具最适合负责"机械检查",研究内容、学术规范和排版细节仍应由作者负责。
七、智能光子学方向会议:IPAT 2026

如果研究方向涉及智能光子学、光通信、光电器件、智能传感、成像技术或 AI 与光子学融合,可以关注第二届智能光子学与应用技术国际学术会议(IPAT 2026)。
会议核心信息:
| 项目 | 信息 |
|---|---|
| 会议名称 | 第二届智能光子学与应用技术国际学术会议(IPAT 2026) |
| 英文名称 | 2026 2nd International Conference on Intelligent Photonics and Applied Technology |
| 时间 | 2026 年 9 月 18---20 日 |
| 地点 | 中国·西安 |
| 主办方 | 智能光子应用技术实验室(iPatLab) |
| 论文集 | 官网公示为 IEEE publication,ISBN:979-8-3195-0124-0 |
| 检索说明 | 录用并完成注册、报告的论文拟收入会议论文集,出版后提交 EI Compendex、Scopus 检索 |
主要征稿方向包括但不限于:
- AI 与机器学习在光子学中的应用;
- 量子光子学与量子技术;
- 集成光子学与光电子学;
- 光通信与网络;
- 光子物联网与智能传感;
- 自动驾驶系统中的光子技术;
- 生物医学与医疗光子学;
- 先进光子材料与器件;
- 可持续光子学与绿色技术。
相关入口:
提醒:论文能否录用取决于研究质量和同行评审;EI Compendex、Scopus 是否最终收录以数据库实际检索结果为准。
具体投稿安排请以会议官网、投稿系统及会务组的最新通知为准。
八、总结
投稿前多做一次自动检查,往往只需要几十秒,却可能提前发现页数、空白页、扫描 PDF 和语言残留等问题。
如果你正在准备智能光子学、光通信、智能传感、集成光子学或 AI 与光子学交叉方向的英文论文,可以先运行本文工具检查 PDF,再根据 IPAT 2026 最新投稿要求逐项完成人工复核。
欢迎收藏本文,后续修改论文后可以重复运行脚本。也欢迎在评论区交流你最希望自动检查的论文格式问题。