From 077bed74d943d899a6ca6f94d1fc5727552e3e0a Mon Sep 17 00:00:00 2001 From: Connor Ferster Date: Thu, 13 Aug 2026 23:55:26 +0000 Subject: [PATCH 1/3] rebase in progress --- Examples/Document Configuration/report.yml | 15 +- Examples/PDF Backgrounds/report.yml | 11 +- docs/guide/configuration.md | 71 ++++--- docs/guide/pdf-backgrounds.md | 28 ++- docs/reference/blocks.md | 29 ++- src/ymprint/blocks/nextpagetemplate_block.py | 22 +++ src/ymprint/blocks/page_break_block.py | 24 ++- src/ymprint/config/config_loaders.py | 12 ++ .../config/defaults/defaults.ymprint.yml | 21 +- src/ymprint/config/doctemplate.py | 165 ++++++++-------- src/ymprint/config/pdf_postprocessing.py | 180 +++++++----------- src/ymprint/context_builder.py | 28 +-- src/ymprint/report_reader.py | 12 +- .../example_1_config/config.ymprint.yml | 12 +- .../example_2_config/config.ymprint.yml | 36 ++-- tests/test-data/report_example_2.yml | 13 +- tests/test_multipage_templates.py | 137 +++++++++++++ 17 files changed, 529 insertions(+), 287 deletions(-) create mode 100644 src/ymprint/blocks/nextpagetemplate_block.py create mode 100644 tests/test_multipage_templates.py diff --git a/Examples/Document Configuration/report.yml b/Examples/Document Configuration/report.yml index 4619307..e53fa7c 100644 --- a/Examples/Document Configuration/report.yml +++ b/Examples/Document Configuration/report.yml @@ -26,14 +26,27 @@ Customizing your document configuration and styling: Using a combination of configuration levels, you can customize the style of your documents with a minimum amount of configuration text. - - The document template (_doc): + - The document template (_doc): - > +<<<<<<< HEAD The template controls settings such as - _ul: - Page size - Margins - PDF background file path - And whether or not you have a separate set of the above settings applying to the first page of your document or not. +======= + The `_doc` configuration controls the document-wide page size and orientation, along with + one or more named `page templates`. Each page template controls settings such as + - - Margins + - PDF background file path + + - > + The first page template listed is the one your document starts on. Within your report you + can switch between page templates using the `_pagebreak` block (pass it the name or index of + the template to use for the following pages) or the `_nextpagetemplate` block (which arms the + template to switch to at the next page break). +>>>>>>> adb6527 (feat: implement multiple named page templates) - > Currently, the document template is internally configured to only use a single content frame. This limitation would only affect you if you wanted to do something like a two-column layout (where text flows into the second column on the same page once the first one is full). diff --git a/Examples/PDF Backgrounds/report.yml b/Examples/PDF Backgrounds/report.yml index dd96297..48d914f 100644 --- a/Examples/PDF Backgrounds/report.yml +++ b/Examples/PDF Backgrounds/report.yml @@ -1,5 +1,14 @@ _doc: - background: background.pdf + templates: + default: + margins: + top: 72.0 + left: 72.0 + right: 72.0 + bottom: 72.0 + background: + filepath: background.pdf + relative-to: source _vars: field_a: 1645 field_b: 99 Sycamore St, Canada diff --git a/docs/guide/configuration.md b/docs/guide/configuration.md index 832b07a..2cc117e 100644 --- a/docs/guide/configuration.md +++ b/docs/guide/configuration.md @@ -8,7 +8,7 @@ above it. | Key | Category | Controls | | --- | --- | --- | -| `_doc` | Document template | Page size, orientation, margins, PDF background, first-page overrides. | +| `_doc` | Document template | Page size, orientation, and one or more named page templates (margins + PDF background). | | `_style` | Text styles | Body and heading fonts, colours, size, line spacing, bullet styling. | | `_tablestyle` | Table styles | Cell padding, header text, row colours and rule lines. | @@ -31,7 +31,7 @@ internal defaults ─► project config ─► document front matter :::{note} Currently the document template uses a **single content frame**. This only matters if you want something like a two-column layout where text flows into a second column on the same -page. Everything else — margins, backgrounds, first-page overrides — is fully configurable. +page. Everything else — page templates, margins, backgrounds — is fully configurable. ::: ## Inline (document) configuration @@ -70,34 +70,59 @@ inherits from the internal defaults. (cfg-doc)= ## Document template — `_doc` -Controls the page itself. +Controls the page itself. Page size and orientation are document-wide; margins and PDF +backgrounds are set per **named page template**. Declare one or more templates under +`templates` — the **first one listed is the template your document starts on**. ```yaml _doc: - page-size: a4 # a4, letter, etc. - landscape: false - margins: - top: 72.0 # points (72 pt = 1 inch) - left: 72.0 - right: 72.0 - bottom: 72.0 - background: null # path to a PDF to overlay onto — see PDF backgrounds - first-page: # optional: different margins / background for page 1 - margins: - top: 72.0 - left: 72.0 - right: 72.0 - bottom: 72.0 - background: null + page-size: a4 # a4, letter, etc. (document-wide) + landscape: false # document-wide + templates: + cover: # first listed → the document starts here + margins: + top: 144.0 # points (72 pt = 1 inch) + left: 72.0 + right: 72.0 + bottom: 72.0 + background: # path to a PDF to overlay onto — see PDF backgrounds + filepath: cover.pdf + relative-to: source + body: # switch to this with _pagebreak / _nextpagetemplate + margins: + top: 72.0 + left: 72.0 + right: 72.0 + bottom: 72.0 + background: null ``` | Key | Meaning | | --- | --- | -| `page-size` | Named page size, e.g. `a4`, `letter`. | -| `landscape` | `true` to rotate to landscape. | -| `margins` | Page margins in points (`top`, `left`, `right`, `bottom`). | -| `background` | Path to a PDF whose pages are used as a background. See [PDF backgrounds](pdf-backgrounds.md). | -| `first-page` | Optional block giving the first page its own `margins` and `background`. | +| `page-size` | Named page size, e.g. `a4`, `letter`. Document-wide. | +| `landscape` | `true` to rotate to landscape. Document-wide. | +| `templates` | Mapping of template name → page template. The first entry is the starting template. | +| `templates..margins` | Page margins in points (`top`, `left`, `right`, `bottom`). | +| `templates..background` | Path to a PDF whose pages are used as a background. See [PDF backgrounds](pdf-backgrounds.md). | + +### Switching page templates + +Within your report content, switch templates with two blocks: + +- `_pagebreak: ` — insert a page break and use the named (or 0-indexed) + template for the following pages. Called with no value (`_pagebreak:`), it just breaks the + page and keeps the current template. +- `_nextpagetemplate: ` — arm the template to switch to at the **next** page + break, without inserting a break itself. + +```yaml +Report: + - The cover page uses the "cover" template. + - _pagebreak: body # break, and use "body" from here on + - Now on the body template. + - _nextpagetemplate: 0 # arm a switch back to the first template (by index) + - _pagebreak: # the break applies the armed template +``` (cfg-style)= ## Text styles — `_style` diff --git a/docs/guide/pdf-backgrounds.md b/docs/guide/pdf-backgrounds.md index 65f1639..c5e2c33 100644 --- a/docs/guide/pdf-backgrounds.md +++ b/docs/guide/pdf-backgrounds.md @@ -7,11 +7,16 @@ illusion of a sophisticated page-layout workflow while you keep writing plain YA ## Using a background -Point `_doc.background` at a PDF file: +Give a [page template](#cfg-doc) a `background` pointing at a PDF file: ```yaml _doc: - background: background.pdf + templates: + default: + margins: {top: 72.0, left: 72.0, right: 72.0, bottom: 72.0} + background: + filepath: background.pdf + relative-to: source Custom styling with PDF backgrounds: - > @@ -19,13 +24,15 @@ Custom styling with PDF backgrounds: can carry your letterhead, borders, watermarks, and form fields. ``` -The path is resolved relative to the report file. Each page of your document is composited -over the corresponding page of the background. +`relative-to` may be `source` (resolve the path against the report file) or `config` +(against the project config directory). Each page rendered with a template is composited +over its background; when a background PDF has multiple pages, they are matched by page +number. :::{tip} -Give the first page its own background using `_doc.first-page.background` — useful for a -title page or a cover sheet that differs from the body pages. See -[Configuration → Document template](#cfg-doc). +Give a cover or title page its own background by defining a **separate page template** with +its own `background` and switching to the body template with `_pagebreak` — useful when the +first page differs from the rest. See [Configuration → Document template](#cfg-doc). ::: ## Auto-populated form fields @@ -37,7 +44,12 @@ the values look like normal, static PDF content. ```yaml _doc: - background: background.pdf + templates: + default: + margins: {top: 72.0, left: 72.0, right: 72.0, bottom: 72.0} + background: + filepath: background.pdf + relative-to: source _vars: field_a: 1645 field_b: 99 Sycamore St, Canada diff --git a/docs/reference/blocks.md b/docs/reference/blocks.md index 94eceaf..38f9be0 100644 --- a/docs/reference/blocks.md +++ b/docs/reference/blocks.md @@ -38,9 +38,14 @@ The suffix does not affect how the block is executed. It is simply an optional i | [`_code`](#block-code) | A non-executable code block. | | [`_py`](#block-py) | Execute Python and optionally show the syntax-highlighted source. | | [`_loadjson`](#block-loadjson) | Load variables into the document from a JSON file. | +<<<<<<< HEAD | [`_ul`](#block-ul) | An unordered (bulleted) list. | | [`_ol`](#block-ol) | An ordered (numbered) list. | | [`_pagebreak`](#block-pagebreak) | Force a page break. | +======= +| [`_pagebreak`](#block-pagebreak) | Force a page break, optionally switching page template. | +| [`_nextpagetemplate`](#block-nextpagetemplate) | Arm the page template to switch to at the next break. | +>>>>>>> adb6527 (feat: implement multiple named page templates) | [`_hrule`](#block-hrule) | A customizable horizontal rule. | | [`_spacer`](#block-spacer) | Insert vertical whitespace. | @@ -292,15 +297,35 @@ Recommended actions: (block-pagebreak)= ## `_pagebreak` — Page breaks -Force a page break. Takes `null` as its value (an empty block). +Force a page break. Called with no value, it just breaks the page and keeps the current +[page template](configuration.md#cfg-doc). Pass the **name or 0-based index** of a page +template to switch to it for the pages that follow. ```yaml Report: - > This content ends the page. - - _pagebreak: + - _pagebreak: # break, keep the current template - > This content starts a new page. + - _pagebreak: body # break AND switch to the "body" template + - _pagebreak: 1 # equivalently, by index +``` + +--- + +(block-nextpagetemplate)= +## `_nextpagetemplate` — Switch template at the next break + +Arm the [page template](configuration.md#cfg-doc) to switch to at the **next** page break, +without inserting a break itself. Useful when the break is produced elsewhere (for example, +by content overflowing the page). Takes the template **name or 0-based index**. + +```yaml +Report: + - _nextpagetemplate: body # the next page break will switch to "body" + - > + Long content that flows onto a second page, which will use the "body" template. ``` --- diff --git a/src/ymprint/blocks/nextpagetemplate_block.py b/src/ymprint/blocks/nextpagetemplate_block.py new file mode 100644 index 0000000..4512a9e --- /dev/null +++ b/src/ymprint/blocks/nextpagetemplate_block.py @@ -0,0 +1,22 @@ +from typing import Any + +from reportlab.platypus import NextPageTemplate + +from . import register_block +from ..exceptions import YMPrintSyntaxException + + +def convert_next_page_template(block_key: str, block_value: Any, context: dict) -> list: + """ + Sets the page template to switch to at the next page break, without inserting + a break itself. The value is the name or 0-based index of the page template. + """ + doctemplate = context['doctemplate']['ymprint'] + try: + template_id = doctemplate.resolve_template_id(block_value) + except ValueError as exc: + raise YMPrintSyntaxException(str(exc)) from exc + return [NextPageTemplate(template_id)] + + +register_block("_nextpagetemplate", convert_next_page_template) diff --git a/src/ymprint/blocks/page_break_block.py b/src/ymprint/blocks/page_break_block.py index 4f27e65..8f6e09e 100644 --- a/src/ymprint/blocks/page_break_block.py +++ b/src/ymprint/blocks/page_break_block.py @@ -1,10 +1,24 @@ -from reportlab.platypus import PageBreak -from . import register_block +from typing import Any + +from reportlab.platypus import PageBreak, NextPageTemplate +from . import register_block +from ..exceptions import YMPrintSyntaxException -def convert_page_break(block_key: str, block_value: Any, context: dict) -> list[PageBreak]: - return [PageBreak()] +def convert_page_break(block_key: str, block_value: Any, context: dict) -> list: + """ + Inserts a page break. If a value is supplied, it is the name or 0-based index + of the page template to use for the pages that follow the break. + """ + if block_value is None or block_value == "": + return [PageBreak()] + doctemplate = context['doctemplate']['ymprint'] + try: + template_id = doctemplate.resolve_template_id(block_value) + except ValueError as exc: + raise YMPrintSyntaxException(str(exc)) from exc + return [NextPageTemplate(template_id), PageBreak()] -register_block("_pagebreak", convert_page_break) \ No newline at end of file +register_block("_pagebreak", convert_page_break) diff --git a/src/ymprint/config/config_loaders.py b/src/ymprint/config/config_loaders.py index d3bbb86..5ace8b2 100644 --- a/src/ymprint/config/config_loaders.py +++ b/src/ymprint/config/config_loaders.py @@ -96,6 +96,18 @@ def build_current_config(default_config: dict, config_data: DeepChainMap): """ style_map = {} for key in default_config: + # 'templates' is a user-extensible mapping whose keys are arbitrary + # template names, so it must not be merged key-by-key against the + # defaults (which would drop any user-named templates and inject the + # default one). Instead, take the whole mapping from the highest-priority + # layer that defines a non-empty 'templates'. + if key == 'templates': + for mapping in config_data.maps: + templates = mapping.get('templates') + if templates: + style_map['templates'] = templates + break + continue value = config_data[key] if isinstance(value, DeepChainMap): default_value = default_config[key] diff --git a/src/ymprint/config/defaults/defaults.ymprint.yml b/src/ymprint/config/defaults/defaults.ymprint.yml index 546e9e8..b7b4f39 100644 --- a/src/ymprint/config/defaults/defaults.ymprint.yml +++ b/src/ymprint/config/defaults/defaults.ymprint.yml @@ -1,19 +1,14 @@ _doc: page-size: a4 landscape: false - margins: - top: 72.0 - left: 72.0 - right: 72.0 - bottom: 72.0 - background: null - first-page: - margins: - top: 72.0 - left: 72.0 - right: 72.0 - bottom: 72.0 - background: null + templates: + default: + margins: + top: 72.0 + left: 72.0 + right: 72.0 + bottom: 72.0 + background: null _style: headings: diff --git a/src/ymprint/config/doctemplate.py b/src/ymprint/config/doctemplate.py index fb27b41..3022a23 100644 --- a/src/ymprint/config/doctemplate.py +++ b/src/ymprint/config/doctemplate.py @@ -1,7 +1,7 @@ from enum import StrEnum import pathlib from typing import Optional -from pydantic import BaseModel, Field, ConfigDict +from pydantic import BaseModel, Field from reportlab.platypus import BaseDocTemplate, Frame, PageTemplate import reportlab.lib.pagesizes as rl_pagesizes from .helpers import get_pagesize @@ -21,8 +21,8 @@ class PDFBackground(BaseModel): filepath: str relative_to: Optional[RelativeTo] = Field(alias='relative-to', default=None) -class PageConfig(BaseModel): - # model_config = ConfigDict(populate_by_name=True) +class TemplateConfig(BaseModel): + """A single named page template: its content margins and optional PDF background.""" margins: Margins background: Optional[PDFBackground] = None @@ -32,12 +32,9 @@ class PageSizeMixin: class LandscapeMixin: landscape: bool = Field(default = False) -class FirstPageMixin: - first_page: Optional[PageConfig] = Field(default = None, alias='first-page') - -class DocConfig(PageConfig, PageSizeMixin, LandscapeMixin, FirstPageMixin): - pass +class DocConfig(PageSizeMixin, LandscapeMixin, BaseModel): + templates: dict[str, TemplateConfig] @property def page_dims(self): @@ -48,97 +45,105 @@ def page_dims(self): else: final_page_dims = page_dims return final_page_dims - # page_dims = getattr(rl_pagesizes, self.page_size.upper()) else: raise ValueError(f"Page size of {self.page_size.upper()} not found. Page sizes available: {[attr for attr in dir(rl_pagesizes) if attr.isupper()]}") - def available_width(self, first_or_all: str): - if first_or_all == "first": - if getattr(self, 'first_page', None) is not None: - return self.page_dims[0] - self.first_page.margins.left - self.first_page.margins.right - else: - return self.page_dims[0] - self.margins.left - self.margins.right - else: - return self.page_dims[0] - self.margins.left - self.margins.right - - def available_height(self, first_or_all: str): - if first_or_all == "first": - if getattr(self, 'first_page', None) is not None: - return self.page_dims[1] - self.first_page.margins.top - self.first_page.margins.bottom - else: - return self.page_dims[1] - self.margins.top - self.margins.bottom - else: - return self.page_dims[1] - self.margins.top - self.margins.bottom - - def page_anchor(self, first_or_all: str): - if first_or_all == 'first': - if getattr(self, 'first_page', None) is not None: - return [self.first_page.margins.left, self.first_page.margins.bottom] - else: - return [] - else: - return [self.margins.left, self.margins.bottom] + @property + def template_names(self) -> list[str]: + """Template names in declaration order. The first is the starting template.""" + return list(self.templates.keys()) + + def resolve_template_id(self, name_or_index: str | int) -> str: + """ + Returns the template name (used as the ReportLab PageTemplate id) for a + user-supplied template reference, which may be a name or a 0-based index. + """ + names = self.template_names + # bool is an int subclass; reject it explicitly to avoid True/False -> index + if isinstance(name_or_index, bool): + raise ValueError(f"Invalid page template reference: {name_or_index!r}") + if isinstance(name_or_index, int): + try: + return names[name_or_index] + except IndexError: + raise ValueError( + f"Page template index {name_or_index} is out of range. " + f"Available templates (by index): {list(enumerate(names))}" + ) + if isinstance(name_or_index, str): + if name_or_index in self.templates: + return name_or_index + raise ValueError( + f"Page template {name_or_index!r} not found. Available templates: {names}" + ) + raise ValueError(f"Invalid page template reference: {name_or_index!r}") + + def available_width(self, template_name: str) -> float: + template = self.templates[template_name] + return self.page_dims[0] - template.margins.left - template.margins.right + + def available_height(self, template_name: str) -> float: + template = self.templates[template_name] + return self.page_dims[1] - template.margins.top - template.margins.bottom + + def page_anchor(self, template_name: str) -> list[float]: + template = self.templates[template_name] + return [template.margins.left, template.margins.bottom] + + def min_available_width(self) -> float: + """Smallest content width across all templates (safe for sizing flowables).""" + return min(self.available_width(name) for name in self.template_names) + + def min_available_height(self) -> float: + """Smallest content height across all templates (safe for sizing flowables).""" + return min(self.available_height(name) for name in self.template_names) - - def build(self, destination: str | pathlib.Path, title: str = "", author: str = ""): """ - Returns a rl object + Returns a tuple of (BaseDocTemplate, page_template_map). + + 'page_template_map' is an initially-empty dict that is populated during + the ReportLab build with {page_index (0-based): template_name}. Each + PageTemplate records the template used to render each page so that the + correct background can be overlaid in post-processing. """ page_width, page_height = self.page_dims - available_width = page_width - self.margins.left - self.margins.right - available_height = page_height - self.margins.top - self.margins.bottom - main_frame = Frame( - x1=self.margins.left, - y1=self.margins.bottom, - width = available_width, - height = available_height, - id='main', - leftPadding=0, - rightPadding=0, - topPadding=0, - bottomPadding=0 - ) - main_page_template = PageTemplate( - id='report', - pagesize=self.page_dims, - frames=[main_frame], - ) - page_templates = [main_page_template] - first_page_template = None - first_page_frame = None - if self.first_page is not None: - first_available_width = page_width - self.first_page.margins.left - self.first_page.margins.right - first_available_height = page_height - self.first_page.margins.top - self.first_page.margins.bottom - first_page_frame = Frame( - x1=self.first_page.margins.left, - y1=self.first_page.margins.bottom, - width=first_available_width, - height=first_available_height, - id='first', + page_template_map: dict[int, str] = {} + + def make_on_page(template_id: str): + def _on_page(canvas, doc): + page_template_map[canvas.getPageNumber() - 1] = template_id + return _on_page + + page_templates = [] + for name, template in self.templates.items(): + frame = Frame( + x1=template.margins.left, + y1=template.margins.bottom, + width=page_width - template.margins.left - template.margins.right, + height=page_height - template.margins.top - template.margins.bottom, + id=f'{name}_frame', leftPadding=0, rightPadding=0, topPadding=0, bottomPadding=0, ) - first_page_template = PageTemplate( - id='report_first_page', - pagesize=(page_width, page_height), - frames=[first_page_frame], + page_templates.append( + PageTemplate( + id=name, + pagesize=self.page_dims, + frames=[frame], + onPage=make_on_page(name), + ) ) - page_templates.insert(0, first_page_template) + doc = BaseDocTemplate( str(destination), - pagesize = self.page_dims, + pagesize=self.page_dims, pageTemplates=page_templates, title=title, author=author, allowSplitting=1 ) - return doc - - - -# # CRITICAL: This compiles the forward reference ("Doc") now that the class is defined. -# DocConfig.model_rebuild() \ No newline at end of file + return doc, page_template_map diff --git a/src/ymprint/config/pdf_postprocessing.py b/src/ymprint/config/pdf_postprocessing.py index 94137bb..65dadc9 100644 --- a/src/ymprint/config/pdf_postprocessing.py +++ b/src/ymprint/config/pdf_postprocessing.py @@ -1,6 +1,5 @@ import io import pathlib -from typing import Optional import pymupdf as mu @@ -9,155 +8,122 @@ def overlay_pdf_background( pdf_background_streams: dict[str, io.BytesIO | None], destination_path: pathlib.Path | io.BytesIO, context: dict, + page_template_map: dict[int, str], ): """ - Overlays the pages from document_path onto the pages from - pdf_background_path and saves the new file to destination_path. - If first_page_background_path is provided, then that background - will be used for the first page and all other pages will be overlayed - onto pdf_background_path. - - If pdf_background_path is a PDF file with multiple pages, each page - in 'document_path' will be overlayed onto each page of 'pdf_background_path' - in sequence. If 'document_path' has more pages than 'pdf_background_path', - then the remaining pages of 'document_path' will not have a pdf background - applied. If 'pdf_background_path' has more pages than 'document_path', then - the final document will have the same number of pages as 'document_path' and - the remaining un-overlayed pages from 'pdf_background_path' will remain - unused in the final document. + Overlays the rendered document pages onto their page template backgrounds and + saves the result to 'destination_path'. + + 'pdf_background_streams' maps a page template name to its (form-filled) PDF + background stream, or None when that template has no background. + + 'page_template_map' maps a 0-based page index to the name of the page template + that rendered it, so each page is overlaid onto the correct template background. + + If a template's background PDF has multiple pages, each document page rendered + with that template is overlaid onto the background page at the same absolute + document index; document pages beyond the background's page count receive no + background. """ - first_data = pdf_background_streams['first'] - remaining_data = pdf_background_streams['remaining'] page_dims = context['doctemplate']['ymprint'].page_dims page_width, page_height = page_dims - first_bg = None - if first_data is not None: - first_bg = mu.open(stream=pdf_background_streams['first']) - remaining_bg = None - if remaining_data is not None: - remaining_bg = mu.open(stream=pdf_background_streams['remaining']) + + background_docs = { + name: (mu.open(stream=data) if data is not None else None) + for name, data in pdf_background_streams.items() + } + document = mu.open(stream=document_path) output = mu.open() for i in range(document.page_count): document_page = document.load_page(i) document_page.wrap_contents() out_page = output.new_page(width=page_width, height=page_height) - if i == 0 and first_bg is not None: - first_bg_page = first_bg.load_page(0) - first_bg_page.wrap_contents() - out_page.show_pdf_page(first_bg_page.rect, first_bg, pno=0) - out_page.show_pdf_page(document_page.rect, document, pno=i) - continue - if remaining_bg is not None: - if remaining_bg.page_count == 1: - background_page = remaining_bg.load_page(0) - background_page.wrap_contents() + + template_name = page_template_map.get(i) + background = background_docs.get(template_name) + if background is not None: + if background.page_count == 1: background_page_num = 0 + elif i < background.page_count: + background_page_num = i else: - try: - background_page = remaining_bg.load_page(i) - background_page.wrap_contents() - background_page_num = i - except IndexError: - background_page = None - out_page.show_pdf_page(background_page.rect, remaining_bg, pno=background_page_num) + background_page_num = None + if background_page_num is not None: + background_page = background.load_page(background_page_num) + background_page.wrap_contents() + out_page.show_pdf_page(background_page.rect, background, pno=background_page_num) + out_page.show_pdf_page(document_page.rect, document, pno=i) output.save(destination_path) - - -def fill_forms_and_bake(vars: dict, pdf_backgrounds: dict[str, io.BytesIO | None]) -> dict[str, io.BytesIO]: - first_data = pdf_backgrounds['first'] - remaining_data = pdf_backgrounds['remaining'] - first_bg = remaining_bg = None - if first_data is not None: - first_bg = mu.open(stream=first_data) - if remaining_data is not None: - remaining_bg = mu.open(stream=remaining_data) - - if first_bg is None and remaining_bg is None: - return pdf_backgrounds - docs = [first_bg, remaining_bg] - out_docs = {} - - indexes = ['first', 'remaining'] - for idx, doc in enumerate(docs): - if doc is None: - out_docs[indexes[idx]] = None + +def fill_forms_and_bake(vars: dict, pdf_backgrounds: dict[str, io.BytesIO | None]) -> dict[str, io.BytesIO | None]: + """ + For each background stream, populates any PDF form fields whose name matches a + document variable, then flattens ("bakes") the fields into the page content. + Returns a dict with the same keys, mapping to the baked stream (or None). + """ + out_docs: dict[str, io.BytesIO | None] = {} + for name, data in pdf_backgrounds.items(): + if data is None: + out_docs[name] = None continue + doc = mu.open(stream=data) for page in doc.pages(): widget = page.first_widget while widget is not None: - name = widget.field_name - widget_value = vars.get(name, None) - # THIS IS TRICKY + field_name = widget.field_name + widget_value = vars.get(field_name, None) if widget_value is not None: widget.field_value = str(widget_value) widget.update() widget = widget.next - doc.bake() doc_data = io.BytesIO() doc.save(filename=doc_data) doc_data.seek(0) - out_docs[indexes[idx]] = doc_data + out_docs[name] = doc_data return out_docs def load_pdf_backgrounds(context: dict) -> dict[str, io.BytesIO | None]: + """ + Returns a dict mapping each page template name to its background PDF as a + BytesIO stream (or None when the template has no background). Relative + background paths are resolved against the source or config directory according + to each background's 'relative-to' setting. + """ source_path = pathlib.Path(context['source_path']) source_parent = source_path.parent - print(f"{source_parent=}") if context['config_path'] is not None: - config_path = pathlib.Path(context['config_path']) - config_parent = config_path.parent + config_parent = pathlib.Path(context['config_path']).parent else: - config_path = source_path config_parent = source_parent - first_page_bg = context['doctemplate']['yaml']['_doc'].get('first-page', {}).get('background') - if isinstance(first_page_bg, dict): - print(f"{first_page.get('background', {})=}") - first_page_background_filepath = first_page_bg.get('filepath') - relative_to = first_page_bg.get('relative_to') - if relative_to == 'source': - first_page_background = source_parent / first_page_background_filepath - elif relative_to == 'config': - first_page_background = config_parent / first_page_background_filepath - else: - first_page_background = first_page_background_filepath - else: - first_page_background = None - - remaining = context['doctemplate']['yaml']['_doc'].get('background', {}) - first_page_pdf = remaining_pdf = None - first_page_data = remaining_page_data = None - if first_page_background is not None: - first_page_pdf = mu.open(first_page_background) - first_page_data = io.BytesIO() - first_page_pdf.save(first_page_data) - first_page_data.seek(0) - if remaining is not None: - relative_to = remaining.get('relative-to') - print(f"{relative_to=}") + doctemplate = context['doctemplate']['ymprint'] + backgrounds: dict[str, io.BytesIO | None] = {} + for name, template in doctemplate.templates.items(): + background = template.background + if background is None: + backgrounds[name] = None + continue + + relative_to = background.relative_to if relative_to == 'source': - remaining_page_background = source_parent / remaining.get('filepath') + background_path = source_parent / background.filepath elif relative_to == 'config': - remaining_page_background = config_parent / remaining.get('filepath') + background_path = config_parent / background.filepath else: - remaining_page_background = remaining.get('filepath') + background_path = background.filepath - print(f"{remaining_page_background=}") - remaining_pdf = mu.open(remaining_page_background) - remaining_page_data = io.BytesIO() - remaining_pdf.save(remaining_page_data) - remaining_page_data.seek(0) + pdf = mu.open(background_path) + data = io.BytesIO() + pdf.save(data) + data.seek(0) + backgrounds[name] = data - backgrounds = { - "first": first_page_data, - "remaining": remaining_page_data - } - return backgrounds \ No newline at end of file + return backgrounds diff --git a/src/ymprint/context_builder.py b/src/ymprint/context_builder.py index 189965e..a0471a3 100644 --- a/src/ymprint/context_builder.py +++ b/src/ymprint/context_builder.py @@ -21,7 +21,7 @@ def build_context( # This is not an appropriate merge. Need the nested chain map. combined_doctemplate = doctemplate_yaml# | inline_doctemplate doctemplate = DocConfig.model_validate(combined_doctemplate['_doc']) - rl_basedoctemplate = doctemplate.build(destination_path) + rl_basedoctemplate, _ = doctemplate.build(destination_path) report_tablestyles = TableStyle.model_validate(tablestyles_yaml['_tablestyle']) tablestyles = report_tablestyles.build() context = { @@ -54,21 +54,21 @@ def build_context( "vars": document_vars, "page_dims": doctemplate.page_dims, "frames": { - "first_page": { - "anchor": doctemplate.page_anchor('first'), - "width": doctemplate.available_width('first'), - "height": doctemplate.available_height('first'), - }, - "remaining_pages": { - "anchor": doctemplate.page_anchor('all'), - "width": doctemplate.available_width('all'), - "height": doctemplate.available_height('all'), + **{ + name: { + "anchor": doctemplate.page_anchor(name), + "width": doctemplate.available_width(name), + "height": doctemplate.available_height(name), + } + for name in doctemplate.template_names }, + # Conservative frame used by blocks to size flowables that could land + # on any page: the smallest content box across all templates. "all_pages": { - "anchor": doctemplate.page_anchor('all'), - "width": min(doctemplate.available_width('all'), doctemplate.available_width('first')), - "height": min(doctemplate.available_height('all'), doctemplate.available_height('first')), - } + "anchor": doctemplate.page_anchor(doctemplate.template_names[0]), + "width": doctemplate.min_available_width(), + "height": doctemplate.min_available_height(), + }, }, "source_path": source_path, "config_path": config_path, diff --git a/src/ymprint/report_reader.py b/src/ymprint/report_reader.py index 919a6de..5ba8ebc 100644 --- a/src/ymprint/report_reader.py +++ b/src/ymprint/report_reader.py @@ -5,6 +5,7 @@ from .blocks import admonition_block from .blocks import quote_block from .blocks import page_break_block +from .blocks import nextpagetemplate_block from .blocks import spacer_block from .blocks import hrule_block from .blocks import python_block @@ -19,7 +20,7 @@ from .config.pdf_postprocessing import load_pdf_backgrounds, fill_forms_and_bake, overlay_pdf_background -from reportlab.platypus import Spacer, NextPageTemplate +from reportlab.platypus import Spacer from reportlab.lib.units import mm from .config.font_registry import register_fonts @@ -57,20 +58,19 @@ def load_report(source_yaml: str | pathlib.Path, destination_pdf: str | pathlib. ) print(f"{doc_data=}") story = build_story(source_data, context) - if context['doctemplate']['yaml']['_doc'].get('first-page') is not None: - story = [NextPageTemplate(1)] + story - rl_doc = doctemplate.build(destination_pdf) + rl_doc, page_template_map = doctemplate.build(destination_pdf) rl_report_buffer = BytesIO() rl_doc.build(story, filename=rl_report_buffer) rl_report_buffer.seek(0) - # rl_doc.build(story, filename=str(pathlib.Path(destination_pdf).resolve())) + # page_template_map is now populated with {page_index: template_name} pdf_backgrounds = load_pdf_backgrounds(context) populated_backgrounds = fill_forms_and_bake(context['vars'], pdf_backgrounds) overlay_pdf_background( rl_report_buffer, populated_backgrounds, pathlib.Path(destination_pdf), - context + context, + page_template_map, ) diff --git a/tests/test-data/example_1_config/config.ymprint.yml b/tests/test-data/example_1_config/config.ymprint.yml index 3925ddc..f36dbe0 100644 --- a/tests/test-data/example_1_config/config.ymprint.yml +++ b/tests/test-data/example_1_config/config.ymprint.yml @@ -1,11 +1,13 @@ _doc: page-size: a4 landscape: false - margins: - top: 84 - left: 84 - right: 84 - bottom: 84 + templates: + default: + margins: + top: 84 + left: 84 + right: 84 + bottom: 84 _style: headings: diff --git a/tests/test-data/example_2_config/config.ymprint.yml b/tests/test-data/example_2_config/config.ymprint.yml index d000eaa..bfb84ce 100644 --- a/tests/test-data/example_2_config/config.ymprint.yml +++ b/tests/test-data/example_2_config/config.ymprint.yml @@ -1,23 +1,25 @@ _doc: page-size: letter landscape: true - margins: - top: 84 - left: 84 - right: 84 - bottom: 84 - background: - filepath: background_other_pages.pdf - relative-to: source - first-page: - margins: - top: 240 - left: 84 - right: 84 - bottom: 84 - background: - filepath: background_first_page.pdf - relative-to: source + templates: + first: + margins: + top: 240 + left: 84 + right: 84 + bottom: 84 + background: + filepath: background_first_page.pdf + relative-to: source + body: + margins: + top: 84 + left: 84 + right: 84 + bottom: 84 + background: + filepath: background_other_pages.pdf + relative-to: source _tablestyle: cell-padding: diff --git a/tests/test-data/report_example_2.yml b/tests/test-data/report_example_2.yml index b69938b..77329cc 100644 --- a/tests/test-data/report_example_2.yml +++ b/tests/test-data/report_example_2.yml @@ -6,11 +6,7 @@ _vars: date: 2026-06-12 time: 13:00 region: Level 1 columns -_doc: # TODO: this background is not loading - background: - filepath: background_other_pages.pdf - relative-to: source -title: +title: first topic: - > Here is the start of a new paragraph of {{region}}. Any text can be written Here @@ -24,11 +20,18 @@ title: There is a line break here too. - second topic: +<<<<<<< HEAD _ul: - first bullet point - second bullet point - third bullet point - _pagebreak: null +======= + - first bullet point + - second bullet point + - third bullet point + - _pagebreak: body +>>>>>>> adb6527 (feat: implement multiple named page templates) - third topic: - First sub paragraph leading into subheading - Second sub paragraph leading into subheading diff --git a/tests/test_multipage_templates.py b/tests/test_multipage_templates.py new file mode 100644 index 0000000..3e28961 --- /dev/null +++ b/tests/test_multipage_templates.py @@ -0,0 +1,137 @@ +import pathlib + +import pytest +from reportlab.platypus import PageBreak, NextPageTemplate + +import ymprint.config as config +from ymprint.config.config_loaders import load_report_config +from ymprint.blocks.page_break_block import convert_page_break +from ymprint.blocks.nextpagetemplate_block import convert_next_page_template +from ymprint.exceptions import YMPrintSyntaxException + +TEST_DATA = pathlib.Path(__file__).parent / "test-data" + + +def make_doc_config(): + return config.DocConfig.model_validate( + { + "page-size": "a4", + "landscape": False, + "templates": { + "cover": {"margins": {"top": 200, "left": 72, "right": 72, "bottom": 72}}, + "body": {"margins": {"top": 72, "left": 72, "right": 72, "bottom": 72}}, + }, + } + ) + + +# --- DocConfig template resolution ------------------------------------------------- + +def test_template_names_preserve_order(): + doc = make_doc_config() + assert doc.template_names == ["cover", "body"] + + +def test_resolve_template_id_by_name_and_index(): + doc = make_doc_config() + assert doc.resolve_template_id("body") == "body" + assert doc.resolve_template_id(0) == "cover" + assert doc.resolve_template_id(1) == "body" + + +def test_resolve_template_id_rejects_unknown_name(): + doc = make_doc_config() + with pytest.raises(ValueError): + doc.resolve_template_id("nope") + + +def test_resolve_template_id_rejects_out_of_range_index(): + doc = make_doc_config() + with pytest.raises(ValueError): + doc.resolve_template_id(5) + + +def test_min_available_dims_use_smallest_template(): + doc = make_doc_config() + # cover has the larger top margin, so the smallest height comes from cover + assert doc.min_available_height() == doc.available_height("cover") + assert doc.min_available_width() == doc.available_width("body") + + +def test_build_records_page_template_map(): + from io import BytesIO + from reportlab.lib.styles import getSampleStyleSheet + from reportlab.platypus import Paragraph + + doc_cfg = make_doc_config() + styles = getSampleStyleSheet() + story = [ + Paragraph("p1", styles["Normal"]), + NextPageTemplate("body"), + PageBreak(), + Paragraph("p2", styles["Normal"]), + ] + doc, page_map = doc_cfg.build("/dev/null") + doc.build(story, filename=BytesIO()) + assert page_map == {0: "cover", 1: "body"} + + +# --- Block converters -------------------------------------------------------------- + +def make_context(): + return {"doctemplate": {"ymprint": make_doc_config()}} + + +def test_pagebreak_without_value_is_plain_break(): + result = convert_page_break("_pagebreak", None, make_context()) + assert len(result) == 1 + assert isinstance(result[0], PageBreak) + + +def test_pagebreak_with_name_switches_template(): + result = convert_page_break("_pagebreak", "body", make_context()) + assert isinstance(result[0], NextPageTemplate) + assert result[0].action == ("nextPageTemplate", "body") + assert isinstance(result[1], PageBreak) + + +def test_pagebreak_with_index_switches_template(): + result = convert_page_break("_pagebreak", 1, make_context()) + assert isinstance(result[0], NextPageTemplate) + assert result[0].action == ("nextPageTemplate", "body") + + +def test_pagebreak_unknown_template_raises_syntax_exception(): + with pytest.raises(YMPrintSyntaxException): + convert_page_break("_pagebreak", "missing", make_context()) + + +def test_nextpagetemplate_sets_template_without_break(): + result = convert_next_page_template("_nextpagetemplate", "body", make_context()) + assert len(result) == 1 + assert isinstance(result[0], NextPageTemplate) + assert result[0].action == ("nextPageTemplate", "body") + + +def test_nextpagetemplate_unknown_template_raises_syntax_exception(): + with pytest.raises(YMPrintSyntaxException): + convert_next_page_template("_nextpagetemplate", 9, make_context()) + + +# --- Config merge with named templates -------------------------------------------- + +def test_config_named_templates_override_default_template(): + # example_2_config defines 'first' and 'body' templates + _styles, _tablestyles, doc = load_report_config({}, TEST_DATA / "example_2_config") + templates = doc["_doc"]["templates"] + assert list(templates.keys()) == ["first", "body"] + # the default 'default' template must not leak in + assert "default" not in templates + + +def test_config_without_templates_falls_back_to_default(): + # example_1_config defines a single 'default' template + _styles, _tablestyles, doc = load_report_config({}, TEST_DATA / "example_1_config") + templates = doc["_doc"]["templates"] + assert list(templates.keys()) == ["default"] + assert templates["default"]["margins"]["top"] == 84 From dca8cb1f3509e4f7482b59a85c85e9e00b9ef69f Mon Sep 17 00:00:00 2001 From: Connor Ferster Date: Thu, 13 Aug 2026 20:41:37 +0000 Subject: [PATCH 2/3] feat: implement multiple named page templates Replace the first-page/remaining-pages document model with named page templates. `_doc.templates` is a mapping of name -> {margins, background}; the first entry is the starting template. Page size and orientation remain document-wide. Add source-level template switching: - `_pagebreak` accepts an optional template name/index for following pages - `_nextpagetemplate` arms the template to switch to at the next break Template flow is managed by ReportLab's NextPageTemplate. Each PageTemplate records a page-index -> template-name map during the build so post-processing can overlay the correct background per page. Config merge treats `templates` as a whole mapping from the highest-priority layer. Migrate defaults, test configs, examples, and docs to the new schema; add tests covering template resolution, both blocks, the build-time page map, and the config merge. Co-Authored-By: Claude Opus 4.8 --- tests/test-data/report_example_2.yml | 7 ------- 1 file changed, 7 deletions(-) diff --git a/tests/test-data/report_example_2.yml b/tests/test-data/report_example_2.yml index 77329cc..c56299d 100644 --- a/tests/test-data/report_example_2.yml +++ b/tests/test-data/report_example_2.yml @@ -20,18 +20,11 @@ title: There is a line break here too. - second topic: -<<<<<<< HEAD _ul: - first bullet point - second bullet point - third bullet point - - _pagebreak: null -======= - - first bullet point - - second bullet point - - third bullet point - _pagebreak: body ->>>>>>> adb6527 (feat: implement multiple named page templates) - third topic: - First sub paragraph leading into subheading - Second sub paragraph leading into subheading From 8e8b62a99d11452ca5b1afafc4cf5f4fa4640d23 Mon Sep 17 00:00:00 2001 From: Connor Ferster Date: Thu, 13 Aug 2026 20:49:23 +0000 Subject: [PATCH 3/3] chore: removed dead files --- .gitignore | 5 +++++ src/ymprint/config/pdf_fill_forms.py | 0 tests/test-data/example_output1.pdf | Bin 57787 -> 0 bytes tests/test-data/example_output2.pdf | Bin 78384 -> 0 bytes tests/test-data/example_output3.pdf | Bin 38520 -> 0 bytes tests/test-data/example_output4.pdf | Bin 4035 -> 0 bytes tests/test-data/filled_forms.pdf | Bin 45804 -> 0 bytes tests/test-data/report_example_1.pdf | Bin 57426 -> 0 bytes tests/test-data/report_example_2.pdf | Bin 33967 -> 0 bytes 9 files changed, 5 insertions(+) delete mode 100644 src/ymprint/config/pdf_fill_forms.py delete mode 100644 tests/test-data/example_output1.pdf delete mode 100644 tests/test-data/example_output2.pdf delete mode 100644 tests/test-data/example_output3.pdf delete mode 100644 tests/test-data/example_output4.pdf delete mode 100644 tests/test-data/filled_forms.pdf delete mode 100644 tests/test-data/report_example_1.pdf delete mode 100644 tests/test-data/report_example_2.pdf diff --git a/.gitignore b/.gitignore index bb05510..17bc314 100644 --- a/.gitignore +++ b/.gitignore @@ -147,6 +147,11 @@ dmypy.json # Cython debug symbols cython_debug/ +# Generated test output PDFs (regenerated by the test suite; not compared, so not tracked) +tests/test-data/example_output*.pdf +tests/test-data/report_example_*.pdf +tests/test-data/filled_forms.pdf + # PyCharm # JetBrains specific template is maintainted in a separate JetBrains.gitignore that can # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore diff --git a/src/ymprint/config/pdf_fill_forms.py b/src/ymprint/config/pdf_fill_forms.py deleted file mode 100644 index e69de29..0000000 diff --git a/tests/test-data/example_output1.pdf b/tests/test-data/example_output1.pdf deleted file mode 100644 index 0a881b61adf63572d8cecf0e1ecea8cb323b9157..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57787 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 diff --git a/tests/test-data/example_output2.pdf b/tests/test-data/example_output2.pdf deleted file mode 100644 index a04fd089015220d90077e743efd4fce9bdc3cc59..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 78384 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