python - 需要使用reportlab在一行中进行两个不同的对齐
问题描述
我正在创建一个面向表格的 PDF,并为每一页重复第一行。我希望这一行有一个居中的标题字符串,然后是一个与日期右对齐的字符串(都在同一行,以节省垂直空间)。我认为这会非常普遍,但我在任何地方都找不到这样的例子。在最简单的概念中,我背靠背使用了两个 para 标签,reportlab 最终只使用最后给出的对齐方式。然后,此标签字符串将在段落中使用,然后进入表格单元格。所以,我的问题是如何在reportlab 的一行中实现这两种对齐方案?或者,我可以交替使用两个段落背靠背(使用自定义样式)吗?
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"])]
解决方案
如果您的表格可以与页眉分开,我会使用包含称为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
推荐阅读
- nginx - 构建时的 gzip 压缩或运行时使用 nginx 的 gzip 压缩?
- c# - 将 DateTimeOffset 作为路由属性传递
- spring - 使用 Spring Boot 对 MongoDB 进行类型映射
- c# - 为什么 Moq.SetupGet 抛出 NotSuportedException
- android - Delphi RIO Android 应用程序界面冻结
- r - geom_dotplot:更改形状以及如何在点图上放置一条线?
- protractor - 我们如何在量角器中单击特定文本的父元素
- regex - 如何修复这个正则表达式
- api - http.dart HttpException:在收到完整标头之前连接已关闭
- laravel - Laravel 路由组和前缀