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 .. code-block:: 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... .. code-block:: python 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 : .. code-block:: python 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 .. code-block:: python from reportlab.lib.pagesizes import A4 - le titre, et l'auteur du pdf. D'où les lignes... .. code-block:: python 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 : .. code-block:: python 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 : .. code-block:: python 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 : .. code-block:: python from reportlab.lib.styles import getSampleStyleSheet styles = getSampleStyleSheet() On peut alors récupérer les différents styles dont on a besoin : .. code-block:: python styleN = styles['Normal'] pour le style normal, ou encore .. code-block:: python 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 : .. code-block:: python Paragraph("Blabla bla", styleN) Documents enrichis ------------------ Différents styles de paragraphes ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ L'exemple suivant montre comment définir différents types de paragraphes... .. code-block:: python 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 : .. code-block:: python from reportlab.platypus import Spacer puis procéder avec cet objet comme avec l'objet Paragraph : .. code-block:: python 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 : .. code-block:: python 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 : .. code-block:: python from reportlab.platypus import Image Puis insérer l'image comme le reste : .. code-block:: python story.append(Image('monImage.jpg', height = hauteur, width = largeur)) où hauteur et largeur correspondent à la dimension de l'image. On peut les obtenir ainsi : .. code-block:: python 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. .. code-block:: python 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