#!/usr/bin/env python3 """tools/manual/find_pages.py : sucht die Seitenzahl jeder Überschrift für das Inhaltsverzeichnis.""" import io import json import sys import pymupdf pdf, toc_file, out = sys.argv[1], sys.argv[2], sys.argv[3] toc = json.load(io.open(toc_file, encoding='utf-8')) doc = pymupdf.open(pdf) heads = [] # (Seite, Text, Größe) for pno in range(len(doc)): for b in doc[pno].get_text('dict')['blocks']: for l in b.get('lines', []): txt = ''.join(s['text'] for s in l['spans']).strip() size = max((s['size'] for s in l['spans']), default=0) if size >= 12 and txt: heads.append((pno + 1, txt, size)) pages = {} cursor = 0 missing = [] for t in toc: key = t['title'].strip() found = None for i in range(cursor, len(heads)): p, txt, size = heads[i] # Überschrift = " "; lange Titel brechen um, darum Anfang vergleichen flat = txt.replace(' ', ' ') if flat.endswith(key) or flat == t['num'] + ' ' + key or key.startswith(flat.split(' ', 1)[-1][:25]) and flat.startswith(t['num'] + ' '): if flat.startswith(t['num'] + ' ') or flat.startswith(t['num']): found = (i, p) break if found: cursor = found[0] + 1 pages['k' + t['num'].replace('.', '_')] = found[1] else: missing.append(t['num'] + ' ' + key) json.dump(pages, io.open(out, 'w', encoding='utf-8')) print('gefunden: %d von %d; fehlend: %s' % (len(pages), len(toc), missing[:10]))