2017-04-26 570 views
0

试图在此处居中放置图像。现在,我可以将图像关于x轴居中,但我无法将实际图像居中。相反,它会在页面中心启动图像。ReportLab:如何在画布上居中放置图像

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

因此,在一天结束时,我需要确保我的图像以x轴为中心。特别是PartnerLogo。此徽标需要位于canvased线上并居中。请帮忙!

回答

2

这里有几个选项。如果你只是想你上面的线为中心的形象,这条线的位置是固定的,你可以根据线的位置绘制图像:

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') 

如果你想徽标比全宽度行的,你可以在line_x_start +一定的缓冲启动映像,并设置width = line_width - some_buffer*2

此外,在documentation for drawImage有锚的边界框的中心形象的选项,所以你可以做这样的事情:

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

我添加了代码/交换它,它不起作用。你有什么机会愿意写出我给你的正确编辑的完整代码吗? –

+0

您是否看到错误?图像是否居中? –

+0

我测试了我写的东西,但不是这个确切的粘贴:https://pastebin.com/ieLF7MGz –