reportlab¶
Ce module est utilisé par rst2pdf afin de générer des pdfs mais il est aussi possible de générer des graphiques
l’installation la plus simple est d’utiliser rst2pdf
easy_install rst2pdf
Exemple de graphique¶
On peut trouver des exemples sur
- http://www.reportlab.com/snippets/3/
- http://stackoverflow.com/questions/52652/pretty-graphs-and-charts-in-python
from reportlab.graphics.shapes import Drawing
from reportlab.graphics.charts.barcharts import VerticalBarChart
d = Drawing(300, 200)
chart = VerticalBarChart()
chart.width = 260
chart.height = 160
chart.x = 20
chart.y = 20
chart.data = [[1,2], [3,4]]
chart.categoryAxis.categoryNames = ['foo', 'bar']
chart.valueAxis.valueMin = 0
d.add(chart)
d.save(fnRoot='test', formats=['png', 'pdf'])
Ce module permet la génération de fichiers pdf. On ne détaille ici qu’une très faible partie de l’ensemble de ses possibilités. Pour plus de détails, se rapporter à l’un des liens suivants...
Premier pdf¶
Premier exemple¶
Voici un premier exemple d’utilisation de ce module, qui crée un pdf contenant le texte : Blabla bla...
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.lib.pagesizes import A4
from reportlab.platypus import SimpleDocTemplate, Paragraph
styles = getSampleStyleSheet()
styleN = styles['Normal']
story = []
story.append(Paragraph("Blabla bla", styleN))
doc = SimpleDocTemplate('test.pdf',pagesize = A4,
title = 'Premier test',
author = 'Christophe Guyeux' )
doc.build(story)
Le patron (template)¶
On utilise ci-dessus un patron prédéfini dans le module : SimpleDocTemplate, qui correspond à un document de base.
On y trouve dedans différents objets, correspondant aux différents éléments d’un document classique : paragraphe, image, tableau,... Ces éléments sont à importer à la demande.
D’où l’explication de la ligne :
from reportlab.platypus import SimpleDocTemplate, Paragraph
Le constructeur du pdf¶
Notre document doc est donc un objet de ce type. On a passé différents éléments au constructeur SimpleDocTemplate, à savoir :
- le nom du fichier : test.pdf,
- la taille de la page : A4, qui a nécessité l’import
from reportlab.lib.pagesizes import A4
- le titre, et l’auteur du pdf.
D’où les lignes...
doc = SimpleDocTemplate('test.pdf',pagesize = A4,
title = 'Premier test',
author = 'Christophe Guyeux' )
Le contenu de notre document est une liste story d’objets (paragraphes de texte, images, etc.). On utilise alors la méthode build pour contruire le pdf à partir de cette liste :
doc.build(story)
Reste à expliquer comment faire ladite liste d’objets (story)...
Le contenu¶
Le document est une liste d’objets : paragraphes, images, tableaux, que l’on passera à la méthode build :
story = []
story.append(Paragraph("Blabla bla", styleN))
On détaillera plus loin comment insérer d’autres types d’objets. Remarquons, pour l’instant, que ces objets ont des styles...
Les styles¶
Quand on insère un objet Paragraph dans notre document, il faut lui spécifier son style : police, taille de la police, effets de caractères, etc.
Bien sûr, on peut le faire à la main, et la documentation dont le lien est présent en haut de cette page permet de comprendre comment faire.
Autrement, on peut utiliser une feuille de styles prédéfinie :
from reportlab.lib.styles import getSampleStyleSheet
styles = getSampleStyleSheet()
On peut alors récupérer les différents styles dont on a besoin :
styleN = styles['Normal']
pour le style normal, ou encore
styleT = styles['Title']
styleH = styles['Heading1']
styleH2 = styles['Heading2']
pour, respectivement, les titres de document, de chapitre et de section, etc.
Reste à attacher un style à chaque paragraphe :
Paragraph("Blabla bla", styleN)
Documents enrichis¶
Différents styles de paragraphes¶
L’exemple suivant montre comment définir différents types de paragraphes...
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.lib.pagesizes import A4
from reportlab.platypus import Paragraph, SimpleDocTemplate
styles = getSampleStyleSheet()
styleT = styles['Title']
styleH = styles['Heading1']
styleH2 = styles['Heading2']
styleN = styles['Normal']
story = []
story.append(Paragraph("Ceci est le titre", styleT))
story.append(Paragraph("Ceci est la section", styleH1))
story.append(Paragraph("Ceci est la sous-section", styleH2))
story.append(Paragraph("Ceci est le paragraphe", styleN))
doc = SimpleDocTemplate('test2.pdf',pagesize = A4,
title = 'Divers styles',
author = 'Christophe Guyeux' )
doc.build(story)
On rappelle que ces styles sont prédéfinis dans la classe getSampleStyleSheet du module reportlab.lib.styles. On peut, au besoin, récupérer cette classe et modifier le fichier, pour adapter les styles prédéfinis.
Des espaces¶
On peut insérer des espaces dans notre document. Pour ce faire, il faut importer l’objet Spacer :
from reportlab.platypus import Spacer
puis procéder avec cet objet comme avec l’objet Paragraph :
story.append(Paragraph("Ceci précède un espace", styleN))
story.append(Spacer(0*cm,0.5*cm))
story.append(Paragraph("Ceci suit un espace", styleN))
Nous avons définis les dimensions de l’espace en centimètres. Cela nécessite une importation :
from reportlab.lib.units import cm
Des images¶
Grosso-modo, les images s’insèrent comme les objets Spacer et Paragraph :
Commencer par importer l’objet Image du module reportlab.platypus :
from reportlab.platypus import Image
Puis insérer l’image comme le reste :
story.append(Image('monImage.jpg', height = hauteur, width = largeur))
où hauteur et largeur correspondent à la dimension de l’image. On peut les obtenir ainsi :
import Image as im
image = im.open('monImage.jpg')
largeur = image.size[0]
hauteur = image.size[1]
Des tableaux¶
Un petit exemple de création d’un tableau basique. Voir la documentation pour faire mieux.
from reportlab.lib.pagesizes import A4
from reportlab.platypus import Paragraph, SimpleDocTemplate,
Table, TableStyle
from reportlab.lib.units import cm
from reportlab.lib import colors
story = []
data = [ [1,2,3],[4,5,6],[7,8,9] ]
t=Table(data, len(data)*[2*cm], len(data[0])*[1*cm])
t.setStyle(TableStyle([('FONTSIZE', (0,0),(-1,-1),12),
('INNERGRID', (-1,-1), (0,0), 0.5, colors.blue),
('BOX', (0,0),(-1,-1), 0.5, colors.red) ]))
story.append(t)
doc = SimpleDocTemplate('test.pdf',pagesize = A4,
title = 'Premier test',
author = 'Christophe Guyeux' )
doc.build(story)
Récupéré sur http://cours-info.iut-bm.univ-fcomte.fr/wiki/pmwiki.php/ModulesPython/Reportlab