J'écris des PDF avec ReportLab à l'intérieur d'une vue Django, ils sont très simples, l'en-tête, le contenu et le pied de page.
J'utilise SimpleDoctemplate qui convient très bien, pour dessiner des tables dans le contenu, le Footer et l'en-tête sont DRWAN en utilisant: P>
# -*- coding: utf-8 -*- from reportlab.lib.pagesizes import A4, landscape, portrait from reportlab.lib.styles import getSampleStyleSheet from reportlab.platypus import Table, Flowable, SimpleDocTemplate, Paragraph, Spacer, Image from reportlab.lib import randomtext from reportlab import platypus import os,random styles = getSampleStyleSheet() path = os.path.realpath(os.path.dirname(__file__)) def drawPageFrame(canvas, doc): canvas.saveState() canvas.drawImage(path+"/ujiPDF.jpg",50,50,57,57) canvas.restoreState() doc = SimpleDocTemplate("salida.pdf",pagesize=A4) elementos = [] com = 'canvas.drawImage("'+path+'/ujiPDF.jpg",100,100,57,57)' print com elementos.append(platypus.flowables.Macro('canvas.saveState()')) print platypus.flowables.Macro(com) elementos.append(platypus.flowables.Macro(com)) elementos.append(platypus.flowables.Macro('canvas.restoreState()')) para = Paragraph(randomtext.randomText(randomtext.PYTHON,20), styles["Normal"]) elementos.append(para) doc.build(elementos,onFirstPage=drawPageFrame, onLaterPages=drawPageFrame)
3 Réponses :
Votre meilleure option consiste à créer une sous-classe de SimpleDoctemplate ou à base de TeyOpTemplate. Dans la méthode de construction, vous aurez accès à la toile. Si vous souhaitez appuyer sur tout ce que SimpleDoctemplate, vous pouvez essayer de la copier directement à partir de Site-Packages / ReportLab / Platypus / doctemplate.py code>. P>.
Désolé, je ne peux pas essayer votre solution, mais j'ai trouvé deux méthodes, je pense que vous convient mieux avec mes purpouses, des flowables.macro et des flowables.callermacro, quand j'essaie tout je posterai la solution finale, de toute façon, merci, !.
Ummm, lisant le code, le SimpleDoctemplate hérite de TeasyOctemplate, baséoctemplate crée la toile dans la méthode de construction à _startbilild. Theonly chose que je veux, c'est dessiner librement une image. Il doit y avoir d'autres choses simplement.
Il y a une classe d'image dans l'ornithorynque. Il suffit d'utiliser à partir de rappelAb.platypus import image code> et vous avez eu accès à cette classe. Cela fonctionne comme d'autres classes à l'intérieur et
smth.append (image (nom de fichier)) code> ajoute une image à l'objet que vous devez construire dans pdf. Fondée à Site personnel de Tyler Moinsman p>
Vous n'avez pas besoin de sous-classer tout le modèle de document si je vous comprends bien, vous voulez juste un fluide que vous pouvez mettre dans un plaquet simplifié. Vous pouvez y parvenir avec une sous-classe très facile de s'installer.
-> En particulier puisque les gens posent souvent des questions sur la manière de mettre des objets Matplotlib dans ReportLab, je vais montrer comment générer une parcelle avec Matplotlib, puis utiliser la modification fluide pour mettre cette parcelle dans un plaque simplifié (sans enregistrer le fichier à disque). Le concept s'applique à n'importe quel fichier ou à tout ce que vous pouvez alimenter dans un cstringio p>
-> le ci-dessous vous permet de mettre la figure sur le texte (modifier la hauteur du négatif sur positif pour la pousser au-dessus de la ligne imaginaire En haut de la section, l'intrigue passe dans) p>
Le concept de clé est que chaque fluide ne contient pas, elle-même, contient également une toile que nous pouvons tirer sur. p>
p>
import matplotlib.pyplot as plt import cStringIO from reportlab.lib.units import inch, cm from reportlab.lib.pagesizes import letter from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Image, Table from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle import reportlab.lib, reportlab.platypus class flowable_fig(reportlab.platypus.Flowable): def __init__(self, imgdata): reportlab.platypus.Flowable.__init__(self) self.img = reportlab.lib.utils.ImageReader(imgdata) def draw(self): self.canv.drawImage(self.img, 0, 0, height = -2*inch, width=4*inch) # http://www.reportlab.com/apis/reportlab/2.4/pdfgen.html doc = SimpleDocTemplate(("report.pdf"),pagesize=letter, rightMargin=72,leftMargin=72, topMargin=72,bottomMargin=18) Story=[] styles=getSampleStyleSheet() ptext = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi massa dolor, vulputate quis elit sed, sagittis consectetur erat. Sed lobortis nisi eros, eu maximus enim iaculis ac. Vestibulum sagittis urna nec interdum aliquam. Pellentesque ornare velit ut ante ullamcorper, vulputate accumsan nisi vulputate. Fusce consectetur dolor quam. Phasellus hendrerit, ligula vel consectetur pretium, lorem neque dapibus eros, ornare suscipit ipsum dolor id nisl. Sed vel orci id leo efficitur lobortis sit amet id risus. Nullam euismod, ipsum a posuere scelerisque, ante lorem ultrices nibh, ut feugiat metus ex congue enim. Nam lobortis, metus id pellentesque feugiat, arcu orci rutrum felis, quis luctus urna nisl at nulla. Donec eu eros pharetra dolor congue facilisis at ac magna. Nullam eu ultricies metus. Sed sodales, libero viverra pellentesque tempus, magna purus convallis nibh, eu condimentum tortor erat tincidunt turpis. Vestibulum scelerisque tincidunt egestas. Nullam commodo diam nisl, sed consequat ex sagittis eu.' Story.append(Paragraph(ptext, styles["Normal"])) fig = plt.figure(figsize=(10, 3)) plt.plot([1,2,3,4]) plt.ylabel('This is a boring plot') imgdata = cStringIO.StringIO() fig.savefig(imgdata, format='png') imgdata.seek(0) # rewind the data pic = flowable_fig(imgdata) Story.append(pic) doc.build(Story)
C'est bien, devrait être la réponse. Existe-t-il un moyen d'avoir ce comportement comme image code> dans lequel il ajoute à l'histoire code> directement après le dernier élément? J'aime que vous puissiez définir manuellement le x et y vous-même, mais ce serait bien d'avoir la possibilité de le faire se comporter comme
image code>.
J'ai aussi dû utiliser de io importer bytesio code>
@Tunn sonne comme s'ils avaient peut-être déplacé des choses autour d'un peu dans les années depuis (aussi, je l'ai fait avec 2,7). Je ne suis pas sûr de comprendre le commentaire de l'image, quel comportement voulez-vous? L'ajouter à l'histoire le mettra après le dernier élément, mais peut-être que vous voulez dire qu'ellement différent?
Oui, il l'ajoute à l'élément suivant de l'histoire code> code>, mais vous devez le positionner manuellement sous le dernier élément (qui est ce que l'op voulait - "flottant", mais ajoute une image < / code> à
histoire code> est-ce automatiquement). Quoi qu'il en soit, j'ai fini par utiliser cette réponse . La qualité de l'image était la même épargne à la mémoire ou au disque (ce qui n'était pas bon), alors que l'enregistrement comme un
pdf code> à la mémoire, comme dans le lien, la qualité améliorée.
Aha, je pense que je reçois ce que tu dis maintenant, je n'avais pas vraiment pensé de cela comme ça. J'aime le contrôle manuel :) Heureux que vous ayez trouvé un chemin et merci pour le lien!