2009-03-12 8 views
13

J'essaie d'ajouter une simple "page x de y" à un rapport réalisé avec ReportLab .. J'ai trouvé this old post à ce sujet, mais peut-être que six ans plus tard quelque chose de plus simple a émergé? ^^;
Je trouve this recipe aussi, mais quand je l'utilise, le PDF résultant manque les images ..Affichage du nombre de pages avec ReportLab

+1

J'ai eu ce même problème. Voici la recette d'ActiveState en utilisant NumberedCanvas qui fonctionne réellement: http://code.activestate.com/recipes/576832/ – Esteban

Répondre

11

J'ai été en mesure d'implémenter l'approche NumberedCanvas d'ActiveState. C'était très facile à faire et n'a pas changé beaucoup de mon code existant. Tout ce que j'avais à faire était d'ajouter cette classe NumberedCanvas et d'ajouter l'attribut canvasmaker lors de la construction de mon document. J'ai aussi changé les mesures de où le "x de y" a été affiché:

self.doc.build(pdf) 

est devenu

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

doc est un BaseDocTemplate et pdf ma liste d'éléments fluides.

+0

Est-ce que les images apparaissaient normalement avec cette approche? – Joril

+0

J'ai des images affichées sur le pdf sans aucun problème. Si vous rencontrez un problème avec les images, pourriez-vous élaborer ou lancer une nouvelle question? – adam

+0

Il semble que cette technique casse les liens intra-document. Quand je l'ai utilisé, tous les liens d'une partie du document vers une autre partie ont commencé à naviguer à mi-chemin de la première page, plutôt que d'aller à leurs cibles réelles. – CoreDumpError

1

Il suffit de déterrer un code pour vous, nous utilisons ceci:

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

maintenant self._on_page est une méthode qui est appelé pour chaque page comme:

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

Oui mais la partie difficile est de savoir comment comprendre la partie "de y" :) C'est-à-dire, le nombre total de pages – Joril

4

utilisation doc.multiBuild

et dans la méthode d'en-tête de page (définie par "onLaterPages ="):

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

cela ne fonctionne que si vous avez plusieurs passes – jake77

Questions connexes