File size: 1,336 Bytes
1ebea81
39f81e0
 
 
1ebea81
39f81e0
 
 
 
1ebea81
39f81e0
 
 
 
 
 
1ebea81
 
 
 
 
 
 
 
39f81e0
1ebea81
 
39f81e0
 
 
1ebea81
39f81e0
 
 
 
1ebea81
39f81e0
 
1ebea81
 
39f81e0
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
from __future__ import annotations

from pathlib import Path

from playwright.sync_api import sync_playwright

from ..core.config import get_settings


def render_pdf(session_id: str, output_path: Path) -> Path:
    settings = get_settings()
    base_url = settings.frontend_base_url.rstrip("/")
    url = f"{base_url}/print/report?session={session_id}"

    output_path.parent.mkdir(parents=True, exist_ok=True)

    with sync_playwright() as playwright:
        browser = playwright.chromium.launch(headless=True, args=["--no-sandbox"])
        context = browser.new_context()
        page = context.new_page()
        page.goto(url, wait_until="networkidle", timeout=settings.pdf_timeout_ms)
        page.wait_for_selector(
            '[data-print-ready="true"]',
            timeout=settings.pdf_timeout_ms,
        )
        page.wait_for_function("document.fonts && document.fonts.ready")
        page.wait_for_function(
            "Array.from(document.images || []).every(img => img.complete)"
        )

        page.pdf(
            path=str(output_path),
            format="A4",
            print_background=True,
            prefer_css_page_size=True,
            margin={"top": "10mm", "right": "10mm", "bottom": "10mm", "left": "10mm"},
        )

        context.close()
        browser.close()

    return output_path