domovoy_bot/scraper_gis/sudrf_pdf_compiler.py

145 lines
5.7 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import os
import sys
import logging
import json
from pathlib import Path
from pypdf import PdfWriter, PdfReader
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from PIL import Image
import subprocess
# Setup logging
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s [%(levelname)s] %(message)s',
handlers=[
logging.FileHandler("/home/matrixhasyou/swarm-services/domovoy-bot/scraper_gis/logs/sudrf_compiler.log", encoding="utf-8"),
logging.StreamHandler(sys.stdout)
]
)
log = logging.getLogger("SUD-Compiler")
# Add libs path
sys.path.append("/home/matrixhasyou/swarm-services/libs")
try:
from swarmlib.gdrive import GDriveManager
except ImportError as e:
log.error(f"Cannot import swarmlib: {e}")
GDriveManager = None
EXPORT_DIR = Path("/home/matrixhasyou/swarm-services/domovoy-bot/scraper_gis/exports/sudrf")
OUTPUT_DIR = Path("/home/matrixhasyou/swarm-services/domovoy-bot/exports/compiled_sudrf")
OUTPUT_DIR.mkdir(parents=True, exist_ok=True)
BOT_TOKEN = "8725618164:AAH1tGalq-pw1l0t4P5c0sdLkCVJdh7IE7M"
CHAT_ID = "197957361"
def send_tg(msg):
subprocess.run(["curl", "-s", "-X", "POST", f"https://api.telegram.org/bot{BOT_TOKEN}/sendMessage",
"-d", f"chat_id={CHAT_ID}&text={msg}&parse_mode=markdown"])
def tag_image_to_pdf(image_path, output_pdf_path, label):
try:
c = canvas.Canvas(output_pdf_path, pagesize=A4)
width, height = A4
c.setFillColor(colors.black)
c.rect(0, height - 50, width, 50, fill=1)
c.setFillColor(colors.white)
c.setFont("Helvetica-Bold", 10)
c.drawString(20, height - 30, f"SUD: {label}".upper())
img = Image.open(image_path)
img_width, img_height = img.size
aspect = img_height / float(img_width)
display_width = width - 40
display_height = display_width * aspect
if display_height > (height - 70):
display_height = height - 70
display_width = display_height / aspect
c.drawImage(image_path, 20, height - 60 - display_height, width=display_width, height=display_height)
c.showPage()
c.save()
return True
except Exception as e:
log.error(f"Failed to tag image {image_path}: {e}")
return False
def compile_appeals():
send_tg("🧬 **ГАС Правосудие: Запуск PDF-компилятора**\nОбрабатываю выгруженные материалы...")
if not EXPORT_DIR.exists():
log.error(f"Export dir not found: {EXPORT_DIR}")
send_tg("❌ **Компиляция прервана**: папка с выгрузками не найдена.")
return
gdrive = None
if GDriveManager:
try:
gdrive = GDriveManager()
except Exception as e:
log.error(f"Failed to initialize GDriveManager: {e}")
folders = [d for d in EXPORT_DIR.iterdir() if d.is_dir() and d.name.startswith("appeal_")]
processed = 0
for folder in folders:
appeal_id = folder.name.replace("appeal_", "")
log.info(f"Compiling appeal: {appeal_id}")
writer = PdfWriter()
# 1. Convert detail screenshot (evidence.png) to PDF first
evidence_img = folder / "evidence.png"
evidence_pdf = folder / "evidence.pdf"
if evidence_img.exists():
if tag_image_to_pdf(str(evidence_img), str(evidence_pdf), f"APPEAL {appeal_id}"):
writer.append(str(evidence_pdf))
# 2. Append all other PDF files inside the folder
files = sorted(list(folder.iterdir()))
for f in files:
if f.suffix.lower() == ".pdf" and f.name != "evidence.pdf":
try:
writer.append(str(f))
log.info(f"Appended PDF: {f.name}")
except Exception as e:
log.error(f"Failed to append PDF {f.name}: {e}")
elif f.suffix.lower() in [".png", ".jpg", ".jpeg"] and f.name != "evidence.png":
# Convert image attachments to PDF and append
img_pdf = folder / f"{f.stem}_attachment.pdf"
if tag_image_to_pdf(str(f), str(img_pdf), f"ATTACHMENT {f.name}"):
try:
writer.append(str(img_pdf))
log.info(f"Appended converted image: {f.name}")
except Exception as e:
log.error(f"Failed to append converted image {f.name}: {e}")
output_pdf = OUTPUT_DIR / f"SUD_APPEAL_{appeal_id}.pdf"
try:
with open(output_pdf, "wb") as out_f:
writer.write(out_f)
processed += 1
log.info(f"Successfully compiled: {output_pdf.name}")
# Upload to GDrive
drive_status = "не настроен"
if gdrive:
try:
drive_status = gdrive.upload_or_update(str(output_pdf), output_pdf.name)
except Exception as e:
drive_status = f"ошибка GDrive: {e}"
send_tg(f"📄 **Обращение {appeal_id} собрано в PDF**\n☁️ GDrive: `{drive_status}`")
except Exception as e:
log.error(f"Failed to write compiled PDF for {appeal_id}: {e}")
send_tg(f"❌ **Ошибка сборки обращения {appeal_id}**: {e}")
send_tg(f"🏁 **Компиляция судебных дел завершена!**\nСобрано обращений: {processed}")
if __name__ == "__main__":
compile_appeals()