Python 使用reportlab在一行中需要两个不同的对齐

Python 使用reportlab在一行中需要两个不同的对齐,python,reportlab,Python,Reportlab,我正在创建一个面向表的PDF,并在每个页面上重复第一行。我希望此行有一个居中的标题字符串,然后是一个右对齐的日期字符串(都在同一行上,以节省垂直空间)。我以为这会非常普遍,但我在任何地方都找不到这样的例子。在这个最简单的概念中,我使用了两个para标签,reportlab最后只使用最后一个对齐。然后,该标记字符串将在段落中使用,然后进入表格单元格。所以,我的问题是如何在reportlab的一行上实现这两种对齐方案?或者,我可以选择使用两个段落背靠背(与自定义样式) title_pdf=“{}{}

我正在创建一个面向表的PDF,并在每个页面上重复第一行。我希望此行有一个居中的标题字符串,然后是一个右对齐的日期字符串(都在同一行上,以节省垂直空间)。我以为这会非常普遍,但我在任何地方都找不到这样的例子。在这个最简单的概念中,我使用了两个para标签,reportlab最后只使用最后一个对齐。然后,该标记字符串将在段落中使用,然后进入表格单元格。所以,我的问题是如何在reportlab的一行上实现这两种对齐方案?或者,我可以选择使用两个段落背靠背(与自定义样式)

title_pdf=“{}{}”。格式(“页面标题”,“01/01/2021”)
行[0]=[段落(标题pdf,样式=样式[“正常”])]

如果您的表可以与页眉分离,我将使用页面模板类来解决它,该类包括一个名为
on page
(BaseDocTemplate)和
onFirstPage、
onLaterPages
(SimpleDocTemplate)的属性。《用户指南》3.5.36版第70页中提到了其中一些内容

要让它工作起来可能有点棘手,所以我在下面提供了一些代码

from reportlab.lib.units import cm
from reportlab.lib.pagesizes import A4, landscape
from reportlab.platypus import Table, TableStyle
from reportlab.platypus import SimpleDocTemplate
from reportlab.lib import colors

def func(canvas, doc):
    canvas.saveState()

    canvas.setFont("Helvetica", 12)
    (width, height) = landscape(A4)
    canvas.drawCentredString(width / 2.0, height - 1.2 * cm, "PAGE TITLE")
    canvas.drawRightString(width - 1 * cm, height - 1.2 * cm, "01/01/2021")

    canvas.restoreState()
    return func

def create_pdf():
    story = []
    data = [['Data1', 'Data2', 'Data3', 'Data4', 'Data5', 'Data6', 'Data7', 'Data8', 'Data9', 'Data10'],
            ['0.2', '-0.1', '0', '0', '-0.5', '0.6','0.2', '-0.1', '0', '0']]*200

    colwidths = (70)
    rowheights = (12)

    t = Table(data, colwidths, rowheights)

    GRID_STYLE = TableStyle(
        [('FONTSIZE', (0, 0), (-1, -1), 5),
         ('GRID', (0, 0), (-1, -1), 0.5, colors.black),
         ('ALIGN', (0, 0), (-1, -1), 'CENTER'),
         ('LEFTPADDING', (0, 0), (-1, -1), 0),
         ('RIGHTPADDING', (0, 0), (-1, -1), 0),
         ('TOPPADDING', (0, 0), (-1, -1), 0),
         ('BOTTOMPADDING', (0, 0), (-1, -1), 2),
         ('FONTNAME', (0, 0), (-1, -1), 'Helvetica'),
         ('SIZE', (0, 0), (-1, -1), 8),
         ('LEADING', (0, 0), (-1, -1), 8.2),
         ]
    )

    t.setStyle(GRID_STYLE)
    story.append(t)

    doc = SimpleDocTemplate('mydoc.pdf', pagesize=landscape(A4), topMargin=50)
    doc.build(story, onFirstPage=func, onLaterPages=func)

    # ----------------------------------------------------------------------
if __name__ == "__main__":
    create_pdf()  # Printing the pdf

