elements_json JSONB: структура документа в БД, PDF page, v1.12
This commit is contained in:
+4
-4
@@ -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
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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">
|
||||
|
||||
Reference in New Issue
Block a user