Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ReportLab: How to Center an Image on Canvas

trying to center an image here. Now, I am able to center the image with regards to the x axis, but I am unable to center the actual image on that point. Instead, it starts the image at the center of the page.

from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.pagesizes import letter
from reportlab.lib.units import inch
from reportlab.lib.units import mm
from reportlab.platypus import Image
from reportlab.lib.enums import TA_JUSTIFY
from reportlab.lib.utils import ImageReader
from reportlab.pdfgen import canvas

Width, Height = letter
styles = getSampleStyleSheet()
Title = "Comparison Index"
pageinfo = "platypus example"
BTRLogo = 'BTALogo.png'
PartnerLogo = 'PartnerLogo.png'
ClientLogo = 'ClientLogo.png'
Graph1 = 'PlanOffered.jpg'



# Define the fixed features of the first page of the document
def myFirstPage(canvas, doc):
    canvas.saveState()

    canvas.setFillColorCMYK(0.68, 0.44, 0, 0.41)
    canvas.setFontSize(22)
    canvas.setFont('Helvetica-Bold', 36)
    canvas.drawString(40, 670, 'Health & Welfare')

    canvas.setFont('Helvetica-Bold', 24)
    canvas.drawString(40, 625, 'Benchmark Comparison Report')

    canvas.setFont('Helvetica', 16)
    canvas.drawString(40, 550, 'Prepared for:')
    canvas.drawString(40, 400, 'Prepared on:') #INSERY DYNAMIC DATE****

    canvas.drawImage(BTRLogo,480,18,width=100,height=66.62,mask='auto') 
    #Logo is measured and good to go

    canvas.drawImage(PartnerLogo, 10, Height/5, width=Width/1.2, 
    preserveAspectRatio=True, mask='auto') #MAKE SURE IMAGE IS DYNAMIC AND HAS MAX SETS

    canvas.setStrokeColorCMYK(0.68,0.44,0,0.41)
    canvas.setLineWidth(7)
    canvas.line(40,112,570,112)



# Since we want pages after the first to look different from the first we define an alternate layout for
# the fixed features of the other pages.
# Note that the two functions use the pdfgen level canvas operations to paint the annotations for the pages.
def myLaterPages(canvas, doc):
    canvas.saveState()
    canvas.setFont('Times-Roman', 23)
    page_num = canvas.getPageNumber()
    text = "Page #%s" % page_num
    canvas.drawRightString(200 * mm, 20 * mm, text)
    canvas.restoreState()

def myThirdPages(canvas, doc):
    canvas.saveState()
    canvas.setFont('Times-Roman', 9)
    canvas.drawString(inch, 0.75 * inch, "Page %d %s")
    canvas.restoreState()

# Create a story and build the document
def createMultiPage():

    doc = SimpleDocTemplate("Comparison Index.pdf", pagesize=letter, rightMargin=72, leftMargin=72, topMargin=72, bottomMargin=18)
    style = styles["Normal"]
    styles.add(ParagraphStyle(name='Justify', alignment=TA_JUSTIFY))

    Story = [Spacer(1, 2 * inch)]

    doc.build(Story, onFirstPage=myFirstPage, onLaterPages=myLaterPages)

if __name__ == "__main__":
    createMultiPage()

So, at the end of the day I need to ensure that my image is centered on the x-axis. Specifically the PartnerLogo only. This Logo needs to be right above the canvased line and centered. Please help!

like image 239
Julian Olivares Avatar asked Oct 20 '25 04:10

Julian Olivares


1 Answers

You have a couple of options here. If you simply want the image centered above your line, and the position of that line is fixed, you can draw the image based on the location of the line:

line_x_start = 40
line_width = 530
line_y = 112

canvas.setStrokeColorCMYK(0.68,0.44,0,0.41)
canvas.setLineWidth(7)
canvas.line(line_x_start, line_y,
            line_x_start+line_width, line_y)

canvas.drawImage(PartnerLogo, line_x_start, line_y, width=line_width, 
                 preserveAspectRatio=True, mask='auto') 

If you want the logo smaller than the full width of the line, you could start the image at line_x_start + some buffer, and set width = line_width - some_buffer*2

Additionally, in the documentation for drawImage there is an option to anchor the image in the center of a bounding box, so you could do something like this:

canvas.drawImage(PartnerLogo, line_x_start, line_y, width=line_width, 
                 preserveAspectRatio=True, mask='auto', anchor='c') 
like image 150
Kyle Heuton Avatar answered Oct 21 '25 16:10

Kyle Heuton