使用 reportlab 在一行中需要两个不同的对齐方式
Need two different aligns in one line using reportlab
我正在创建面向 table 的 PDF,并且每一页的第一行都重复。我希望这一行有一个居中的标题字符串,然后是一个带有日期的 right-aligned 字符串(都在同一行,以保存垂直 space)。我认为这会非常普遍,但我在任何地方都找不到这样的例子。我在这个最简单的概念中背靠背使用了两个 para 标签,而 reportlab 最终只使用了最后一个给出的对齐方式。然后,此标记字符串将用于段落,然后段落进入 table 单元格。所以,我的问题是如何在 reportlab 的一行中实现这两个对齐场景?或者,我可以交替使用两个段落 back-to-back(带有自定义样式)吗?
title_pdf = "<para align=center fontSize=14>{}</para><para align=right fontSize=11>{}</para>".format("PAGE TITLE","01/01/2021")
row_ary[0] = [Paragraph(title_pdf,style=styles["Normal"])]
如果您的 table 可以与页眉分开,我会使用包含名为 onPage
的 属性 的页面模板 class 来解决此问题( 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
您可以尝试使用三列 table 并让第一列为空。使用 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)
我正在创建面向 table 的 PDF,并且每一页的第一行都重复。我希望这一行有一个居中的标题字符串,然后是一个带有日期的 right-aligned 字符串(都在同一行,以保存垂直 space)。我认为这会非常普遍,但我在任何地方都找不到这样的例子。我在这个最简单的概念中背靠背使用了两个 para 标签,而 reportlab 最终只使用了最后一个给出的对齐方式。然后,此标记字符串将用于段落,然后段落进入 table 单元格。所以,我的问题是如何在 reportlab 的一行中实现这两个对齐场景?或者,我可以交替使用两个段落 back-to-back(带有自定义样式)吗?
title_pdf = "<para align=center fontSize=14>{}</para><para align=right fontSize=11>{}</para>".format("PAGE TITLE","01/01/2021")
row_ary[0] = [Paragraph(title_pdf,style=styles["Normal"])]
如果您的 table 可以与页眉分开,我会使用包含名为 onPage
的 属性 的页面模板 class 来解决此问题( BaseDocTemplate) 和 onFirstPage,
和 onLaterPages
(SimpleDocTemplate)。其中一些在用户指南版本 3.5.36
让它工作可能有点棘手,所以我在下面添加了一些代码作为开始。
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
您可以尝试使用三列 table 并让第一列为空。使用 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)