Skip to content

Commit 4029b4c

Browse files
committed
Perf: improving speed of FPDF.start_section() - fix #1092
1 parent e85ec4e commit 4029b4c

File tree

2 files changed

+30
-13
lines changed

2 files changed

+30
-13
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ This can also be enabled programmatically with `warnings.simplefilter('default',
2222
### Fixed
2323

2424
### Changed
25+
* improved the performance of `FPDF.start_section()` - _cf._ [issue #1092](https://github.com/py-pdf/fpdf2/issues/1092)
2526

2627

2728
## [2.7.8] - 2024-02-09

fpdf/fpdf.py

+29-13
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,12 @@ def __init__(
163163
self.l_margin = l_margin
164164
self.b_margin = b_margin
165165

166+
def __repr__(self):
167+
return (
168+
super().__repr__()[:-1]
169+
+ f", t_margin={self.t_margin}, l_margin={self.l_margin}, b_margin={self.b_margin})"
170+
)
171+
166172

167173
class ToCPlaceholder(NamedTuple):
168174
render_function: Callable
@@ -1918,7 +1924,7 @@ def set_font(self, family=None, style="", size=0):
19181924
)
19191925
style = ""
19201926

1921-
if size == 0:
1927+
if not size:
19221928
size = self.font_size_pt
19231929

19241930
# Test if font is already selected
@@ -4863,23 +4869,33 @@ def start_section(self, name, level=0, strict=True):
48634869
dest = DestinationXYZ(self.page, top=self.h_pt - self.y * self.k)
48644870
outline_struct_elem = None
48654871
if self.section_title_styles:
4872+
title_style = self.section_title_styles[level]
48664873
# We first check if adding this multi-cell will trigger a page break:
4867-
with self.offset_rendering() as pdf:
4868-
# pylint: disable=protected-access
4869-
with pdf._use_title_style(pdf.section_title_styles[level]):
4870-
pdf.multi_cell(
4871-
w=pdf.epw,
4872-
h=pdf.font_size,
4873-
text=name,
4874-
new_x=XPos.LMARGIN,
4875-
new_y=YPos.NEXT,
4876-
)
4877-
if pdf.page_break_triggered:
4874+
if title_style.size_pt is not None:
4875+
prev_font_size_pt = self.font_size_pt
4876+
self.font_size_pt = title_style.size_pt
4877+
page_break_triggered = self.multi_cell(
4878+
w=self.epw,
4879+
h=self.font_size,
4880+
text=name,
4881+
new_x=XPos.LMARGIN,
4882+
new_y=YPos.NEXT,
4883+
dry_run=True, # => does not produce any output
4884+
output=MethodReturnValue.PAGE_BREAK,
4885+
padding=Padding(
4886+
top=title_style.t_margin or 0,
4887+
left=title_style.l_margin or 0,
4888+
bottom=title_style.b_margin or 0,
4889+
),
4890+
)
4891+
if title_style.size_pt is not None:
4892+
self.font_size_pt = prev_font_size_pt
4893+
if page_break_triggered:
48784894
# If so, we trigger a page break manually beforehand:
48794895
self.add_page()
48804896
with self._marked_sequence(title=name) as struct_elem:
48814897
outline_struct_elem = struct_elem
4882-
with self._use_title_style(self.section_title_styles[level]):
4898+
with self._use_title_style(title_style):
48834899
self.multi_cell(
48844900
w=self.epw,
48854901
h=self.font_size,

0 commit comments

Comments
 (0)