83 lines
3.4 KiB
Python
83 lines
3.4 KiB
Python
#!/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()
|