v1.0.149: VM parses PDF + stores elements_json in Lucee

This commit is contained in:
2026-06-23 12:22:05 +04:00
parent 2399b01a26
commit 9351347a11
2 changed files with 68 additions and 31 deletions
+51 -1
View File
@@ -346,14 +346,64 @@ class Handler(BaseHTTPRequestHandler):
json={"upload_id": upload_id, "contract_id": contract_id},
)
if resp.status_code == 200:
result = resp.json()
doc_id = result.get("DOC_ID", "")
# Парсинг на VM + сохранить в Lucee
parsed = self._parse_file(filename, file_data)
if parsed and parsed.get("status") == "parsed" and doc_id:
try:
escaped = json.dumps(parsed["elements"], ensure_ascii=False).replace("'", "''")
with httpx.Client(http2=True, timeout=15, verify=False) as c:
c.post(
f"{LUCEE_URL}/api.cfm",
data={
"action": "execute",
"sql": f"UPDATE documents SET elements_json='{escaped}'::jsonb, status='parsed' WHERE id='{doc_id}'"
}
)
except Exception:
pass
result["parsed"] = parsed
self.send_response(200)
self._send_cors()
self.send_header("Content-Type", "application/json; charset=utf-8")
self.end_headers()
self.wfile.write(resp.content)
self.wfile.write(json.dumps(result, ensure_ascii=False).encode())
else:
self._send_error_cors(502, f"assemble failed: HTTP {resp.status_code}")
def _parse_file(self, filename, data):
"""Распарсить файл на VM: PDF→PyPDF2, DOCX/DOC→python-docx, иначе plain text."""
import base64
ext = filename.rsplit('.', 1)[-1].lower() if '.' in filename else ''
try:
if ext == 'pdf':
from PyPDF2 import PdfReader
import io as io_mod
reader = PdfReader(io_mod.BytesIO(data))
elements = []
for page in reader.pages:
text = page.extract_text()
if text:
for line in text.split('\n'):
line = line.strip()
if line:
elements.append({"type": "paragraph", "text": line, "style": ""})
return {"status": "parsed", "element_count": len(elements), "elements": elements}
elif ext in ('docx', 'doc'):
# Для DOCX/DOC — оставляем Lucee (Apache POI работает)
return None
else:
# Plain text
text = data.decode('utf-8', errors='ignore')[:5000]
lines = [l.strip() for l in text.split('\n') if l.strip()]
return {"status": "parsed", "element_count": len(lines),
"elements": [{"type": "paragraph", "text": l, "style": ""} for l in lines]}
except Exception as e:
return {"status": "error", "error": str(e), "element_count": 0}
def _handle_parse_pdf(self):
"""Распарсить PDF через PyPDF2 (получает base64 тело от Lucee)."""
import base64