Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
162 changes: 162 additions & 0 deletions src/pdfrest/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -73,12 +73,15 @@
BmpPdfRestPayload,
GifPdfRestPayload,
JpegPdfRestPayload,
PdfFlattenFormsPayload,
PdfInfoPayload,
PdfMergePayload,
PdfRedactionApplyPayload,
PdfRedactionPreviewPayload,
PdfRestRawFileResponse,
PdfSplitPayload,
PdfToPdfxPayload,
PdfToWordPayload,
PngPdfRestPayload,
TiffPdfRestPayload,
UploadURLs,
Expand All @@ -90,6 +93,7 @@
PdfPageSelection,
PdfRedactionInstruction,
PdfRGBColor,
PdfXType,
)

DEFAULT_BASE_URL = "https://api.pdfrest.com"
Expand Down Expand Up @@ -2141,6 +2145,85 @@ def merge_pdfs(
timeout=timeout,
)

def convert_to_word(
self,
file: PdfRestFile | Sequence[PdfRestFile],
*,
output: str | None = None,
extra_query: Query | None = None,
extra_headers: AnyMapping | None = None,
extra_body: Body | None = None,
timeout: TimeoutTypes | None = None,
) -> PdfRestFileBasedResponse:
"""Convert a PDF to a Word document."""

payload: dict[str, Any] = {"files": file}
if output is not None:
payload["output"] = output

return self._post_file_operation(
endpoint="/word",
payload=payload,
payload_model=PdfToWordPayload,
extra_query=extra_query,
extra_headers=extra_headers,
extra_body=extra_body,
timeout=timeout,
)

def flatten_pdf_forms(
self,
file: PdfRestFile | Sequence[PdfRestFile],
*,
output: str | None = None,
extra_query: Query | None = None,
extra_headers: AnyMapping | None = None,
extra_body: Body | None = None,
timeout: TimeoutTypes | None = None,
) -> PdfRestFileBasedResponse:
"""Flatten form fields in a PDF so they are no longer editable."""

payload: dict[str, Any] = {"files": file}
if output is not None:
payload["output"] = output

return self._post_file_operation(
endpoint="/flattened-forms-pdf",
payload=payload,
payload_model=PdfFlattenFormsPayload,
extra_query=extra_query,
extra_headers=extra_headers,
extra_body=extra_body,
timeout=timeout,
)

def convert_to_pdfx(
self,
file: PdfRestFile | Sequence[PdfRestFile],
*,
output_type: PdfXType,
output: str | None = None,
extra_query: Query | None = None,
extra_headers: AnyMapping | None = None,
extra_body: Body | None = None,
timeout: TimeoutTypes | None = None,
) -> PdfRestFileBasedResponse:
"""Convert a PDF to a specified PDF/X version."""

payload: dict[str, Any] = {"files": file, "output_type": output_type}
if output is not None:
payload["output"] = output

return self._post_file_operation(
endpoint="/pdfx",
payload=payload,
payload_model=PdfToPdfxPayload,
extra_query=extra_query,
extra_headers=extra_headers,
extra_body=extra_body,
timeout=timeout,
)

