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
risposta
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.
Le immagini si sono presentate normalmente con questo approccio? – Joril
Ho immagini che mostrano sul pdf senza problemi. Se hai problemi con le immagini, potresti elaborare o iniziare una nuova domanda? – adam
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
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
Sì, ma la parte difficile è come capire la parte "di y" :) Cioè, la numero totale di pagine – Joril
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))
funziona solo se hai più pass – jake77
Ho avuto questo stesso problema. Ecco la ricetta di ActiveState che utilizza NumberedCanvas che funziona effettivamente: http://code.activestate.com/recipes/576832/ – Esteban