systori/bericht

View on GitHub
bericht/pdf/stream.py

Summary

Maintainability
A
3 hrs
Test Coverage
from .document import PDFDocument


class PDFStreamer:

    def __init__(self, block_generator, letterhead=None, layout='portrait'):
        self.generator = block_generator
        self.pdf = PDFDocument(block_generator.css, letterhead, layout)

    def __iter__(self):
        yield from self.pdf.header()
        page = None
        for block in self.generator:
            while block:
                page_created = False
                if page is None:
                    page = self.pdf.add_page()
                    page_created = True
                _, requested_height = block.wrap(page, page.available_width)
                if block.style.page_break_before:
                    if not page_created:
                        yield from page.read()
                        page = self.pdf.add_page()
                        _, requested_height = block.wrap(page, page.available_width)
                if requested_height <= page.available_height:
                    page.x, page.y = block.draw(page, page.x, page.y)
                    if block.style.page_break_after:
                        yield from page.read()
                        page = None
                    break
                else:
                    remainder, block = block.split(None, None, page.available_height, self.generator.css)
                    if remainder:
                        remainder.wrap(page, page.available_width)
                        page.x, page.y = remainder.draw(page, page.x, page.y)
                    assert page.has_content
                    yield from page.read()
                    page = None
        if page:
            yield from page.read()
        yield from self.pdf.footer()