Skip to content

Commit 6a70de6

Browse files
committed
feat(playwright): add papersize argument
1 parent 473e124 commit 6a70de6

File tree

3 files changed

+37
-20
lines changed

3 files changed

+37
-20
lines changed

README.md

+12-11
Original file line numberDiff line numberDiff line change
@@ -14,17 +14,18 @@ This can be done via a function_url, apigateway or lambda invoke.
1414

1515
Event payload body.
1616

17-
|Field | Type| Description|
18-
|---|---|---|
19-
| **javascript (princexml)** | boolean (False) | Enables [princeXML's javascript execution](https://www.princexml.com/doc/javascript/). This will not render react but can be used for formatting. |
20-
| **check_license** | boolean (False) | Send this field to receive a check on remaining license usage |
21-
| **document_content** | string | Embed the html content in the payload. There will be AWS payload size limitations.|
22-
| **document_url**| url | Fetch the html content from `document_url` to disk before rendering.|
23-
| **browser_url** | url | Browser the `browser_url` with `playwright` before rendering with `renderer`|
24-
| **browser_headers**| Mapping[str,str] | Add additional headers to playwright before visiting `browser_url`|
25-
| **renderer**| `princexml` or `playwright`| Renderer to render the html with |
26-
| **bucket_name**| string | Output the resulting pdf to `s3://{bucket_name}/{uuid}.pdf`. The lambda will require permission to upload to the bucket. The response will include `bucket`, `key`, `presigned_url`|
27-
| **presigned_url**| url | Output the resulting pdf to the presigned url. Generate the presigned url with `put_object`. See Output for more information.|
17+
| Field | Type | Description |
18+
|----------------------------|-----------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
19+
| **javascript (princexml)** | boolean (False) | Enables [princeXML's javascript execution](https://www.princexml.com/doc/javascript/). This will not render react but can be used for formatting. |
20+
| **check_license** | boolean (False) | Send this field to receive a check on remaining license usage |
21+
| **document_content** | string | Embed the html content in the payload. There will be AWS payload size limitations. |
22+
| **document_url** | url | Fetch the html content from `document_url` to disk before rendering. |
23+
| **browser_url** | url | Browser the `browser_url` with `playwright` before rendering with `renderer` |
24+
| **browser_headers** | Mapping[str,str] | Add additional headers to playwright before visiting `browser_url` |
25+
| **browser_papersize** | `A4` or `letter` | Size of the page when creating PDF with playwright | |
26+
| **renderer** | `princexml` or `playwright` | Renderer to render the html with |
27+
| **bucket_name** | string | Output the resulting pdf to `s3://{bucket_name}/{uuid}.pdf`. The lambda will require permission to upload to the bucket. The response will include `bucket`, `key`, `presigned_url` |
28+
| **presigned_url** | url | Output the resulting pdf to the presigned url. Generate the presigned url with `put_object`. See Output for more information. |
2829

2930
### Input
3031

lambda_function.py

+18-3
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,11 @@ class Renderers(str, enum.Enum):
3939
princexml = "princexml"
4040

4141

42+
class Papersize(str, enum.Enum):
43+
A4 = "A4"
44+
Letter = "letter"
45+
46+
4247
class Payload(pydantic.BaseModel):
4348
# NOTE: When updating this model, also update the equivalent documentation
4449
# General Parameters
@@ -53,6 +58,7 @@ class Payload(pydantic.BaseModel):
5358
## Browse the document in a browser before rendering
5459
browser_url: str | None = None
5560
browser_headers: dict = pydantic.Field(default_factory=dict)
61+
browser_papersize: Papersize = Papersize.A4
5662
renderer: Renderers = Renderers.princexml
5763

5864
# Output parameters
@@ -151,9 +157,11 @@ def _playwright_visit_page(browser_url: str, headers: dict) -> Iterator[playwrig
151157
yield page
152158

153159

154-
def playwright_page_to_pdf(browser_url: str, headers: dict, output_filepath: str) -> None:
160+
def playwright_page_to_pdf(
161+
browser_url: str, headers: dict, output_filepath: str, papersize: Papersize = Papersize.A4
162+
) -> None:
155163
with _playwright_visit_page(browser_url, headers) as page:
156-
page.pdf(path=output_filepath, format="A4")
164+
page.pdf(path=output_filepath, format=papersize)
157165

158166

159167
def playwright_page_to_html_string(browser_url: str, headers: dict) -> str:
@@ -175,6 +183,7 @@ def pdf_from_document_content(payload: Payload, output_filepath: str) -> None:
175183
f"file://{temporary_html_file.name}",
176184
payload.browser_headers,
177185
output_filepath,
186+
payload.browser_papersize,
178187
)
179188

180189

@@ -197,6 +206,7 @@ def pdf_from_document_url(payload: Payload, output_filepath: str) -> None:
197206
f"file://{temporary_html_file.name}",
198207
payload.browser_headers,
199208
output_filepath,
209+
payload.browser_papersize,
200210
)
201211

202212

@@ -212,7 +222,12 @@ def pdf_from_browser_url(payload: Payload, output_filepath: str) -> None:
212222
output_filepath,
213223
)
214224
else:
215-
playwright_page_to_pdf(payload.browser_url, payload.browser_headers, output_filepath)
225+
playwright_page_to_pdf(
226+
payload.browser_url,
227+
payload.browser_headers,
228+
output_filepath,
229+
payload.browser_papersize,
230+
)
216231

217232

218233
def execute(cmd: list[str]) -> None:

tests/test_lambda_e2e.py

+7-6
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,9 @@ def test_check_license_returns_a_license_payload() -> None:
5454

5555

5656
@pytest.mark.parametrize("renderer", ["princexml", "playwright"])
57+
@pytest.mark.parametrize("browser_papersize", ["A4", "letter"])
5758
class TestRenderers:
58-
def test_generating_pdf_from_document_url(self, renderer: str):
59+
def test_generating_pdf_from_document_url(self, renderer: str, browser_papersize: str):
5960
s3_client = get_s3_client()
6061

6162
key = gen_temp_key()
@@ -67,24 +68,24 @@ def test_generating_pdf_from_document_url(self, renderer: str):
6768
)
6869

6970
status_code, _, pdf_body = call_lamdba(
70-
{"document_url": document_url, "renderer": renderer},
71+
{"document_url": document_url, "renderer": renderer, "browser_papersize": browser_papersize},
7172
)
7273

7374
assert b"Z" in pdf_body
7475
assert status_code == 200
7576

76-
def test_generating_pdf_from_document_content(self, renderer: str):
77+
def test_generating_pdf_from_document_content(self, renderer: str, browser_papersize: str):
7778
"""Send an embedded html document and receive the pdf bytes for it"""
7879
status_code, _, pdf_body = call_lamdba(
79-
{"document_content": "<h1>Z</h1>", "renderer": renderer},
80+
{"document_content": "<h1>Z</h1>", "renderer": renderer, "browser_papersize": browser_papersize},
8081
)
8182

8283
assert b"Z" in pdf_body
8384
assert status_code == 200
8485

85-
def test_generating_pdf_from_browser_url(self, renderer: str):
86+
def test_generating_pdf_from_browser_url(self, renderer: str, browser_papersize: str):
8687
status_code, _, pdf_body = call_lamdba(
87-
{"browser_url": "http://google.com", "renderer": renderer},
88+
{"browser_url": "http://google.com", "renderer": renderer, "browser_papersize": browser_papersize},
8889
)
8990

9091
assert b"Z" in pdf_body

0 commit comments

Comments
 (0)