This commit is contained in:
saqib mir
2026-07-10 11:20:16 +05:30
22 changed files with 720 additions and 54 deletions
+1
View File
@@ -111,6 +111,7 @@ def get_document_annotations(document_id: str) -> list[AnnotationResponse]:
content=a.content,
timestamp=getattr(a, "timestamp", None),
pageIndex=a.page_index,
thickness=getattr(a, "thickness", None),
paths=[[{"x": p.x, "y": p.y} for p in stroke] for stroke in getattr(a, "paths", [])],
quadPoints=getattr(a, "quad_points", []),
fieldName=getattr(a, "field_name", None),
+41 -3
View File
@@ -21,6 +21,19 @@ class TextOverlayData(BaseModel):
fontFamily: str
color: str
class StampData(BaseModel):
text: str
x: float
y: float
width: float
height: float
textColor: str
backgroundColor: str
borderColor: str
fontSize: float = Field(..., gt=0)
includeDate: bool = False
timestamp: str | None = None
class RedactionData(BaseModel):
x: float
@@ -96,6 +109,12 @@ class TextOverlayOperation(BaseModel):
pageIndex: int = Field(..., ge=0)
data: TextOverlayData
class StampOperation(BaseModel):
id: str
type: Literal["stamp"]
pageIndex: int = Field(..., ge=0)
data: StampData
class RedactionOperation(BaseModel):
id: str
@@ -283,8 +302,23 @@ class SquigglyOperation(BaseModel):
pageIndex: int = Field(..., ge=0)
data: DecorationData
class SignatureData(BaseModel):
x: float
y: float
width: float
height: float
image_data: str | None = None
author: str = "Signer"
class SignatureOperation(BaseModel):
id: str
type: Literal["signature"]
pageIndex: int = Field(..., ge=0)
data: SignatureData
EditOperation = Annotated[
TextOverlayOperation
| StampOperation
| RedactionOperation
| ImageOverlayOperation
| HighlightOperation
@@ -301,7 +335,9 @@ EditOperation = Annotated[
| ReflowParagraphOperation
| UnderlineOperation
| StrikeoutOperation
| SquigglyOperation,
| SquigglyOperation
| SignatureOperation
,
Field(discriminator="type"),
]
@@ -313,8 +349,8 @@ class EditsRequest(BaseModel):
_OP_PERMISSION = {
"highlight": "canAnnotate", "underline": "canAnnotate", "strikeout": "canAnnotate",
"squiggly": "canAnnotate", "comment": "canAnnotate", "freehand": "canAnnotate",
"free_text": "canAnnotate", "text_overlay": "canAnnotate", "image_overlay": "canAnnotate",
"delete_annotation": "canAnnotate", "update_annotation": "canAnnotate",
"free_text": "canAnnotate", "text_overlay": "canAnnotate", "stamp": "canAnnotate",
"image_overlay": "canAnnotate", "delete_annotation": "canAnnotate", "update_annotation": "canAnnotate",
"replace_text": "canModify", "reflow_paragraph": "canModify", "redaction": "canModify",
"update_field": "canFillForms",
"page_rotation": "canAssemble", "page_deletion": "canAssemble", "page_reorder": "canAssemble",
@@ -361,6 +397,7 @@ def apply_edits_impl(document_id: str, request: EditsRequest):
if "," in img_data_str:
img_data_str = img_data_str.split(",", 1)[1]
img_data_str += "=" * ((4 - len(img_data_str) % 4) % 4)
raw_bytes = base64.b64decode(img_data_str)
img = Image.open(io.BytesIO(raw_bytes))
img_rgba = img.convert("RGBA")
@@ -371,6 +408,7 @@ def apply_edits_impl(document_id: str, request: EditsRequest):
bgra_bytes = img_bgra.tobytes()
fd, temp_path = tempfile.mkstemp(suffix=".bin", prefix="pdf_pixel_")
temp_path = temp_path.replace("\\", "/")
created_temp_files.append(temp_path)
try:
with os.fdopen(fd, "wb") as tmp:
+1
View File
@@ -13,6 +13,7 @@ class AnnotationResponse(BaseModel):
content: str
timestamp: str | None = None
pageIndex: int
thickness: float | None = None
paths: list[list[dict[str, float]]] = []
quadPoints: list[list[dict[str, float]]] = []