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