#!/usr/bin/env python3 import fitz # PyMuPDF import re from pathlib import Path import logging # === CONFIG === PDF_PATH = "/home/matrixhasyou/mutt/ALL_EMAILS_CONSOLIDATED.pdf" OUTPUT_MD = "/home/matrixhasyou/mutt/LEGAL_REFERENCES.md" logging.basicConfig(level=logging.INFO, format="%(message)s") log = logging.getLogger("LegalScanner") # Паттерны для поиска законов PATTERNS = [ r'(?i)ЖК\s?РФ', r'(?i)ГПК\s?РФ', r'(?i)ГК\s?РФ', r'(?i)КоАП\s?РФ', r'(?i)УК\s?РФ', r'(?i)НК\s?РФ', r'(?i)Федеральн[а-яё]+\sзакон[а-яё]*\s(?:от\s)?\d{1,2}\.\d{2}\.\d{2,4}\s?г?\s?№\s?\d+[\-ФЗ]*', r'(?i)Постановлен[а-яё]+\sПравительства\s(?:РФ\s)?(?:от\s)?\d{1,2}\.\d{2}\.\d{2,4}\s?г?\s?№\s?\d+', r'(?i)Приказ[а-яё]*\s[А-Яа-яЁё\s]+(?:от\s)?\d{1,2}\.\d{2}\.\d{2,4}\s?г?\s?№\s?\d+', r'(?i)СанПиН\s\d+\.\d+\.\d+\-\d+', r'(?i)ГОСТ\s[Р\s]*\d+\-\d+', r'(?i)ст\.\s?\d+(?:\.\d+)?\s?[А-Яа-яЁё\s]{2,20}РФ', # ст. 36 ЖК РФ ] def extract_legal(): if not Path(PDF_PATH).exists(): log.error(f"File {PDF_PATH} not found!") return log.info(f"Opening {PDF_PATH}...") doc = fitz.open(PDF_PATH) found_refs = set() log.info(f"Scanning {len(doc)} pages...") for page_num in range(len(doc)): text = doc[page_num].get_text() for pattern in PATTERNS: matches = re.findall(pattern, text) for m in matches: # Очистка: убираем лишние пробелы и переносы clean_m = " ".join(m.split()).strip() found_refs.add(clean_m) if (page_num + 1) % 50 == 0: log.info(f" Processed {page_num + 1} pages...") doc.close() if found_refs: sorted_refs = sorted(list(found_refs)) with open(OUTPUT_MD, "w", encoding="utf-8") as f: f.write(f"# ⚖️ Список юридических ссылок из переписки\n\n") f.write(f"*Данные извлечены автоматически из ALL_EMAILS_CONSOLIDATED.pdf*\n") f.write(f"*Дата анализа: {Path(PDF_PATH).stat().st_mtime}*\n\n") # Группировка f.write("## 📚 Кодексы и Общие нормы\n") for ref in sorted_refs: if any(k in ref.upper() for k in ["РФ", "КОДЕКС"]): f.write(f"- [ ] {ref}\n") f.write("\n## 📜 Постановления и Законы\n") for ref in sorted_refs: if any(k in ref.upper() for k in ["ПОСТАНОВЛЕН", "ФЕДЕРАЛЬН", "ЗАКОН", "№"]): if not any(k in ref.upper() for k in ["РФ"]): # Чтобы не дублировать кодексы f.write(f"- [ ] {ref}\n") f.write("\n## 🛠 Технические нормы (СанПиН, ГОСТ)\n") for ref in sorted_refs: if any(k in ref.upper() for k in ["САНПИН", "ГОСТ"]): f.write(f"- [ ] {ref}\n") log.info(f"✅ Found {len(found_refs)} unique references. Saved to {OUTPUT_MD}") else: log.warning("No legal references found.") if __name__ == "__main__": extract_legal()