# -*- coding: utf-8 -*- """核对目录里的页码与正文标题实际所在页是否一致。""" import io import os import re import sys import fitz sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8") HERE = os.path.dirname(os.path.abspath(__file__)) PDF = os.path.join(HERE, "_tmp_inspect", "current.pdf") d = fitz.open(PDF) print(f"PDF 共 {d.page_count} 页") # 目录只在正文开始前(响应函在第 9 页),限定在前 8 页里找 HEAD = 8 toc_pages = [i for i in range(1, HEAD + 1) if len(re.findall(r"[^\s]\s+\d{1,3}\s*$", d[i - 1].get_text(), re.M)) >= 5] print("目录所在页:", toc_pages) entries = [] for i in toc_pages: for line in d[i - 1].get_text().split("\n"): m = re.match(r"^(.*?)[\s.\u2026]+(\d{1,3})$", line.strip()) if m and len(m.group(1).strip()) >= 3: entries.append((m.group(1).strip(), int(m.group(2)))) print(f"解析出目录条目 {len(entries)} 条\n") # 正文里每个标题实际出现的页(跳过目录页本身) body_text = {i: d[i - 1].get_text() for i in range(1, d.page_count + 1)} bad = 0 for title, claim in entries: key = re.sub(r"\s+", "", title) hit = None for i in range(HEAD + 1, d.page_count + 1): if key and key in re.sub(r"\s+", "", body_text[i]): hit = i break if hit is None: print(f" ? 正文未找到:{title[:44]}(目录写 {claim})") bad += 1 elif hit != claim: print(f" × {title[:44]} 目录 {claim} ≠ 实际 {hit}") bad += 1 print(f"\n不一致 {bad} 条 / 共 {len(entries)} 条") d.close()