From 6516163afc6b0e560fce39106536ff3a7b944ea7 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Thu, 16 Nov 2023 19:11:31 +0530 Subject: [PATCH] PDF Output: Fix an error when trying to set header or footer with an input document that has invalid content after the main body. Fixes #2040074 [PDF transition fails - number of header/footer pages](https://bugs.launchpad.net/calibre/+bug/2040074) --- src/calibre/ebooks/pdf/html_writer.py | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/calibre/ebooks/pdf/html_writer.py b/src/calibre/ebooks/pdf/html_writer.py index 623e914898..98ef90e344 100644 --- a/src/calibre/ebooks/pdf/html_writer.py +++ b/src/calibre/ebooks/pdf/html_writer.py @@ -75,7 +75,15 @@ def create_skeleton(container): spine_name = tuple(container.spine_names)[-1][0] root = container.parsed(spine_name) root = copy.deepcopy(root) - body = last_tag(root) + body = None + for child in tuple(root.iterchildren('*')): + if body is None: + if child.tag == XHTML('body') or child.tag == 'body': + body = child + else: + root.remove(child) + if body is None: + body = last_tag(root) body.text = body.tail = None del body[:] name = container.add_file(spine_name, b'', modify_name_if_needed=True) @@ -899,7 +907,7 @@ def test_merge_fonts(): PAGE_NUMBER_TEMPLATE = '' -def add_header_footer(manager, opts, pdf_doc, container, page_number_display_map, page_layout, page_margins_map, pdf_metadata, report_progress, toc=None): +def add_header_footer(manager, opts, pdf_doc, container, page_number_display_map, page_layout, page_margins_map, pdf_metadata, report_progress, toc, log): header_template, footer_template = opts.pdf_header_template, opts.pdf_footer_template if not footer_template and opts.pdf_page_numbers: footer_template = PAGE_NUMBER_TEMPLATE @@ -1055,7 +1063,7 @@ def add_header_footer(manager, opts, pdf_doc, container, page_number_display_map div.append(format_template(footer_template, page_num, margins.bottom)) container.commit() - # print(open(job[0]).read()) + # print(container.raw_data(name)) results = manager.convert_html_files([job], settle_time=1) data = results[name] if not isinstance(data, bytes): @@ -1065,8 +1073,7 @@ def add_header_footer(manager, opts, pdf_doc, container, page_number_display_map first_page_num = pdf_doc.page_count() num_pages = doc.page_count() if first_page_num != num_pages: - raise ValueError('The number of header/footers pages ({}) != number of document pages ({})'.format( - num_pages, first_page_num)) + raise ValueError(f'The number of header/footers pages ({num_pages}) < number of document pages ({first_page_num})') pdf_doc.append(doc) pdf_doc.impose(1, first_page_num + 1, num_pages) report_progress(0.9, _('Headers and footers added')) @@ -1176,7 +1183,7 @@ def convert(opf_path, opts, metadata=None, output_path=None, log=default_log, co add_header_footer( manager, opts, pdf_doc, container, page_number_display_map, page_layout, page_margins_map, - pdf_metadata, report_progress, toc if has_toc else None) + pdf_metadata, report_progress, toc if has_toc else None, log) num_removed = remove_unused_fonts(pdf_doc) if num_removed: