diff --git a/src/calibre/ebooks/pdf/html_writer.py b/src/calibre/ebooks/pdf/html_writer.py
index e4b37c438a..050effac2e 100644
--- a/src/calibre/ebooks/pdf/html_writer.py
+++ b/src/calibre/ebooks/pdf/html_writer.py
@@ -619,12 +619,20 @@ def annotate_toc(toc, anchor_locations, name_anchor_map, log):
child.pdf_loc = loc
-def add_toc(pdf_parent, toc_parent):
+def add_toc(pdf_parent, toc_parent, log, pdf_doc):
for child in toc_parent:
title, loc = child.title, child.pdf_loc
- pdf_child = pdf_parent.create(title, loc.pagenum, True, loc.left, loc.top, loc.zoom)
+ try:
+ pdf_child = pdf_parent.create(title, loc.pagenum, True, loc.left, loc.top, loc.zoom)
+ except ValueError:
+ if loc.pagenum > 1:
+ log.warn(f'TOC node: {title} at page: {loc.pagenum} is beyond end of file, moving it to last page')
+ pdf_child = pdf_parent.create(title, pdf_doc.page_count(), True, loc.left, loc.top, loc.zoom)
+ else:
+ log.warn(f'Ignoring TOC node: {title} at page: {loc.pagenum}')
+ continue
if len(child):
- add_toc(pdf_child, child)
+ add_toc(pdf_child, child, log, pdf_doc)
def get_page_number_display_map(render_manager, opts, num_pages, log):
@@ -1078,7 +1086,7 @@ def convert(opf_path, opts, metadata=None, output_path=None, log=default_log, co
fix_links(pdf_doc, anchor_locations, name_anchor_map, opts.pdf_mark_links, log)
if toc and len(toc):
- add_toc(PDFOutlineRoot(pdf_doc), toc)
+ add_toc(PDFOutlineRoot(pdf_doc), toc, log, pdf_doc)
report_progress(0.75, _('Added links to PDF content'))
pdf_metadata = PDFMetadata(metadata)