done INTEGRATION WITH GATEWAY TO C++
This commit is contained in:
+2
-1
@@ -4,7 +4,7 @@ from fastapi import FastAPI
|
|||||||
from fastapi.middleware.cors import CORSMiddleware
|
from fastapi.middleware.cors import CORSMiddleware
|
||||||
|
|
||||||
from app import __version__
|
from app import __version__
|
||||||
from app.routers import documents, edits, health, render
|
from app.routers import documents, edits, health, render, info
|
||||||
|
|
||||||
|
|
||||||
def create_app() -> FastAPI:
|
def create_app() -> FastAPI:
|
||||||
@@ -23,6 +23,7 @@ def create_app() -> FastAPI:
|
|||||||
)
|
)
|
||||||
|
|
||||||
app.include_router(health.router)
|
app.include_router(health.router)
|
||||||
|
app.include_router(info.router)
|
||||||
app.include_router(documents.router)
|
app.include_router(documents.router)
|
||||||
app.include_router(render.router)
|
app.include_router(render.router)
|
||||||
app.include_router(render.compat_router)
|
app.include_router(render.compat_router)
|
||||||
|
|||||||
@@ -101,4 +101,38 @@ def delete_document(document_id: str):
|
|||||||
if not deleted:
|
if not deleted:
|
||||||
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Document not found")
|
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Document not found")
|
||||||
|
|
||||||
return {"success": True}
|
return {"success": True}
|
||||||
|
|
||||||
|
class DocumentMetadataResponse(BaseModel):
|
||||||
|
title: str
|
||||||
|
author: str
|
||||||
|
creator: str
|
||||||
|
producer: str
|
||||||
|
creation_date: str
|
||||||
|
modification_date: str
|
||||||
|
|
||||||
|
@router.get("/{document_id}/metadata", response_model=DocumentMetadataResponse)
|
||||||
|
def get_document_metadata(document_id: str) -> DocumentMetadataResponse:
|
||||||
|
if not engine.is_available():
|
||||||
|
raise HTTPException(
|
||||||
|
status_code=status.HTTP_501_NOT_IMPLEMENTED,
|
||||||
|
detail="Engine bridge (bindings/python) not yet available."
|
||||||
|
)
|
||||||
|
|
||||||
|
d = document_store.get_document(document_id)
|
||||||
|
if not d:
|
||||||
|
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Document not found")
|
||||||
|
|
||||||
|
try:
|
||||||
|
doc = d["doc_instance"]
|
||||||
|
meta = doc.metadata
|
||||||
|
return DocumentMetadataResponse(
|
||||||
|
title=meta.title,
|
||||||
|
author=meta.author,
|
||||||
|
creator=meta.creator,
|
||||||
|
producer=meta.producer,
|
||||||
|
creation_date=meta.creation_date,
|
||||||
|
modification_date=meta.modification_date
|
||||||
|
)
|
||||||
|
except Exception as e:
|
||||||
|
raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=str(e))
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
from fastapi import APIRouter, HTTPException, status
|
||||||
|
from pydantic import BaseModel
|
||||||
|
|
||||||
|
from app.services import engine
|
||||||
|
|
||||||
|
router = APIRouter(prefix="/engine", tags=["info"])
|
||||||
|
|
||||||
|
class EngineInfoResponse(BaseModel):
|
||||||
|
version: str
|
||||||
|
build_info: str
|
||||||
|
has_pdfium: bool
|
||||||
|
has_skia: bool
|
||||||
|
|
||||||
|
@router.get("/info", response_model=EngineInfoResponse)
|
||||||
|
def get_engine_info() -> EngineInfoResponse:
|
||||||
|
if not engine.is_available():
|
||||||
|
raise HTTPException(
|
||||||
|
status_code=status.HTTP_501_NOT_IMPLEMENTED,
|
||||||
|
detail="Engine bridge (bindings/python) not yet available."
|
||||||
|
)
|
||||||
|
|
||||||
|
pdfengine = engine.require()
|
||||||
|
|
||||||
|
try:
|
||||||
|
return EngineInfoResponse(
|
||||||
|
version=pdfengine.engine_version(),
|
||||||
|
build_info=pdfengine.engine_build_info(),
|
||||||
|
has_pdfium=pdfengine.engine_has_pdfium(),
|
||||||
|
has_skia=pdfengine.engine_has_skia()
|
||||||
|
)
|
||||||
|
except Exception as e:
|
||||||
|
raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=str(e))
|
||||||
@@ -59,3 +59,63 @@ def render_page_compat(document_id: str, page: int = 0, zoom: float = 1.0, rotat
|
|||||||
dpi = int(96 * zoom)
|
dpi = int(96 * zoom)
|
||||||
return render_page(document_id, page, dpi)
|
return render_page(document_id, page, dpi)
|
||||||
|
|
||||||
|
@router.get("/{page_index}")
|
||||||
|
def get_page_info(document_id: str, page_index: int):
|
||||||
|
if not engine.is_available():
|
||||||
|
raise HTTPException(
|
||||||
|
status_code=status.HTTP_501_NOT_IMPLEMENTED,
|
||||||
|
detail="Engine bridge (bindings/python) not yet available."
|
||||||
|
)
|
||||||
|
|
||||||
|
doc_info = document_store.get_document(document_id)
|
||||||
|
if not doc_info:
|
||||||
|
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Document not found")
|
||||||
|
|
||||||
|
try:
|
||||||
|
doc = doc_info["doc_instance"]
|
||||||
|
page = doc.get_page(page_index)
|
||||||
|
return {"width": page.width, "height": page.height}
|
||||||
|
except IndexError:
|
||||||
|
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Page index out of bounds")
|
||||||
|
except Exception as e:
|
||||||
|
raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail=str(e))
|
||||||
|
|
||||||
|
@router.get("/{page_index}/transform/page-to-device")
|
||||||
|
def transform_page_to_device(document_id: str, page_index: int, x: float, y: float, device_width: int, device_height: int, rotate: int = 0):
|
||||||
|
if not engine.is_available():
|
||||||
|
raise HTTPException(status_code=status.HTTP_501_NOT_IMPLEMENTED, detail="Engine unavailable")
|
||||||
|
|
||||||
|
doc_info = document_store.get_document(document_id)
|
||||||
|
if not doc_info:
|
||||||
|
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Document not found")
|
||||||
|
|
||||||
|
try:
|
||||||
|
pdfengine = engine.require()
|
||||||
|
doc = doc_info["doc_instance"]
|
||||||
|
page = doc.get_page(page_index)
|
||||||
|
|
||||||
|
pt = pdfengine.Point2D(x=x, y=y)
|
||||||
|
res = page.page_to_device(pt, device_width, device_height, rotate)
|
||||||
|
return {"x": res.x, "y": res.y}
|
||||||
|
except Exception as e:
|
||||||
|
raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail=str(e))
|
||||||
|
|
||||||
|
@router.get("/{page_index}/transform/device-to-page")
|
||||||
|
def transform_device_to_page(document_id: str, page_index: int, x: int, y: int, device_width: int, device_height: int, rotate: int = 0):
|
||||||
|
if not engine.is_available():
|
||||||
|
raise HTTPException(status_code=status.HTTP_501_NOT_IMPLEMENTED, detail="Engine unavailable")
|
||||||
|
|
||||||
|
doc_info = document_store.get_document(document_id)
|
||||||
|
if not doc_info:
|
||||||
|
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Document not found")
|
||||||
|
|
||||||
|
try:
|
||||||
|
pdfengine = engine.require()
|
||||||
|
doc = doc_info["doc_instance"]
|
||||||
|
page = doc.get_page(page_index)
|
||||||
|
|
||||||
|
pt = pdfengine.DevicePoint(x=x, y=y)
|
||||||
|
res = page.device_to_page(pt, device_width, device_height, rotate)
|
||||||
|
return {"x": res.x, "y": res.y}
|
||||||
|
except Exception as e:
|
||||||
|
raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail=str(e))
|
||||||
|
|||||||
Reference in New Issue
Block a user