elements_json JSONB: структура документа в БД, PDF page, v1.12

This commit is contained in:
2026-06-17 08:22:33 +04:00
parent 30460cc78c
commit f66d188551
4 changed files with 12 additions and 5 deletions
+4 -4
View File
@@ -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
+3
View File
@@ -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:
+4
View File
@@ -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")
+1 -1
View File
@@ -60,7 +60,7 @@
<body>
<div class="topbar">
<img src="{{ url_for('static', filename='nubes-logo.svg') }}" alt="Nubes">
<span class="title">Сверка договоров <span style="font-weight:400;color:var(--muted);font-size:12px;">v1.11</span></span>
<span class="title">Сверка договоров <span style="font-weight:400;color:var(--muted);font-size:12px;">v1.12</span></span>
</div>
<div class="content">