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

时间:2011-06-09 18:07:31

标签: python reportlab

我正在准备一份包含项目列表的PDF报告,这些项目基本上是一个长表,其中一些单元格填充数据,一些单元格为空。此报告将打印出来,用户将在纸上填充空单元格。她还将添加新行并填写新数据。

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

如何在最后一页添加适合的行数?

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

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

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

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位置是什么以及底部边距是多少。如有必要,请在页面中进行修补。这里有一些遗漏,但这是一个普遍的想法。

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是我的画布。我正在跟踪我在页面上放了多少行,因为有时候我们正在重新包装可能包含分页符的文档,所有这些都在我们的自定义标记中。

答案 1 :(得分:0)

根据此表在文档中的结束位置,快速,hacky解决方案可能只是在表中粘贴足够的行以确保它填充页面并溢出到下一页。然后,在构建文档之后,切断最后一页并创建一个刚丢失该页面的新PDF。

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