2009-03-12 2 views
13

Sto tentando di aggiungere una semplice "pagina x di y" a un rapporto realizzato con ReportLab. Ho trovato this old post al riguardo, ma forse sei anni dopo è emerso qualcosa di più semplice? ^^;
Ho trovato this recipe troppo, ma quando lo uso, il PDF risultante manca le immagini ..Visualizzazione del conteggio delle pagine con ReportLab

+1

Ho avuto questo stesso problema. Ecco la ricetta di ActiveState che utilizza NumberedCanvas che funziona effettivamente: http://code.activestate.com/recipes/576832/ – Esteban

risposta

11

Sono stato in grado di implementare l'approccio di NumberedCanvas da ActiveState. E 'stato molto facile da fare e non ha cambiato gran parte del mio codice esistente. Tutto quello che dovevo fare era aggiungere la classe NumberedCanvas e aggiungere l'attributo canvasmaker quando costruisci il mio documento. Ho cambiato anche le misure di cui è stato visualizzato il "X di Y":

self.doc.build(pdf) 

divenne

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

doc è un BaseDocTemplate e pdf è la mia lista di elementi fluidi.

+0

Le immagini si sono presentate normalmente con questo approccio? – Joril

+0

Ho immagini che mostrano sul pdf senza problemi. Se hai problemi con le immagini, potresti elaborare o iniziare una nuova domanda? – adam

+0

Sembra che questa tecnica interrompa i collegamenti intra-documenti. Quando l'ho usato, tutti i collegamenti da una parte del documento a un'altra parte iniziarono a navigare verso la parte inferiore della prima pagina, piuttosto che andare ai loro obiettivi reali. – CoreDumpError

1

solo di scavare un po 'di codice per voi, usiamo questo:

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

Ora self._on_page è un metodo che viene chiamato per ogni pagina come:

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

Sì, ma la parte difficile è come capire la parte "di y" :) Cioè, la numero totale di pagine – Joril

4

uso doc.multiBuild

e nel metodo pagina intestazione (definito da "onLaterPages ="):

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

funziona solo se hai più pass – jake77