"""Render paginated table pages into a matplotlib PdfPages object.""" from __future__ import annotations from typing import TYPE_CHECKING if TYPE_CHECKING: from matplotlib.backends.backend_pdf import PdfPages def render_table_page_pdfpages( pdf: "PdfPages", title: str, rows: list[list[str]], col_labels: list[str], max_rows: int = 28, figsize: tuple[float, float] = (11.69, 8.27), fontsize: int = 8, dpi: int = 300, ) -> None: """Render rows as paginated table pages into an open PdfPages object. Partitions rows into chunks of max_rows and writes one A4-landscape page per chunk using matplotlib's table widget. Each page carries the given title. Args: pdf: An open matplotlib PdfPages context. title: Page title shown above the table. rows: List of rows, each row is a list of string cell values. col_labels: Column header labels. max_rows: Maximum rows per page before starting a new page. figsize: Figure size in inches (default A4 landscape 11.69x8.27). fontsize: Font size for table cells. dpi: Resolution used when saving each page. """ import matplotlib matplotlib.use("Agg") import matplotlib.pyplot as plt # Always render at least one page; use a placeholder row when rows is empty chunks: list[list[list[str]]] = [] if not rows: chunks = [[]] else: for start in range(0, len(rows), max_rows): chunks.append(rows[start: start + max_rows]) for chunk in chunks: fig, ax = plt.subplots(figsize=figsize) ax.axis("off") if chunk: table = ax.table(cellText=chunk, colLabels=col_labels, loc="center") table.auto_set_font_size(False) table.set_fontsize(fontsize) table.scale(1, 1.3) ax.set_title(title, fontsize=14, pad=12) pdf.savefig(fig, dpi=dpi) plt.close(fig)