From fb93b938ab9167c59b0eb595f64a215711182299 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20Sch=C3=A4r?= Date: Thu, 29 Aug 2024 15:28:14 +0200 Subject: [PATCH] rework toc length calculation (#2038) --- .../mapfish_print/mapfish_print.py | 4 +- .../print_proxy/mapfish_print/toc_pages.py | 136 +++++++++++------- 2 files changed, 86 insertions(+), 54 deletions(-) diff --git a/pyramid_oereb/contrib/print_proxy/mapfish_print/mapfish_print.py b/pyramid_oereb/contrib/print_proxy/mapfish_print/mapfish_print.py index 06c9f31591..b5b783179d 100644 --- a/pyramid_oereb/contrib/print_proxy/mapfish_print/mapfish_print.py +++ b/pyramid_oereb/contrib/print_proxy/mapfish_print/mapfish_print.py @@ -73,8 +73,10 @@ def __call__(self, value, system): extract_as_dict = self._render(extract_record, value[1]) feature_geometry = mapping(extract_record.real_estate.limit) + display_qrcode = Config.get('print', {}).get('display_qrcode', False) + if Config.get('print', {}).get('compute_toc_pages', False): - extract_as_dict['nbTocPages'] = TocPages(extract_as_dict).getNbPages() + extract_as_dict['nbTocPages'] = TocPages(extract_as_dict, display_qrcode).getNbPages() else: extract_as_dict['nbTocPages'] = 1 diff --git a/pyramid_oereb/contrib/print_proxy/mapfish_print/toc_pages.py b/pyramid_oereb/contrib/print_proxy/mapfish_print/toc_pages.py index f6735fb4b2..dbb3d050c8 100644 --- a/pyramid_oereb/contrib/print_proxy/mapfish_print/toc_pages.py +++ b/pyramid_oereb/contrib/print_proxy/mapfish_print/toc_pages.py @@ -7,102 +7,132 @@ class TocPages(): - def __init__(self, extract): - # variables taken from template toc.jrxml - self.disposable_height = 842 - 70 # A4 size - (footer + header) - self.d1_height = 77 - self.d2_height = 29 - self.d3_height = 61 - self.d4_height = 44 - self.d5_height = 15 - self.d6_height = 90 - self.d6_right_height = 23 - self.d6_right_width = 233 - self.d6_stuff_y_location = 39 - self.d6_left_height = 0 # FIXME: compute this - self.title_size = 62 - self.toc_title_height = 15 + 62 + 12 # height + location + item starting position - self.toc_item_height = 20 - self.not_concerned_themes_title_height = 15 + 26 # height + location - self.not_concerned_themes_item_height = 12 - self.theme_without_data_title_height = 12 - self.theme_without_data_item_height = 12 + def __init__(self, extract, display_qrcode): + self.disposable_height = 842 - 70 # A4 size - (footer + header); toc.jrxml + self.d1_height = 77 # toc.jrxml + self.d2_height = 29 # toc.jrxml + self.d3_height = 61 # toc.jrxml + self.d4_height = 44 # toc.jrxml + self.d5_height = 93 # toc.jrxml + self.d6_height = 38 # toc.jrxml + self.d6_left_height = 38 # toc.jrxml + self.d6_right_height = 20 # toc.jrxml self.extract = extract + self.display_qrcode = display_qrcode self.total_length = self.compute_total_lenght() def compute_d1(self): + # The ConcernedTheme-Heading cannot be calculated at runtime. The used label + # is defined in the mfp-templates which are not accessible here. Therefore + # we assume one line without a line break. return self.d1_height def compute_d2(self): - x = len(self.extract['ConcernedTheme'] * self.toc_item_height) - if x > self.d2_height: - return x + total_size = 0 + blank_space_above = 2 # toc.jrxml + page_label_height = 10 # toc.jrxml + total_size += blank_space_above + page_label_height + toc_item_height = 20 # tocConcernedTheme.jrxml (17 in toc.jrxml) + total_size += len(self.extract['ConcernedTheme']) * toc_item_height + if total_size > self.d2_height: + return total_size else: return self.d2_height def compute_d3(self): - x = self.not_concerned_themes_title_height + len(self.extract['NotConcernedTheme'] * self.not_concerned_themes_item_height) # noqa - if x > self.d3_height: - return x + total_size = 0 + blank_space_above = 26 # toc.jrxml + not_concerned_themes_title_height = 15 # toc.jrxml + blank_space_between = 5 # toc.jrxml + not_concerned_themes_item_height = 12 # themelist.jrxml (15 in toc.jrxml) + total_size += blank_space_above + not_concerned_themes_title_height + blank_space_between + total_size += len(self.extract['NotConcernedTheme']) * not_concerned_themes_item_height + + if total_size > self.d3_height: + return total_size else: return self.d3_height def compute_d4(self): + # The NoDataTheme-Heading cannot be calculated at runtime. The used label + # is defined in the mfp-templates which are not accessible here. Therefore + # we assume one line without a line break. return self.d4_height def compute_d5(self): - x = len(self.extract['ThemeWithoutData'] * self.theme_without_data_item_height) - if x > self.d5_height: - return x + total_size = 0 + theme_without_data_item_height = 12 # themelist.jrxml (15 in toc.jrxml) + total_size += len(self.extract['ThemeWithoutData'] * theme_without_data_item_height) + if total_size > self.d5_height: + return total_size else: return self.d5_height def compute_d6_left(self): - # TODO: compute height when QR-Code is integrated - content_min_size = 10 + 10 + 5 + 10 + 10 # spacing between paragraphs - total_size = 39 - paragraph_space = 11 + total_size = 0 + + # General Information (1 title, multiple items) + general_information_title_height = 8 # general_info_and_disclaimer.jrxml + general_information_item_line_heigth = 8 # general_info_and_disclaimer.jrxml + total_size += general_information_title_height for i in self.extract.get('GeneralInformation', []): - total_size += paragraph_space total_size += self.compute_length_of_wrapped_text(i[0]['Text'], 78, - 10) + general_information_item_line_heigth) + # LandRegister-Disclaimer (1 title, 1 item) + land_register_disclaimer_title_line_height = 8 # general_info_and_disclaimer.jrxml + land_register_disclaimer_item_line_height = 8 # general_info_and_disclaimer.jrxml + for i in self.extract.get('DisclaimerLandRegister', []): + total_size += self.compute_length_of_wrapped_text(i['Title'][0]['Text'], + 65, + land_register_disclaimer_title_line_height) + total_size += self.compute_length_of_wrapped_text(i['Content'][0]['Text'], + 78, + land_register_disclaimer_item_line_height) log.debug('d6 left total_size : {}'.format(total_size)) - if total_size > content_min_size: + if total_size > self.d6_left_height: return total_size else: - return content_min_size + return self.d6_left_height @staticmethod - def compute_length_of_wrapped_text(text, nb_char, font_size): + def compute_length_of_wrapped_text(text, nb_char, line_height): t = textwrap.wrap(text, nb_char) - return len(t) * font_size + return len(t) * line_height def compute_d6_right(self): - # variables taken from template disclaimer.jrxml - space_above = 4 - space_title_content = 2 - content_min_size = 23 total_size = 0 + + blank_space_below_disclaimers = 6 # disclaimer_and_qrcode.jrxml + disclaimer_title_line_height = 8 # disclaimer_and_qrcode.jrxml + disclaimer_item_line_height = 8 # disclaimer_and_qrcode.jrxml + blank_space_above_qrcode = 13 # disclaimer_and_qrcode.jrxml + qr_code_size = 56 # disclaimer_and_qrcode.jrxml + + # Disclaimers (multiple items) for i in self.extract.get('Disclaimer', []): - total_size += space_above total_size += self.compute_length_of_wrapped_text(i['Title'][0]['Text'], 65, - 14) - total_size += space_title_content + disclaimer_title_line_height) total_size += self.compute_length_of_wrapped_text(i['Content'][0]['Text'], 78, - 10) - log.debug('d6 ritght total_size : {}'.format(total_size)) - if total_size > content_min_size: + disclaimer_item_line_height) + total_size += blank_space_below_disclaimers + + # QR-Code (optional) + if self.display_qrcode: + total_size += blank_space_above_qrcode + qr_code_size + + log.debug('d6 right total_size : {}'.format(total_size)) + if total_size > self.d6_right_height: return total_size else: - return content_min_size + return self.d6_right_height def compute_d6(self): - x = max(self.compute_d6_left(), self.compute_d6_right()) + self.d6_stuff_y_location - if x > self.d6_height: - return x + total_size = max(self.compute_d6_left(), self.compute_d6_right()) + if total_size > self.d6_height: + return total_size else: return self.d6_height