Skip to content

Commit 2f72cb1

Browse files
Add Export Form Data tool
Assisted-by: Codex
1 parent 6b4298c commit 2f72cb1

4 files changed

Lines changed: 95 additions & 0 deletions

File tree

src/pdfrest/client.py

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@
8585
PdfCompressPayload,
8686
PdfDecryptPayload,
8787
PdfEncryptPayload,
88+
PdfExportFormDataPayload,
8889
PdfFlattenAnnotationsPayload,
8990
PdfFlattenFormsPayload,
9091
PdfFlattenTransparenciesPayload,
@@ -115,6 +116,7 @@
115116
ALL_PDF_INFO_QUERIES,
116117
BmpColorModel,
117118
CompressionLevel,
119+
ExportDataFormat,
118120
ExtractTextGranularity,
119121
FlattenQuality,
120122
GifColorModel,
@@ -2734,6 +2736,36 @@ def import_form_data(
27342736
timeout=timeout,
27352737
)
27362738

2739+
def export_form_data(
2740+
self,
2741+
file: PdfRestFile | Sequence[PdfRestFile],
2742+
*,
2743+
data_format: ExportDataFormat,
2744+
output: str | None = None,
2745+
extra_query: Query | None = None,
2746+
extra_headers: AnyMapping | None = None,
2747+
extra_body: Body | None = None,
2748+
timeout: TimeoutTypes | None = None,
2749+
) -> PdfRestFileBasedResponse:
2750+
"""Export form data from a PDF with form fields to an external data file."""
2751+
2752+
payload: dict[str, Any] = {
2753+
"files": file,
2754+
"data_format": data_format,
2755+
}
2756+
if output is not None:
2757+
payload["output"] = output
2758+
2759+
return self._post_file_operation(
2760+
endpoint="/exported-form-data",
2761+
payload=payload,
2762+
payload_model=PdfExportFormDataPayload,
2763+
extra_query=extra_query,
2764+
extra_headers=extra_headers,
2765+
extra_body=extra_body,
2766+
timeout=timeout,
2767+
)
2768+
27372769
def flatten_pdf_forms(
27382770
self,
27392771
file: PdfRestFile | Sequence[PdfRestFile],
@@ -4048,6 +4080,36 @@ async def import_form_data(
40484080
timeout=timeout,
40494081
)
40504082

4083+
async def export_form_data(
4084+
self,
4085+
file: PdfRestFile | Sequence[PdfRestFile],
4086+
*,
4087+
data_format: ExportDataFormat,
4088+
output: str | None = None,
4089+
extra_query: Query | None = None,
4090+
extra_headers: AnyMapping | None = None,
4091+
extra_body: Body | None = None,
4092+
timeout: TimeoutTypes | None = None,
4093+
) -> PdfRestFileBasedResponse:
4094+
"""Asynchronously export form data from a PDF into a data file."""
4095+
4096+
payload: dict[str, Any] = {
4097+
"files": file,
4098+
"data_format": data_format,
4099+
}
4100+
if output is not None:
4101+
payload["output"] = output
4102+
4103+
return await self._post_file_operation(
4104+
endpoint="/exported-form-data",
4105+
payload=payload,
4106+
payload_model=PdfExportFormDataPayload,
4107+
extra_query=extra_query,
4108+
extra_headers=extra_headers,
4109+
extra_body=extra_body,
4110+
timeout=timeout,
4111+
)
4112+
40514113
async def flatten_pdf_forms(
40524114
self,
40534115
file: PdfRestFile | Sequence[PdfRestFile],

src/pdfrest/models/_internal.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
from pdfrest.types.public import PdfRedactionPreset
2424

2525
from ..types import (
26+
ExportDataFormat,
2627
OcrLanguage,
2728
PdfAType,
2829
PdfInfoQuery,
@@ -1009,6 +1010,34 @@ class PdfImportFormDataPayload(BaseModel):
10091010
] = None
10101011

10111012

1013+
class PdfExportFormDataPayload(BaseModel):
1014+
"""Adapt caller options into a pdfRest-ready export-form-data request payload."""
1015+
1016+
files: Annotated[
1017+
list[PdfRestFile],
1018+
Field(
1019+
min_length=1,
1020+
max_length=1,
1021+
validation_alias=AliasChoices("file", "files"),
1022+
serialization_alias="id",
1023+
),
1024+
BeforeValidator(_ensure_list),
1025+
AfterValidator(
1026+
_allowed_mime_types("application/pdf", error_msg="Must be a PDF file")
1027+
),
1028+
PlainSerializer(_serialize_as_first_file_id),
1029+
]
1030+
data_format: Annotated[
1031+
ExportDataFormat,
1032+
Field(serialization_alias="data_format"),
1033+
]
1034+
output: Annotated[
1035+
str | None,
1036+
Field(serialization_alias="output", min_length=1, default=None),
1037+
AfterValidator(_validate_output_prefix),
1038+
] = None
1039+
1040+
10121041
class PdfCompressPayload(BaseModel):
10131042
"""Adapt caller options into a pdfRest-ready compress request payload."""
10141043

src/pdfrest/types/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
ALL_PDF_RESTRICTIONS,
77
BmpColorModel,
88
CompressionLevel,
9+
ExportDataFormat,
910
ExtractTextGranularity,
1011
FlattenQuality,
1112
GifColorModel,
@@ -37,6 +38,7 @@
3738
"ALL_PDF_RESTRICTIONS",
3839
"BmpColorModel",
3940
"CompressionLevel",
41+
"ExportDataFormat",
4042
"ExtractTextGranularity",
4143
"FlattenQuality",
4244
"GifColorModel",

src/pdfrest/types/public.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
"ALL_PDF_RESTRICTIONS",
1919
"BmpColorModel",
2020
"CompressionLevel",
21+
"ExportDataFormat",
2122
"ExtractTextGranularity",
2223
"FlattenQuality",
2324
"GifColorModel",
@@ -127,6 +128,7 @@ class PdfMergeSource(TypedDict, total=False):
127128
JpegColorModel = Literal["rgb", "cmyk", "gray"]
128129
TiffColorModel = Literal["rgb", "rgba", "cmyk", "lab", "gray"]
129130
GraphicSmoothing = Literal["none", "all", "text", "line", "image"]
131+
ExportDataFormat = Literal["fdf", "xfdf", "xml", "xdp", "xfd"]
130132

131133
SummaryFormat = Literal[
132134
"overview",

0 commit comments

Comments
 (0)