2009-03-12 2 views
13

Я пытаюсь добавить простую «страницу x of y» в отчет, составленный с ReportLab. Я нашел this old post, но, может быть, через шесть лет возникло нечто более простое? ^^;
я нашел this recipe тоже, но когда я использую его, в результате PDF отсутствует изображение ..Показывать число страниц с ReportLab

+1

У меня была эта же проблема. Вот рецепт из ActiveState, использующий NumberedCanvas, который на самом деле работает: http://code.activestate.com/recipes/576832/ – Esteban

ответ

11

Я смог реализовать подход NumberedCanvas от ActiveState. Это было очень легко сделать и не изменило большую часть моего существующего кода. Все, что мне нужно было сделать, это добавить этот класс NumberedCanvas и добавить атрибут canvasmaker при создании моего документа. Я также изменил измерения, где отображается «х у»:

self.doc.build(pdf) 

стал

self.doc.build(pdf, canvasmaker=NumberedCanvas) 

док является BaseDocTemplate и PDF мой список текучих элементов.

+0

Имеются ли изображения с этим подходом? – Joril

+0

У меня есть изображения, отображаемые на pdf без проблем. Если у вас возникли проблемы с изображениями, вы могли бы разработать или задать новый вопрос? – adam

+0

Похоже, что этот метод нарушает ссылки внутри документа. Когда я использовал его, все ссылки из одной части документа в другую часть начали перемещаться, чтобы частично отбросить первую страницу, а не перейти к их фактическим целям. – CoreDumpError

1

Просто выкапывать код для вас, мы используем это:

SimpleDocTemplate(...).build(self.story, 
          onFirstPage=self._on_page, 
          onLaterPages=self._on_page) 

Теперь self._on_page является метод который вызывается для каждой страницы, например:

def _on_page(self, canvas, doc): 
    # ... do any additional page formatting here for each page 
    print doc.page 
+0

Да, но сложная часть состоит в том, как вычислить часть «y» :) То есть, общее количество страниц – Joril

4

использование doc.multiBuild

и в методе заголовка страницы (определяется "onLaterPages ="):

global TOTALPAGES 
if doc.page > TOTALPAGES: 
    TOTALPAGES = doc.page 
else: 
    canvas.drawString(270 * mm, 5 * mm, "Seite %d/%d" % (doc.page,TOTALPAGES)) 
+0

это работает, только если у вас есть несколько проходов – jake77