From e54d347726f73bada02c704f03e16d1aad62bbcd Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Thu, 4 May 2017 11:27:58 +0530 Subject: [PATCH] PDF Output: Do not crash when unable to find page for link destination, instead use previous page. Fixes #1687914 [Private bug](https://bugs.launchpad.net/calibre/+bug/1687914) --- src/calibre/ebooks/pdf/render/common.py | 9 +++++++++ src/calibre/ebooks/pdf/render/links.py | 18 +++++++++++------- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/src/calibre/ebooks/pdf/render/common.py b/src/calibre/ebooks/pdf/render/common.py index d4e71608fa..70f242542f 100644 --- a/src/calibre/ebooks/pdf/render/common.py +++ b/src/calibre/ebooks/pdf/render/common.py @@ -13,6 +13,7 @@ from datetime import datetime from binascii import hexlify from calibre.constants import plugins, ispy3 +from calibre.utils.logging import default_log pdf_float = plugins['speedup'][0].pdf_float @@ -238,3 +239,11 @@ class Reference(object): return repr(self) # }}} + +def current_log(newlog=None): + if newlog: + current_log.ans = newlog + return current_log.ans or default_log + + +current_log.ans = None diff --git a/src/calibre/ebooks/pdf/render/links.py b/src/calibre/ebooks/pdf/render/links.py index 1ab2beb22d..70a5fd88a3 100644 --- a/src/calibre/ebooks/pdf/render/links.py +++ b/src/calibre/ebooks/pdf/render/links.py @@ -11,17 +11,23 @@ import os from urlparse import urlparse from urllib2 import unquote -from calibre.ebooks.pdf.render.common import Array, Name, Dictionary, String, UTF16String +from calibre.ebooks.pdf.render.common import Array, Name, Dictionary, String, UTF16String, current_log class Destination(Array): def __init__(self, start_page, pos, get_pageref): pnum = start_page + max(0, pos['column']) - try: - pref = get_pageref(pnum) - except IndexError: - pref = get_pageref(pnum-1) + q = pnum + while q > -1: + try: + pref = get_pageref(q) + break + except IndexError: + pos['left'] = pos['top'] = 0 + q -= 1 + if q != pnum: + current_log().warn('Could not find page {} for link destination, using page {} instead'.format(pnum, q)) super(Destination, self).__init__([ pref, Name('XYZ'), pos['left'], pos['top'], None ]) @@ -139,5 +145,3 @@ class Links(object): item = Dictionary({'Parent':parentref, 'Dest':dest, 'Title':UTF16String(toc.text or _('Unknown'))}) return self.pdf.objects.add(item) - -