Coverage for src / tracekit / reporting / renderers / pdf.py: 100%
20 statements
« prev ^ index » next coverage.py v7.13.1, created at 2026-01-11 23:04 +0000
« prev ^ index » next coverage.py v7.13.1, created at 2026-01-11 23:04 +0000
1"""Enhanced PDF report generation.
3High-quality PDF report generation with embedded plots, metadata,
4and PDF/A compliance for archival (enhancements to existing PDF module).
7References:
8 - REPORT-008: PDF Report Generation
9"""
11from __future__ import annotations
13from dataclasses import dataclass
14from typing import TYPE_CHECKING, Any
16if TYPE_CHECKING:
17 from tracekit.reporting.core import Report
20@dataclass
21class PDFRenderer:
22 """PDF report renderer.
24 Attributes:
25 dpi: Plot rendering DPI (default 300 for print quality).
26 embed_fonts: Embed fonts for consistency (default True).
27 vector_graphics: Use vector graphics for plots (default True).
28 table_of_contents: Include TOC (default True).
29 pdfa_compliance: Generate PDF/A-1b output (default False).
30 page_numbering: Include page numbers (default True).
32 References:
33 REPORT-008: PDF Report Generation Engine
34 """
36 dpi: int = 300
37 embed_fonts: bool = True
38 vector_graphics: bool = True
39 table_of_contents: bool = True
40 pdfa_compliance: bool = False
41 page_numbering: bool = True
44def render_to_pdf(
45 report: Report,
46 output_path: str | None = None,
47 **kwargs: Any,
48) -> bytes:
49 """Render report to PDF.
51 Args:
52 report: Report object to render.
53 output_path: Optional output path (if None, returns bytes).
54 **kwargs: Additional PDF rendering options.
56 Returns:
57 PDF data as bytes (if output_path is None).
59 Example:
60 >>> from tracekit.reporting.core import Report, ReportConfig
61 >>> report = Report(config=ReportConfig(title="Test Report"))
62 >>> pdf_bytes = render_to_pdf(report)
64 References:
65 REPORT-008: PDF Report Generation Engine
66 """
67 # Import existing PDF module
68 from tracekit.reporting.pdf import generate_pdf_report
70 # Merge kwargs with defaults
71 renderer = PDFRenderer(**kwargs)
73 # Generate PDF
74 pdf_bytes = generate_pdf_report(
75 report,
76 dpi=renderer.dpi,
77 embed_fonts=renderer.embed_fonts,
78 vector_graphics=renderer.vector_graphics,
79 table_of_contents=renderer.table_of_contents,
80 pdfa_compliance=renderer.pdfa_compliance,
81 )
83 # Save if path provided
84 if output_path:
85 with open(output_path, "wb") as f:
86 f.write(pdf_bytes)
88 return pdf_bytes
91__all__ = [
92 "PDFRenderer",
93 "render_to_pdf",
94]