Skip to content

Commit 504e92b

Browse files
Add Add Image methods
Assisted-by: Codex
1 parent b671b44 commit 504e92b

2 files changed

Lines changed: 120 additions & 0 deletions

File tree

src/pdfrest/client.py

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@
8383
JpegPdfRestPayload,
8484
OcrPdfPayload,
8585
PdfAddAttachmentPayload,
86+
PdfAddImagePayload,
8687
PdfCompressPayload,
8788
PdfDecryptPayload,
8889
PdfEncryptPayload,
@@ -2548,6 +2549,42 @@ def apply_redactions(
25482549
timeout=timeout,
25492550
)
25502551

2552+
def add_image_to_pdf(
2553+
self,
2554+
file: PdfRestFile | Sequence[PdfRestFile],
2555+
*,
2556+
image: PdfRestFile | Sequence[PdfRestFile],
2557+
x: int,
2558+
y: int,
2559+
page: int,
2560+
output: str | None = None,
2561+
extra_query: Query | None = None,
2562+
extra_headers: AnyMapping | None = None,
2563+
extra_body: Body | None = None,
2564+
timeout: TimeoutTypes | None = None,
2565+
) -> PdfRestFileBasedResponse:
2566+
"""Insert an image into a single page of a PDF."""
2567+
2568+
payload: dict[str, Any] = {
2569+
"files": file,
2570+
"image": image,
2571+
"x": x,
2572+
"y": y,
2573+
"page": page,
2574+
}
2575+
if output is not None:
2576+
payload["output"] = output
2577+
2578+
return self._post_file_operation(
2579+
endpoint="/pdf-with-added-image",
2580+
payload=payload,
2581+
payload_model=PdfAddImagePayload,
2582+
extra_query=extra_query,
2583+
extra_headers=extra_headers,
2584+
extra_body=extra_body,
2585+
timeout=timeout,
2586+
)
2587+
25512588
def split_pdf(
25522589
self,
25532590
file: PdfRestFile | Sequence[PdfRestFile],
@@ -3820,6 +3857,42 @@ async def apply_redactions(
38203857
timeout=timeout,
38213858
)
38223859

3860+
async def add_image_to_pdf(
3861+
self,
3862+
file: PdfRestFile | Sequence[PdfRestFile],
3863+
*,
3864+
image: PdfRestFile | Sequence[PdfRestFile],
3865+
x: int,
3866+
y: int,
3867+
page: int,
3868+
output: str | None = None,
3869+
extra_query: Query | None = None,
3870+
extra_headers: AnyMapping | None = None,
3871+
extra_body: Body | None = None,
3872+
timeout: TimeoutTypes | None = None,
3873+
) -> PdfRestFileBasedResponse:
3874+
"""Asynchronously insert an image into a PDF."""
3875+
3876+
payload: dict[str, Any] = {
3877+
"files": file,
3878+
"image": image,
3879+
"x": x,
3880+
"y": y,
3881+
"page": page,
3882+
}
3883+
if output is not None:
3884+
payload["output"] = output
3885+
3886+
return await self._post_file_operation(
3887+
endpoint="/pdf-with-added-image",
3888+
payload=payload,
3889+
payload_model=PdfAddImagePayload,
3890+
extra_query=extra_query,
3891+
extra_headers=extra_headers,
3892+
extra_body=extra_body,
3893+
timeout=timeout,
3894+
)
3895+
38233896
async def up(
38243897
self,
38253898
*,

src/pdfrest/models/_internal.py

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1021,6 +1021,53 @@ def _validate_profile_dependency(self) -> PdfCompressPayload:
10211021
return self
10221022

10231023

1024+
class PdfAddImagePayload(BaseModel):
1025+
"""Adapt caller options into a pdfRest-ready add-image request payload."""
1026+
1027+
files: Annotated[
1028+
list[PdfRestFile],
1029+
Field(
1030+
min_length=1,
1031+
max_length=1,
1032+
validation_alias=AliasChoices("file", "files"),
1033+
serialization_alias="id",
1034+
),
1035+
BeforeValidator(_ensure_list),
1036+
AfterValidator(
1037+
_allowed_mime_types("application/pdf", error_msg="Must be a PDF file")
1038+
),
1039+
PlainSerializer(_serialize_as_first_file_id),
1040+
]
1041+
image: Annotated[
1042+
list[PdfRestFile],
1043+
Field(
1044+
min_length=1,
1045+
max_length=1,
1046+
validation_alias=AliasChoices("image", "images", "image_file", "image_id"),
1047+
serialization_alias="image_id",
1048+
),
1049+
BeforeValidator(_ensure_list),
1050+
AfterValidator(
1051+
_allowed_mime_types(
1052+
"image/jpeg",
1053+
"image/png",
1054+
"image/tiff",
1055+
"image/gif",
1056+
error_msg="Image must be JPEG, PNG, TIFF, or GIF",
1057+
)
1058+
),
1059+
PlainSerializer(_serialize_as_first_file_id),
1060+
]
1061+
x: Annotated[int, Field(serialization_alias="x")]
1062+
y: Annotated[int, Field(serialization_alias="y")]
1063+
page: Annotated[int, Field(serialization_alias="page", ge=1)]
1064+
output: Annotated[
1065+
str | None,
1066+
Field(serialization_alias="output", min_length=1, default=None),
1067+
AfterValidator(_validate_output_prefix),
1068+
] = None
1069+
1070+
10241071
class PdfXfaToAcroformsPayload(BaseModel):
10251072
"""Adapt caller options into a pdfRest-ready XFA-to-AcroForms request payload."""
10261073

0 commit comments

Comments
 (0)