【问题标题】:ReportLab: How to Center an Image on CanvasReportLab:如何在画布上居中放置图像
【发布时间】:2017-09-24 11:37:46
【问题描述】:

试图将图像居中。现在,我可以将图像相对于 x 轴居中,但我无法将实际图像居中在该点上。相反,它会在页面中心启动图像。

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。此徽标需要位于画布线的正上方并居中。请帮忙!

【问题讨论】:

    标签: python image canvas center reportlab


    【解决方案1】:

    这里有几个选项。如果您只是希望图像居中于您的线条上方,并且该线条的位置是固定的,您可以根据线条的位置绘制图像:

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

    【讨论】:

    • 我添加了代码/交换它,但它不起作用。请问您是否愿意编写我提供的完整代码并进行正确的编辑?
    • 您看到错误了吗?图片没有居中吗?
    • NameError: 全局名称 'line_width' 未定义 handle_pageBegin args=()
    • 啊,你是对的。它曾经被称为line_x_width。用line_width = 530 替换它应该可以解决这个问题
    • 太棒了,谢谢!现在,我很难让故事发挥作用。我认识python 3 天了。在工作中真的需要帮助,为客户完成这项工作。我们的第三方制作人失败了。你有没有机会帮助我让 myLaterPages 和 myThirdPages 流动起来?或者你有没有机会参加一个 uber 会议并教我 15 到 30 分钟?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-23
    • 2021-03-21
    • 2015-09-22
    • 2017-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多