From f66d188551bf31f84d3e5784eddfc5e492a6b473 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CNaeel=E2=80=9D?= Date: Wed, 17 Jun 2026 08:22:33 +0400 Subject: [PATCH] =?UTF-8?q?elements=5Fjson=20JSONB:=20=D1=81=D1=82=D1=80?= =?UTF-8?q?=D1=83=D0=BA=D1=82=D1=83=D1=80=D0=B0=20=D0=B4=D0=BE=D0=BA=D1=83?= =?UTF-8?q?=D0=BC=D0=B5=D0=BD=D1=82=D0=B0=20=D0=B2=20=D0=91=D0=94,=20PDF?= =?UTF-8?q?=20page,=20v1.12?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- site/app.py | 8 ++++---- site/parser.py | 3 +++ site/schema.py | 4 ++++ site/templates/upload.html | 2 +- 4 files changed, 12 insertions(+), 5 deletions(-) diff --git a/site/app.py b/site/app.py index 0973b7d..29c4725 100644 --- a/site/app.py +++ b/site/app.py @@ -240,8 +240,8 @@ class ContractsApp: zelements = zpr.get("elements", []) ztext = textify.to_text(zelements) if zelements else "" db.execute( - "UPDATE documents SET parsed_text=%s, status='parsed' WHERE id=%s", - (ztext, str(zdoc_id)), + "UPDATE documents SET parsed_text=%s, elements_json=%s, status='parsed' WHERE id=%s", + (ztext, json.dumps(zelements, ensure_ascii=False), str(zdoc_id)), ) zelapsed = round(time_mod.time() - zf_start, 2) files_processed += 1 @@ -261,8 +261,8 @@ class ContractsApp: elements = pr.get("elements", []) text = textify.to_text(elements) if elements else "" db.execute( - "UPDATE documents SET parsed_text=%s, status='parsed' WHERE id=%s", - (text, str(s["doc_id"])), + "UPDATE documents SET parsed_text=%s, elements_json=%s, status='parsed' WHERE id=%s", + (text, json.dumps(elements, ensure_ascii=False), str(s["doc_id"])), ) elapsed = round(time_mod.time() - file_start, 2) files_processed += 1 diff --git a/site/parser.py b/site/parser.py index d0ba748..b37e27b 100644 --- a/site/parser.py +++ b/site/parser.py @@ -128,6 +128,7 @@ def _parse_pdf(file_bytes: bytes) -> dict: with pdfplumber.open(io.BytesIO(file_bytes)) as pdf: for page in pdf.pages: + pn = page.page_number # Текст страницы text = page.extract_text() if text: @@ -138,6 +139,7 @@ def _parse_pdf(file_bytes: bytes) -> dict: "type": "paragraph", "style": "", "text": line, + "page": pn, }) # Таблицы на странице @@ -147,6 +149,7 @@ def _parse_pdf(file_bytes: bytes) -> dict: result["elements"].append({ "type": "table", "rows": tbl, + "page": pn, }) except Exception as e: diff --git a/site/schema.py b/site/schema.py index 3a70a0a..b866ded 100644 --- a/site/schema.py +++ b/site/schema.py @@ -25,6 +25,7 @@ CREATE TABLE IF NOT EXISTS documents ( mime_type TEXT NOT NULL, -- MIME-тип (docx/pdf/zip) original_bytes BYTEA NOT NULL, -- исходный файл как есть parsed_text TEXT, -- текст после parser.py + textify.py + elements_json JSONB, -- полная структура: параграфы,таблицы,стили,страницы status TEXT DEFAULT 'uploaded', -- uploaded | parsed | extracted | error error_message TEXT, -- текст ошибки, если status=error created_at TIMESTAMPTZ DEFAULT now() -- когда загружен @@ -122,3 +123,6 @@ def ensure_schema(): print(f"[schema] ⚠️ {name}: {err}") else: print(f"[schema] ✅ {name}") + + # Миграция: добавить elements_json если колонки ещё нет + db.execute("ALTER TABLE documents ADD COLUMN IF NOT EXISTS elements_json JSONB") diff --git a/site/templates/upload.html b/site/templates/upload.html index c3c88cf..e95d474 100644 --- a/site/templates/upload.html +++ b/site/templates/upload.html @@ -60,7 +60,7 @@
Nubes - Сверка договоров v1.11 + Сверка договоров v1.12