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 @@