2017-04-26 22 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에만 해당됩니다. 이 로고는 캔버스 선 바로 위에 있어야하고 중앙에 위치해야합니다. 도와주세요!

답변

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 + 어떤 버퍼에 이미지를 시작할 수 있으며,이 같은 일을 할 수 있도록, 경계 상자의 중앙에 이미지를 고정하는 옵션이있는 documentation for drawImage에, 또한 width = line_width - some_buffer*2

설정 :

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

코드를 추가/교환하고 작동하지 않습니다. 당신이 올바른 편집으로 준 전체 코드를 기꺼이 쓸 수 있다면 어떻겠습니까? –

+0

오류가 표시됩니까? 이미지가 중앙에 있지 않습니까? –

+0

필자가 쓴 글은 테스트했지만이 정확한 붙여 넣기는 테스트하지 않았습니다. https://pastebin.com/ieLF7MGz –