Skip to content

Commit

Permalink
rework toc length calculation (#2038)
Browse files Browse the repository at this point in the history
  • Loading branch information
peterschaer committed Aug 29, 2024
1 parent 86fe195 commit fb93b93
Show file tree
Hide file tree
Showing 2 changed files with 86 additions and 54 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
136 changes: 83 additions & 53 deletions pyramid_oereb/contrib/print_proxy/mapfish_print/toc_pages.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down

0 comments on commit fb93b93

Please sign in to comment.