【问题标题】:Python Reportlab PDF - Centering Text on pagePython Reportlab PDF - 在页面上居中文本
【发布时间】:2011-04-14 22:14:08
【问题描述】:

我正在使用ReportLab用python动态生成pdf。

我希望将一行文本放在页面的中心。这是我目前拥有的具体代码,但不知道如何将文本水平居中。

header = p.beginText(190, 740)
header.textOut("Title of Page Here")

# I know i can use TextLine etc in place of textOut

p.drawText(header)

文本显示,我可以手动移动左侧位置,使文本看起来居中,但我需要以编程方式将其居中,因为文本将是动态的,我不知道会有多少文本。

【问题讨论】:

    标签: python pdf-generation reportlab


    【解决方案1】:

    reportlab 画布有一个drawCentredString 方法。是的,他们就是这样拼写的。

    我们是英国人,该死的,并为之自豪 我们的拼写!

    编辑: 至于文本对象,恐怕你不知道。不过,您可以按照这些思路做一些事情:

    from reportlab.pdfbase.pdfmetrics import stringWidth
    from reportlab.rl_config import defaultPageSize
    
    PAGE_WIDTH  = defaultPageSize[0]
    PAGE_HEIGHT = defaultPageSize[1]
    
    text = "foobar foobar foobar"
    text_width = stringWidth(text)
    y = 1050 # wherever you want your text to appear
    pdf_text_object = canvas.beginText((PAGE_WIDTH - text_width) / 2.0, y)
    pdf_text_object.textOut(text) # or: pdf_text_object.textLine(text) etc.
    

    显然,您可以使用其他页面大小。

    【讨论】:

    • 感谢 Jim,我使用了 p.drawCentredString(4.25*inch, 500, 'some text') 效果很好,但是如何将 drawCentredString 与 .textOut 或 .textLine 一起使用? p.drawCentredString(center, 500, header);
    【解决方案2】:

    我也正好需要这个,然后写了这个:

    def createTextObject(canv, x, y, text, style, centered=False):
        font = (style.fontName, style.fontSize, style.leading)
        lines = text.split("\n")
        offsets = []
        if centered:
            maxwidth = 0
            for line in lines:
                offsets.append(canv.stringWidth(line, *font[:2]))
            maxwidth = max(*offsets)
            offsets = [(maxwidth - i)/2 for i in offsets]
        else:
            offsets = [0] * len(lines)
        tx = canv.beginText(x, y)
        tx.setFont(*font)
        for offset, line in zip(offsets, lines):
            tx.setXPos(offset)
            tx.textLine(line)
            tx.setXPos(-offset)
        return tx
    

    【讨论】:

    • +1 用于使用 canvas.beginText :) 较旧的答案,但效果很好!然后您确实需要绘制返回到画布的tx。喜欢my_canvas.drawText(createTextObject(my_canvas, x, y, text, style, centered))
    【解决方案3】:

    您可以使用像Paragraph 这样的Flowable 对象并将alignment 值分配给1:

    styles = getSampleStyleSheet()
    title_style = styles['Heading1']
    title_style.alignment = 1
    title = Paragraph("Hello Reportlab", title_style)
    story.append(title)
    

    这个例子将创建一个文本居中的 pdf 文档:

    from flask import make_response
    import io
    from reportlab.platypus import SimpleDocTemplate, Paragraph
    from reportlab.lib.styles import getSampleStyleSheet
    
    story=[]
    pdf_doc = io.BytesIO()
    doc = SimpleDocTemplate(pdf_doc)
    
    styles = getSampleStyleSheet()
    title_style = styles['Heading1']
    title_style.alignment = 1
    title = Paragraph("Hello Reportlab", title_style)
    story.append(title)
    doc.build(story)
    
    content = pdf_doc.getvalue()
    
    #output to browser
    response = make_response(content)
    response.mimetype = 'application/pdf'
    return response
    

    如果想让文字向左浮动,需要将alignment改为0:

    title_style.alignment = 0
    

    如果想让文字向右浮动,需要将alignment改为2:

    title_style.alignment = 2
    

    【讨论】:

      【解决方案4】:

      试试:

      <para alignment="center">
      

      根据参考:http://two.pairlist.net/pipermail/reportlab-users/2006-June/005092.html

      在你的情况下:

      header.textOut("<"para alignment='center'>"Title of Page Here")
      

      【讨论】:

      • 请将解决方案复制到您的答案中。外部参考作为补充说明很好。
      猜你喜欢
      • 1970-01-01
      • 2011-02-12
      • 1970-01-01
      • 2020-12-05
      • 1970-01-01
      • 2011-03-27
      • 1970-01-01
      • 1970-01-01
      • 2016-05-31
      相关资源
      最近更新 更多