2013-06-12 2 views
2

Я работаю над фактурой, и я хотел бы добавить нижний колонтитул только на последней странице (которая также может быть первой страницей).Нижний колонтитул только на последней странице данных в Reportlab

Поскольку данные таблицы динамические, я не могу вычислить количество страниц.

Теперь я работаю с 2 страницами шаблонами, первая страница (с 2 кадрами и нижним колонтитулом1) и nextpages (с 1 кадром и footer2). Это работает, когда данные заполняют две страницы, но когда таблица заполняет только 1 страницу или более, а затем 2 страницы, она больше не работает.

Я определил колонтитул следующим образом:

footerFrame = Frame(x1=35*mm, y1=20*mm, width=175*mm, height=15*mm) 
    footerStory = [ Paragraph("Have a nice day.", styles["fancy"]) ] 

    def footer2(canvas,document): 
     canvas.saveState() 
     footerFrame.addFromList(footerStory, canvas) 
     canvas.restoreState() 

Есть более гибкий способ определить колонтитул, так оно отображается на странице, на которой заканчивается таблица?

Заранее спасибо.

ответ

3

Переопределяя класс холста ReportLabs, вы можете отслеживать страницы (при условии, что я сделал это с другими отчетами, которые не включают в себя текущие данные, но я считаю, что вы все равно можете заставить его работать!).

Поскольку вы используете текущую (абзац), вам нужно знать, сколько страниц будет с каждым новым поколением PDF (длина - динамическая часть). Я не на 100% положителен, но я думаю, что текущая версия ReportLab все еще вызывает метод showPage() для холста. Таким образом, вы можете сделать следующее:

В псевдокоде/неполного питон, я бы рекомендовал следующее (непроверенный):

class MyFooterCanvas(canvas.Canvas): 
    def __init__(self, *args, **kwargs): 
     ## Subclass the ReportLab canvas class. 
     canvas.Canvas.__init__(self, *args, **kwargs) 
     ## Create an empty list to store the saved pages so you can keep track of them. 
     self._savedPages = [] 

    def showPage(self): 
     """Override the showPage method""" 

     ## We are writing our own showPage() method here, so we can keep track of 
     ## what page we are on. 
     self._savedPages.append(self) 
     ## Start a new page. 
     self._startPage() 

    def drawFooter(self): 
     """Draws the footer to the page. You can have it do whatever you want here""" 
     self.drawString(50, 50, "This is my footer, yay me - footer freedom") 

    def save(self): 
     """Saves the entire PDF in one go, a bit costly to do it this way, 
      but certainly one way to get a footer.""" 
     numPages = len(self._savedPages) 

     for pages in self._savedPages: 
      ## Finds the last page and when it 'hits', it will call the self.drawFooter() method. 
      if pages == self._savedPages[-1]: 
       self.drawFooter() 
      else: 
       ## If it's not the last page, explicitly pass over it. Just being thorough here. 
       pass 

     ## And... continue doing whatever canvas.Canvas() normally does when it saves. 
     canvas.Canvas.save(self) 

СНОВА это проверялось, но я думаю, что это даст вы по вашему желанию. Попробуйте, если вы застряли, дайте мне знать, я смогу избавиться от этого, если понадобится, но я сделал этот же метод для других non-flowables, и это сработало для меня в прошлом.

+0

Спасибо, я попробую и дам вам знать. – Helga

+0

Ваш пример работал и на меня, спасибо. После инициализации была небольшая опечатка в скобках во второй строке. – Helga

+0

@Helga, рад, что это сработало для вас! Спасибо, что поймал эту маленькую опечатку ... теперь ее нужно исправлять. Кроме того, если бы вы были настолько добры, чтобы отметить этот вопрос как правильный! Мне нравится получать «очки»: P * самопомощный один вопрос SO одновременно! * –

 Смежные вопросы

  • Нет связанных вопросов^_^