From a961d742cb04f3831a63078bad1e46a7437af315 Mon Sep 17 00:00:00 2001 From: Markovvn1 <32509100+Markovvn1@users.noreply.github.com> Date: Sun, 25 Dec 2022 20:33:18 +0300 Subject: [PATCH] Fix performance issue with adding large images with `FlateDecode` image filter (#644) Co-authored-by: Vladimir Markov Fixes https://github.com/PyFPDF/fpdf2/issues/643 --- CHANGELOG.md | 1 + fpdf/image_parsing.py | 16 +++++++++------- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7e015a100..004ab4140 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,6 +27,7 @@ This can also be enabled programmatically with `warnings.simplefilter('default', * `write_html()` now generates warnings for unclosed HTML tags, unless `warn_on_tags_not_matching=False` is set ### Fixed * a `ValueError: Incoherent hierarchy` could be raised when using `write_html()` with some headings hierarchy +* performance issue with adding large images with `FlateDecode` image filter ## [2.6.0] - 2022-11-20 ### Added diff --git a/fpdf/image_parsing.py b/fpdf/image_parsing.py index 8d3684bf3..cc54ac82b 100644 --- a/fpdf/image_parsing.py +++ b/fpdf/image_parsing.py @@ -172,15 +172,17 @@ def _to_zdata(img, remove_slice=None, select_slice=None): data = data[select_slice] # Left-padding every row with a single zero: if img.mode == "1": - loop_incr = ceil(img.size[0] / 8) + 1 + row_size = ceil(img.size[0] / 8) else: channels_count = len(data) // (img.size[0] * img.size[1]) - loop_incr = img.size[0] * channels_count + 1 - i = 0 - while i < len(data): - data[i:i] = b"\0" - i += loop_incr - return zlib.compress(data) + row_size = img.size[0] * channels_count + + data_with_padding = bytearray() + for i in range(0, len(data), row_size): + data_with_padding.extend(b"\0") + data_with_padding.extend(data[i : i + row_size]) + + return zlib.compress(data_with_padding) def _has_alpha(img, alpha_channel):