Skip to content

Commit b22e4c6

Browse files
Add Export Form Data tool
Assisted-by: Codex
1 parent e34a113 commit b22e4c6

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
@@ -82,6 +82,7 @@
8282
JpegPdfRestPayload,
8383
OcrPdfPayload,
8484
PdfCompressPayload,
85+
PdfExportFormDataPayload,
8586
PdfFlattenAnnotationsPayload,
8687
PdfFlattenFormsPayload,
8788
PdfFlattenTransparenciesPayload,
@@ -110,6 +111,7 @@
110111
ALL_PDF_INFO_QUERIES,
111112
BmpColorModel,
112113
CompressionLevel,
114+
ExportDataFormat,
113115
ExtractTextGranularity,
114116
FlattenQuality,
115117
GifColorModel,
@@ -2686,6 +2688,36 @@ def import_form_data(
26862688
timeout=timeout,
26872689
)
26882690

2691+
def export_form_data(
2692+
self,
2693+
file: PdfRestFile | Sequence[PdfRestFile],
2694+
*,
2695+
data_format: ExportDataFormat,
2696+
output: str | None = None,
2697+
extra_query: Query | None = None,
2698+
extra_headers: AnyMapping | None = None,
2699+
extra_body: Body | None = None,
2700+
timeout: TimeoutTypes | None = None,
2701+
) -> PdfRestFileBasedResponse:
2702+
"""Export form data from a PDF with form fields to an external data file."""
2703+
2704+
payload: dict[str, Any] = {
2705+
"files": file,
2706+
"data_format": data_format,
2707+
}
2708+
if output is not None:
2709+
payload["output"] = output
2710+
2711+
return self._post_file_operation(
2712+
endpoint="/exported-form-data",
2713+
payload=payload,
2714+
payload_model=PdfExportFormDataPayload,
2715+
extra_query=extra_query,
2716+
extra_headers=extra_headers,
2717+
extra_body=extra_body,
2718+
timeout=timeout,
2719+
)
2720+
26892721
def flatten_pdf_forms(
26902722
self,
26912723
file: PdfRestFile | Sequence[PdfRestFile],
@@ -3755,6 +3787,36 @@ async def import_form_data(
37553787
timeout=timeout,
37563788
)
37573789

3790+
async def export_form_data(
3791+
self,
3792+
file: PdfRestFile | Sequence[PdfRestFile],
3793+
*,
3794+
data_format: ExportDataFormat,
3795+
output: str | None = None,
3796+
extra_query: Query | None = None,
3797+
extra_headers: AnyMapping | None = None,
3798+
extra_body: Body | None = None,
3799+
timeout: TimeoutTypes | None = None,
3800+
) -> PdfRestFileBasedResponse:
3801+
"""Asynchronously export form data from a PDF into a data file."""
3802+
3803+
payload: dict[str, Any] = {
3804+
"files": file,
3805+
"data_format": data_format,
3806+
}
3807+
if output is not None:
3808+
payload["output"] = output
3809+
3810+
return await self._post_file_operation(
3811+
endpoint="/exported-form-data",
3812+
payload=payload,
3813+
payload_model=PdfExportFormDataPayload,
3814+
extra_query=extra_query,
3815+
extra_headers=extra_headers,
3816+
extra_body=extra_body,
3817+
timeout=timeout,
3818+
)
3819+
37583820
async def flatten_pdf_forms(
37593821
self,
37603822
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
@@ -5,6 +5,7 @@
55
ALL_PDF_INFO_QUERIES,
66
BmpColorModel,
77
CompressionLevel,
8+
ExportDataFormat,
89
ExtractTextGranularity,
910
FlattenQuality,
1011
GifColorModel,
@@ -34,6 +35,7 @@
3435
"ALL_PDF_INFO_QUERIES",
3536
"BmpColorModel",
3637
"CompressionLevel",
38+
"ExportDataFormat",
3739
"ExtractTextGranularity",
3840
"FlattenQuality",
3941
"GifColorModel",

src/pdfrest/types/public.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
"ALL_PDF_INFO_QUERIES",
1818
"BmpColorModel",
1919
"CompressionLevel",
20+
"ExportDataFormat",
2021
"ExtractTextGranularity",
2122
"FlattenQuality",
2223
"GifColorModel",
@@ -125,6 +126,7 @@ class PdfMergeSource(TypedDict, total=False):
125126
JpegColorModel = Literal["rgb", "cmyk", "gray"]
126127
TiffColorModel = Literal["rgb", "rgba", "cmyk", "lab", "gray"]
127128
GraphicSmoothing = Literal["none", "all", "text", "line", "image"]
129+
ExportDataFormat = Literal["fdf", "xfdf", "xml", "xdp", "xfd"]
128130

129131
SummaryFormat = Literal[
130132
"overview",

0 commit comments

Comments
 (0)