繁体   English   中英

在reportlab中,将尽可能多的空行添加到最后一页的长表中

[英]In reportlab add as many empty rows to a long table as fit on the last page

我正在准备一份关于项目列表的 PDF 报告,该报告本质上是一个长表,其中一些单元格填充了数据,而一些单元格为空。 该报告将被打印出来,用户将在纸上填写空白单元格。 她还将添加新行并填写新数据。

因此,我将提供一些(例如 3 个)空行作为网格来填充数据。 但如果页面上还有空间,我想用空行填充它。

如何在最后一页添加尽可能多的行?

不同的方法:
当使用每行一个单行表的段落时,这种行为可能更容易实现。 但是我需要在每一页上重复第一行(这在带有repeatRows=1的表中很容易)。

有任何想法吗?

我将不得不 go 检索我的一些代码,但我似乎记得必须通过测量当前 X / Y Position 来做事情,根据我使用的任何边距计算它,然后确定是否有更多信息适合或如果我需要一个新页面。 我的项目是对长文本块进行自动换行,这很相似,但不太相似。 我很快就会在这里更新一些代码。

def newline(self, options, text = ''):
  if getattr(self, 'lpp', None) == self.lines[self.pages]:
    self.newpage()

  if getattr(self, 'y', None) > self.h - self.bm * inch:
    self.newpage()

在这种情况下,我可能已经设置了 lpp(每页行数)的属性,所以我首先检查了该值是否存在,如果存在,我是否处于当前页面的行数。 如果对每页的总行数没有限制,那么我测试了我的 Y position 和下边距。 如有必要,请在页面中添加补丁。 这里有一些遗漏,但这是一个普遍的想法。

def newline(self, options, text = ''):
  if getattr(self, 'lpp', None) == self.lines[self.pages]:
    self.newpage()

  if getattr(self, 'y', None) > self.h - self.bm * inch:
    self.newpage()

  self.addLine()

  self.putText(self.x, self.h - self.y, text)

def putText(self, x, y, text):
  # If we actually place some text then we want to record that.
  if len(text.strip()) > 0 and not self.hasText[self.pages]:
    self.hasText[self.pages] = True
  # Something here to handle word wrap.
  if self.wrap:
    lines = self._breakScan(text)

    if len(lines) > 1:
      self.c.drawString(x, y, lines[0])

      self.newline('', ' '.join(lines[1:]))
    elif lines:
      self.c.drawString(x, y, lines[0])
  else:
    self.c.drawString(x, y, text)

在这里, self.c是我的 canvas。 我正在跟踪我在页面上放置了多少行,因为有时我们会重新包装可能包含分页符的文档,所有这些都在我们的自定义标记中。

根据该表格在文档中的结束位置,一个快速、hacky 的解决方案可能是在表格中粘贴足够多的行,以确保它填满页面并溢出到下一页。 然后,在构建文档后,剪掉最后一页并创建一个新的 PDF,只是缺少该页面。

当然,这仅在表格位于文档末尾时才有效(或者,如果您使用的是 ReportLab 的商业版本,则可以将 PDF 拼接在一起,在这种情况下没关系),而且有点像就像我说的那样丑陋,但它完成了工作..

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM