v1.0.148: PDF parsing via PyPDF2 on VM (replaces broken PDFBox on Lucee)
This commit is contained in:
@@ -57,6 +57,13 @@ class Handler(BaseHTTPRequestHandler):
|
||||
self.send_header("Access-Control-Allow-Headers", "Content-Type")
|
||||
self.end_headers()
|
||||
|
||||
def do_GET(self):
|
||||
parsed = urlparse(self.path)
|
||||
if parsed.path == "/process-v2":
|
||||
self._handle_process_v2(parsed)
|
||||
else:
|
||||
self.send_error(404)
|
||||
|
||||
def do_POST(self):
|
||||
if self.path == "/llm-ops":
|
||||
self._handle_llm_ops()
|
||||
@@ -64,6 +71,8 @@ class Handler(BaseHTTPRequestHandler):
|
||||
self._handle_unzip_upload()
|
||||
elif self.path == "/upload":
|
||||
self._handle_upload()
|
||||
elif self.path == "/parse-pdf":
|
||||
self._handle_parse_pdf()
|
||||
else:
|
||||
self._handle_doc_convert()
|
||||
|
||||
@@ -345,6 +354,43 @@ class Handler(BaseHTTPRequestHandler):
|
||||
else:
|
||||
self._send_error_cors(502, f"assemble failed: HTTP {resp.status_code}")
|
||||
|
||||
def _handle_parse_pdf(self):
|
||||
"""Распарсить PDF через PyPDF2 (получает base64 тело от Lucee)."""
|
||||
import base64
|
||||
from PyPDF2 import PdfReader
|
||||
import io as io_module
|
||||
|
||||
length = int(self.headers.get("Content-Length", 0))
|
||||
body = self.rfile.read(length).decode("utf-8", errors="ignore").strip()
|
||||
raw = base64.b64decode(body)
|
||||
|
||||
try:
|
||||
reader = PdfReader(io_module.BytesIO(raw))
|
||||
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": ""})
|
||||
result = {
|
||||
"ok": True,
|
||||
"status": "parsed",
|
||||
"element_count": len(elements),
|
||||
"elements": elements,
|
||||
"tables": 0,
|
||||
"paragraphs": len(elements),
|
||||
}
|
||||
except Exception as e:
|
||||
result = {"ok": False, "status": "error", "error": str(e), "element_count": 0}
|
||||
|
||||
self.send_response(200)
|
||||
self.send_header("Content-Type", "application/json; charset=utf-8")
|
||||
self.send_header("Access-Control-Allow-Origin", "*")
|
||||
self.end_headers()
|
||||
self.wfile.write(json.dumps(result, ensure_ascii=False).encode())
|
||||
|
||||
def _handle_unzip_upload(self):
|
||||
"""Распаковать ZIP и загрузить каждый файл в Lucee. Только файлы из корня архива."""
|
||||
import zipfile, io
|
||||
|
||||
Reference in New Issue
Block a user