Draw a barcode with drawInlineImage and drawInlineImage

188 views
Skip to first unread message

Dom Dom

unread,
Feb 28, 2014, 11:37:13 AM2/28/14
to reportl...@googlegroups.com
Hello,

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 canvas
from reportlab.lib.units import mm


class 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._pageNumber
            mybarcode = createBarcodeDrawing('QR', value= 'www.mousevspython.com ')
            # These 2 methods don't work:  drawInlineImage or drawImage
            self.drawImage(mybarcode,20,20)
            canvas.Canvas.showPage(self)
        canvas.Canvas.save(self)

def main():
    import sys
    import urllib2
    from cStringIO import StringIO
    from reportlab.platypus import SimpleDocTemplate, Image, Paragraph, PageBreak
    from 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 value
    def get_image(url):
        u = urllib2.urlopen(url)
        return StringIO(u.read())

    styles = getSampleStyleSheet()
    styleN = ParagraphStyle(styles['Normal'])

    # build doc

    if 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()

Dom Dom

unread,
Mar 1, 2014, 1:02:09 PM3/1/14
to reportl...@googlegroups.com
Hello,

Auto-answer: 
I had to replace self.drawImage(mybarcode,20,20) with mybarcode.drawOn(self, 20, 20)
Additionally, Fookatchu gave me another advice (see there).
Defining a draw_barcode function:
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()
Bye and thanks anyway
Dom
Reply all
Reply to author
Forward
0 new messages