如果您的表可以与页眉分离,我将使用页面模板类来解决它,该类包含一个名为
onPage
(BaseDocTemplate)和
onFirstPage、
onLaterPages
(SimpleDocTemplate)的属性。《用户指南》3.5.36版第70页中提到了其中一些内容

要让它工作起来可能有点棘手,所以我在下面提供了一些代码

from reportlab.lib.units import cm
from reportlab.lib.pagesizes import A4, landscape
from reportlab.platypus import Table, TableStyle
from reportlab.platypus import SimpleDocTemplate
from reportlab.lib import colors

def func(canvas, doc):
    canvas.saveState()

    canvas.setFont("Helvetica", 12)
    (width, height) = landscape(A4)
    canvas.drawCentredString(width / 2.0, height - 1.2 * cm, "PAGE TITLE")
    canvas.drawRightString(width - 1 * cm, height - 1.2 * cm, "01/01/2021")

    canvas.restoreState()
    return func

def create_pdf():
    story = []
    data = [['Data1', 'Data2', 'Data3', 'Data4', 'Data5', 'Data6', 'Data7', 'Data8', 'Data9', 'Data10'],
            ['0.2', '-0.1', '0', '0', '-0.5', '0.6','0.2', '-0.1', '0', '0']]*200

    colwidths = (70)
    rowheights = (12)

    t = Table(data, colwidths, rowheights)

    GRID_STYLE = TableStyle(
        [('FONTSIZE', (0, 0), (-1, -1), 5),
         ('GRID', (0, 0), (-1, -1), 0.5, colors.black),
         ('ALIGN', (0, 0), (-1, -1), 'CENTER'),
         ('LEFTPADDING', (0, 0), (-1, -1), 0),
         ('RIGHTPADDING', (0, 0), (-1, -1), 0),
         ('TOPPADDING', (0, 0), (-1, -1), 0),
         ('BOTTOMPADDING', (0, 0), (-1, -1), 2),
         ('FONTNAME', (0, 0), (-1, -1), 'Helvetica'),
         ('SIZE', (0, 0), (-1, -1), 8),
         ('LEADING', (0, 0), (-1, -1), 8.2),
         ]
    )

    t.setStyle(GRID_STYLE)
    story.append(t)

    doc = SimpleDocTemplate('mydoc.pdf', pagesize=landscape(A4), topMargin=50)
    doc.build(story, onFirstPage=func, onLaterPages=func)

    # ----------------------------------------------------------------------
if __name__ == "__main__":
    create_pdf()  # Printing the pdf

您可以尝试使用三列表,并让第一列为空。使用
TableStyle
设置样式:

from reportlab.platypus import Table, TableStyle
from reportlab.platypus.paragraph import Paragraph

title = "PAGE TITLE"
date = "01/01/2021"

table = Table([("", Paragraph(f"{title}"), Paragraph(f"{date}"))])
style = TableStyle([("ALIGN", (1, 0), (1, 0), "CENTER"),  # Select second table col
                    ("ALIGN", (-1, -1), (-1, -1), "RIGHT")])  # Select last table col

table.setStyle(style)

您可以尝试使用三列表,并让第一列为空。使用
TableStyle
设置样式:

from reportlab.platypus import Table, TableStyle
from reportlab.platypus.paragraph import Paragraph

title = "PAGE TITLE"
date = "01/01/2021"

table = Table([("", Paragraph(f"{title}"), Paragraph(f"{date}"))])
style = TableStyle([("ALIGN", (1, 0), (1, 0), "CENTER"),  # Select second table col
                    ("ALIGN", (-1, -1), (-1, -1), "RIGHT")])  # Select last table col

table.setStyle(style)

我运行了你的代码,它不太符合要求,但希望你能修复。例如,我要找的是一个居中的“页面标题”,右边是右对齐的日期字符串——都在一行上。当然,它可以像您所做的那样位于页眉中。你能改变它吗?看看修改后的版本,那会更合适吗?我运行了你的代码,它不太适合这个法案,但希望你能修复。例如,我要找的是一个居中的“页面标题”,右边是右对齐的日期字符串——都在一行上。当然,它可以像您所做的那样位于页眉中。你能摆动它吗?看看修改过的版本,那会更合适吗?