pythoncsvreportlab

Canvas instance has no attribute 'drawCenteredString'


I am receiving an error somewhere in the following code. I have triple checked my file paths and I believe they are correct. I am following a quite dated tutorial, so I double checked the docs and it seems correct.

Code:

# Import data cleaning packages.
import csv

# Import pdf filling packages.
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letter
from reportlab.lib.pagesizes import landscape
from reportlab.platypus import Image

data_file = '/Users/josephnardone/Desktop/python/data.csv'


def import_data(data_file):
    attendee_data = csv.reader(open(data_file,'rb'))
    for row in attendee_data:
        last_name = row[0]
        first_name = row[1]
        pdf_file_name = last_name + '_' + first_name + '.pdf'
        generate_certificate(first_name, last_name, pdf_file_name)

def generate_certificate(first_name, last_name, pdf_file_name):
    attendee_name = first_name + ' ' + last_name
    c = canvas.Canvas(pdf_file_name, pagesize = landscape(letter))

    # PDF Header Text
    c.setFont('Helvetica', 30, leading = None)
    c.drawCenteredString(415, 500, 'Invitation to My Party')

    c.setFont('Helvetica',15, leading = None)
    c.drawCenteredString(415, 450, attendee_name)

    c.showPage()

    c.save()

import_data(data_file)

Error:

Traceback (most recent call last):
  File "/Users/josephnardone/Desktop/python/pdf_gen.py", line 36, in <module>
    import_data(data_file)
  File "/Users/josephnardone/Desktop/python/pdf_gen.py", line 19, in import_data
    generate_certificate(first_name, last_name, pdf_file_name)
  File "/Users/josephnardone/Desktop/python/pdf_gen.py", line 27, in generate_certificate
    c.drawCenteredString(415, 500, 'Invitation to My Party')
AttributeError: Canvas instance has no attribute 'drawCenteredString'
[Finished in 0.2s]

Solution

  • Error in tutorial found. Problem solved, double def of generate_certificate, see solution below:

    def import_data(data_file):
        attendee_data = csv.reader(open(data_file,'rb'))
        for row in attendee_data:
            last_name = row[0]
            first_name = row[1]
            pdf_file_name = last_name + '_' + first_name + '.pdf'
    
    def generate_certificate(first_name, last_name, pdf_file_name):
        attendee_name = first_name + ' ' + last_name
        c = canvas.Canvas(pdf_file_name, pagesize = landscape(letter))