| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950 |
- # -*- 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()
|