I'd like to put a barcode in a pdf doc generated by reportlab.
I can put it in a table. That works perfectly with createBarcodeDrawing().
The point is that I'd like the barcode to change on each page. Thus, I want to put it in a canvasmaker.
Whatever method I use (drawImage(), drawInLineImage(),...), I always have an error.
I couldn't even put a simple image, but following a remark I read on http://www.tylerlesmann.com/2009/jan/28/writing-pdfs-python-adding-images/, I tried:
img = 'apple-logo.jpg' self.drawInlineImage('C:\\'+img,20,20)
This works, while 'C:\apple-logo.jpg' doesn't.
Nevertheless, I still don't know how to draw my barcode without writing it to a file before! If someone manages to do it, I would really appreciate.
Can anybody help ?
Thank you in advance
Dom
Attached is some code (adapted from there) to illustrate my need:
from reportlab.pdfgen import canvasfrom reportlab.lib.units import mmclass NumberedCanvas(canvas.Canvas):def __init__(self, *args, **kwargs):canvas.Canvas.__init__(self, *args, **kwargs)self._saved_page_states = []def showPage(self):self._saved_page_states.append(dict(self.__dict__))self._startPage()def save(self):"""add page info to each page (page x of y)"""num_pages = len(self._saved_page_states)for state in self._saved_page_states:self.__dict__.update(state)page_num = self._pageNumbermybarcode = createBarcodeDrawing('QR', value= 'www.mousevspython.com ')# These 2 methods don't work: drawInlineImage or drawImageself.drawImage(mybarcode,20,20)canvas.Canvas.showPage(self)canvas.Canvas.save(self)def main():import sysimport urllib2from cStringIO import StringIOfrom reportlab.platypus import SimpleDocTemplate, Image, Paragraph, PageBreakfrom reportlab.lib.styles import ParagraphStyle, getSampleStyleSheet#This is needed because ReportLab accepts the StringIO as a file-like object,#but doesn't accept urllib2.urlopen's return valuedef get_image(url):u = urllib2.urlopen(url)return StringIO(u.read())styles = getSampleStyleSheet()styleN = ParagraphStyle(styles['Normal'])# build docif len(sys.argv) > 1:fn = sys.argv[1]else:fn = "filename.pdf"doc = SimpleDocTemplate(open(fn, "wb"))elements = [Paragraph("Hello,", styleN),Image(get_image("http://www.red-dove.com/images/rdclogo.gif")),PageBreak(),Paragraph("world!", styleN),Image(get_image("http://www.python.org/images/python-logo.gif")),]doc.build(elements, canvasmaker=NumberedCanvas)if __name__ == "__main__":main()
self.drawImage(mybarcode,20,20) with mybarcode.drawOn(self, 20, 20)def draw_barcode(canvas, doc): canvas.saveState() page_num = canvas._pageNumber mybarcode = createBarcodeDrawing('QR', value= 'www.mousevspython.com - Page %s'%page_num) mybarcode.drawOn(canvas, 20, 20) canvas.restoreState()