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", []) zelements = zpr.get("elements", [])
ztext = textify.to_text(zelements) if zelements else "" ztext = textify.to_text(zelements) if zelements else ""
db.execute( db.execute(
"UPDATE documents SET parsed_text=%s, status='parsed' WHERE id=%s", "UPDATE documents SET parsed_text=%s, elements_json=%s, status='parsed' WHERE id=%s",
(ztext, str(zdoc_id)), (ztext, json.dumps(zelements, ensure_ascii=False), str(zdoc_id)),
) )
zelapsed = round(time_mod.time() - zf_start, 2) zelapsed = round(time_mod.time() - zf_start, 2)
files_processed += 1 files_processed += 1
@@ -261,8 +261,8 @@ class ContractsApp:
elements = pr.get("elements", []) elements = pr.get("elements", [])
text = textify.to_text(elements) if elements else "" text = textify.to_text(elements) if elements else ""
db.execute( db.execute(
"UPDATE documents SET parsed_text=%s, status='parsed' WHERE id=%s", "UPDATE documents SET parsed_text=%s, elements_json=%s, status='parsed' WHERE id=%s",
(text, str(s["doc_id"])), (text, json.dumps(elements, ensure_ascii=False), str(s["doc_id"])),
) )
elapsed = round(time_mod.time() - file_start, 2) elapsed = round(time_mod.time() - file_start, 2)
files_processed += 1 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: with pdfplumber.open(io.BytesIO(file_bytes)) as pdf:
for page in pdf.pages: for page in pdf.pages:
pn = page.page_number
# Текст страницы # Текст страницы
text = page.extract_text() text = page.extract_text()
if text: if text:
@@ -138,6 +139,7 @@ def _parse_pdf(file_bytes: bytes) -> dict:
"type": "paragraph", "type": "paragraph",
"style": "", "style": "",
"text": line, "text": line,
"page": pn,
}) })
# Таблицы на странице # Таблицы на странице
@@ -147,6 +149,7 @@ def _parse_pdf(file_bytes: bytes) -> dict:
result["elements"].append({ result["elements"].append({
"type": "table", "type": "table",
"rows": tbl, "rows": tbl,
"page": pn,
}) })
except Exception as e: 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) mime_type TEXT NOT NULL, -- MIME-тип (docx/pdf/zip)
original_bytes BYTEA NOT NULL, -- исходный файл как есть original_bytes BYTEA NOT NULL, -- исходный файл как есть
parsed_text TEXT, -- текст после parser.py + textify.py parsed_text TEXT, -- текст после parser.py + textify.py
elements_json JSONB, -- полная структура: параграфы,таблицы,стили,страницы
status TEXT DEFAULT 'uploaded', -- uploaded | parsed | extracted | error status TEXT DEFAULT 'uploaded', -- uploaded | parsed | extracted | error
error_message TEXT, -- текст ошибки, если status=error error_message TEXT, -- текст ошибки, если status=error
created_at TIMESTAMPTZ DEFAULT now() -- когда загружен created_at TIMESTAMPTZ DEFAULT now() -- когда загружен
@@ -122,3 +123,6 @@ def ensure_schema():
print(f"[schema] ⚠️ {name}: {err}") print(f"[schema] ⚠️ {name}: {err}")
else: else:
print(f"[schema] ✅ {name}") 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> <body>
<div class="topbar"> <div class="topbar">
<img src="{{ url_for('static', filename='nubes-logo.svg') }}" alt="Nubes"> <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>
<div class="content"> <div class="content">