ReportLab:如何将图像居中 Canvas
ReportLab: How to Center an Image on Canvas
正在尝试使图像居中。现在,我可以将图像关于 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。此徽标需要位于画布线的正上方并居中。请帮忙!
这里有几个选项。如果你只是想让图像在你的线上方居中,并且那条线的位置是固定的,你可以根据线的位置绘制图像:
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')
正在尝试使图像居中。现在,我可以将图像关于 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。此徽标需要位于画布线的正上方并居中。请帮忙!
这里有几个选项。如果你只是想让图像在你的线上方居中,并且那条线的位置是固定的,你可以根据线的位置绘制图像:
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')