From 4bc92ec184f0c4430ff73242a17052097228b28d Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sun, 2 Sep 2012 00:06:02 +0530 Subject: [PATCH] PDF Output: Fix page numbers in outline not always correct --- src/calibre/ebooks/pdf/outline_writer.py | 6 +++--- src/calibre/ebooks/pdf/writer.py | 12 ++++++++---- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/calibre/ebooks/pdf/outline_writer.py b/src/calibre/ebooks/pdf/outline_writer.py index 4b2db84f9e..c89f2d9f41 100644 --- a/src/calibre/ebooks/pdf/outline_writer.py +++ b/src/calibre/ebooks/pdf/outline_writer.py @@ -35,12 +35,12 @@ class Outline(object): page, ypos = 0, 0 item = getattr(toc, 'outline_item_', None) if item is not None: + # First use the item URL without fragment + page, ypos = self.pos_map.get(item, {}).get(None, (0, 0)) if toc.fragment: amap = self.pos_map.get(item, None) if amap is not None: - page, ypos = amap.get(toc.fragment, (0, 0)) - else: - page, ypos = self.pos_map.get(item, {}).get(None, (0, 0)) + page, ypos = amap.get(toc.fragment, (page, ypos)) return page, ypos def add_children(self, toc, parent): diff --git a/src/calibre/ebooks/pdf/writer.py b/src/calibre/ebooks/pdf/writer.py index d37db69a81..92054e2f76 100644 --- a/src/calibre/ebooks/pdf/writer.py +++ b/src/calibre/ebooks/pdf/writer.py @@ -196,6 +196,7 @@ class PDFWriter(QObject): # {{{ self.insert_cover() self.render_succeeded = False + self.current_page_num = self.doc.page_count() self.combine_queue.append(os.path.join(self.tmp_path, 'qprinter_out.pdf')) self.first_page = True @@ -283,9 +284,13 @@ class PDFWriter(QObject): # {{{ paged_display.fit_images(); ''') mf = self.view.page().mainFrame() + start_page = self.current_page_num + if not self.first_page: + start_page += 1 while True: if not self.first_page: - self.printer.newPage() + if self.printer.newPage(): + self.current_page_num += 1 self.first_page = False mf.render(self.painter) nsl = evaljs('paged_display.next_screen_location()').toInt() @@ -297,11 +302,10 @@ class PDFWriter(QObject): # {{{ amap = self.bridge_value if not isinstance(amap, dict): amap = {} # Some javascript error occurred - pages = self.doc.page_count() - self.outline.set_pos(self.current_item, None, pages, 0) + self.outline.set_pos(self.current_item, None, start_page, 0) for anchor, x in amap.iteritems(): pagenum, ypos = x - self.outline.set_pos(self.current_item, anchor, pages + pagenum, ypos) + self.outline.set_pos(self.current_item, anchor, start_page + pagenum, ypos) def append_doc(self, outpath): doc = self.podofo.PDFDoc()