def convert_to_png(
self,
files: PdfRestFile | Sequence[PdfRestFile],
Expand Down Expand Up @@ -2572,6 +2655,85 @@ async def merge_pdfs(
timeout=timeout,
)

async def convert_to_word(
self,
file: PdfRestFile | Sequence[PdfRestFile],
*,
output: str | None = None,
extra_query: Query | None = None,
extra_headers: AnyMapping | None = None,
extra_body: Body | None = None,
timeout: TimeoutTypes | None = None,
) -> PdfRestFileBasedResponse:
"""Asynchronously convert a PDF to a Word document."""

payload: dict[str, Any] = {"files": file}
if output is not None:
payload["output"] = output

return await self._post_file_operation(
endpoint="/word",
payload=payload,
payload_model=PdfToWordPayload,
extra_query=extra_query,
extra_headers=extra_headers,
extra_body=extra_body,
timeout=timeout,
)

async def flatten_pdf_forms(
self,
file: PdfRestFile | Sequence[PdfRestFile],
*,
output: str | None = None,
extra_query: Query | None = None,
extra_headers: AnyMapping | None = None,
extra_body: Body | None = None,
timeout: TimeoutTypes | None = None,
) -> PdfRestFileBasedResponse:
"""Asynchronously flatten form fields in a PDF."""

payload: dict[str, Any] = {"files": file}
if output is not None:
payload["output"] = output

return await self._post_file_operation(
endpoint="/flattened-forms-pdf",
payload=payload,
payload_model=PdfFlattenFormsPayload,
extra_query=extra_query,
extra_headers=extra_headers,
extra_body=extra_body,
timeout=timeout,
)

async def convert_to_pdfx(
self,
file: PdfRestFile | Sequence[PdfRestFile],
*,
output_type: PdfXType,
output: str | None = None,
extra_query: Query | None = None,
extra_headers: AnyMapping | None = None,
extra_body: Body | None = None,
timeout: TimeoutTypes | None = None,
) -> PdfRestFileBasedResponse:
"""Asynchronously convert a PDF to a specified PDF/X version."""

payload: dict[str, Any] = {"files": file, "output_type": output_type}
if output is not None:
payload["output"] = output

return await self._post_file_operation(
endpoint="/pdfx",
payload=payload,
payload_model=PdfToPdfxPayload,
extra_query=extra_query,
extra_headers=extra_headers,
extra_body=extra_body,
timeout=timeout,
)

async def convert_to_png(
self,
files: PdfRestFile | Sequence[PdfRestFile],
Expand Down
75 changes: 74 additions & 1 deletion src/pdfrest/models/_internal.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@

from pdfrest.types.public import PdfRedactionPreset

from ..types import PdfInfoQuery
from ..types import PdfInfoQuery, PdfXType
from . import PdfRestFile
from .public import PdfRestFileID

Expand Down Expand Up @@ -476,6 +476,79 @@ def _serialize_pdf_merge_payload(
return payload


class PdfToWordPayload(BaseModel):
"""Adapt caller options into a pdfRest-ready Word request payload."""

files: Annotated[
list[PdfRestFile],
Field(
min_length=1,
max_length=1,
validation_alias=AliasChoices("file", "files"),
serialization_alias="id",
),
BeforeValidator(_ensure_list),
AfterValidator(
_allowed_mime_types("application/pdf", error_msg="Must be a PDF file")
),
PlainSerializer(_serialize_as_first_file_id),
]
output: Annotated[
str | None,
Field(serialization_alias="output", min_length=1, default=None),
AfterValidator(_validate_output_prefix),
] = None


class PdfToPdfxPayload(BaseModel):
"""Adapt caller options into a pdfRest-ready PDF/X request payload."""

files: Annotated[
list[PdfRestFile],
Field(
min_length=1,
max_length=1,
validation_alias=AliasChoices("file", "files"),
serialization_alias="id",
),
BeforeValidator(_ensure_list),
AfterValidator(
_allowed_mime_types("application/pdf", error_msg="Must be a PDF file")
),
PlainSerializer(_serialize_as_first_file_id),
]
output_type: Annotated[PdfXType, Field(serialization_alias="output_type")]
output: Annotated[
str | None,
Field(serialization_alias="output", min_length=1, default=None),
AfterValidator(_validate_output_prefix),
] = None


class PdfFlattenFormsPayload(BaseModel):
"""Adapt caller options into a pdfRest-ready flatten-forms request payload."""

files: Annotated[
list[PdfRestFile],
Field(
min_length=1,
max_length=1,
validation_alias=AliasChoices("file", "files"),
serialization_alias="id",
),
BeforeValidator(_ensure_list),
AfterValidator(
_allowed_mime_types("application/pdf", error_msg="Must be a PDF file")
),
PlainSerializer(_serialize_as_first_file_id),
]
output: Annotated[
str | None,
Field(serialization_alias="output", min_length=1, default=None),
AfterValidator(_validate_output_prefix),
] = None


class BmpPdfRestPayload(BasePdfRestGraphicPayload[Literal["rgb", "gray"]]):
"""Adapt caller options into a pdfRest-ready BMP request payload."""

Expand Down
2 changes: 2 additions & 0 deletions src/pdfrest/types/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
PdfRedactionPreset,
PdfRedactionType,
PdfRGBColor,
PdfXType,
)

__all__ = [
Expand All @@ -22,4 +23,5 @@
"PdfRedactionInstruction",
"PdfRedactionPreset",
"PdfRedactionType",
"PdfXType",
]
3 changes: 3 additions & 0 deletions src/pdfrest/types/public.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
"PdfRedactionInstruction",
"PdfRedactionPreset",
"PdfRedactionType",
"PdfXType",
)

PdfInfoQuery = Literal[
Expand Down Expand Up @@ -96,3 +97,5 @@ class PdfMergeSource(TypedDict, total=False):


PdfMergeInput = PdfRestFile | PdfMergeSource | tuple[PdfRestFile, PdfPageSelection]

PdfXType = Literal["PDF/X-1a", "PDF/X-3", "PDF/X-4", "PDF/X-6"]
Loading