From ced532ab072b8ca54d2932ebca20366375ccb013 Mon Sep 17 00:00:00 2001 From: Sai Asish Y Date: Mon, 18 May 2026 17:02:19 -0700 Subject: [PATCH] fix(text_region): restore font state after text_columns context exits --- CHANGELOG.md | 1 + fpdf/text_region.py | 11 ++++++++++- test/text_region/test_text_columns.py | 14 ++++++++++++++ 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 263b23218..109aba541 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -34,6 +34,7 @@ This can also be enabled programmatically with `warnings.simplefilter('default', * fix page order after dry-run of `FPDF.multi_cell` in ToC - _cf._ [issue #1836](https://github.com/py-pdf/fpdf2/issues/1836) * rendering SVG arcs with very small sweeps that previously rounded to zero - _cf._ [issue #1831](https://github.com/py-pdf/fpdf2/issues/1831) * number of surviving escape characters - __cf.__ [issue #1215](https://github.com/py-pdf/fpdf2/issues/1215) +* restore font state after a `text_columns()` / `text_region()` context exits - _cf._ [issue #1804](https://github.com/py-pdf/fpdf2/issues/1804) ### Changed * skip byte-for-byte compressed data comparison when zlib-ng is detected, regardless of OS diff --git a/fpdf/text_region.py b/fpdf/text_region.py index 2e6b1380a..e1540dd76 100644 --- a/fpdf/text_region.py +++ b/fpdf/text_region.py @@ -432,7 +432,16 @@ def __exit__( self.pdf.clear_text_region() self.pdf.page = self._page self.pdf._pop_local_stack() # pyright: ignore[reportPrivateUsage] - self.render() + # Rendering mutates the font state per fragment; restore it afterwards (issue #1804). + saved_font = self.pdf.current_font + saved_font_size_pt = self.pdf.font_size_pt + saved_font_style = self.pdf.font_style + try: + self.render() + finally: + self.pdf.current_font = saved_font + self.pdf.font_size_pt = saved_font_size_pt + self.pdf.font_style = saved_font_style def _check_paragraph(self) -> None: if self._active_paragraph == "EXPLICIT": diff --git a/test/text_region/test_text_columns.py b/test/text_region/test_text_columns.py index ef72d6ef8..b343aa305 100644 --- a/test/text_region/test_text_columns.py +++ b/test/text_region/test_text_columns.py @@ -391,3 +391,17 @@ def test_text_columns_with_shorter_2nd_column(tmp_path): # issue 1442 pdf.write(text="More text after columns.") pdf.ln() assert_pdf_equal(pdf, HERE / "text_columns_with_shorter_2nd_column.pdf", tmp_path) + + +def test_text_columns_does_not_leak_font_state(): # issue 1804 + pdf = FPDF() + pdf.add_page() + pdf.set_font("Helvetica", size=12) + with pdf.text_columns() as cols: + pdf.set_font("Helvetica", size=24) + with cols.paragraph() as par: + par.write("Large heading") + pdf.set_font("Helvetica", size=10) + with cols.paragraph() as par: + par.write("Small body text") + assert pdf.font_size_pt == 12