Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
11 changes: 10 additions & 1 deletion fpdf/text_region.py
Original file line number Diff line number Diff line change
Expand Up @@ -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":
Expand Down
14 changes: 14 additions & 0 deletions test/text_region/test_text_columns.py
Original file line number Diff line number Diff line change
Expand Up @@ -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