2

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

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

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

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

有任何想法吗?

4

2 回答 2

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()

在这种情况下,我可能已经设置了 lp​​p(每页行数)的属性,所以我首先检查该值是否存在,如果存在,我是否处于当前页面的行数。如果对每页的总行数没有限制,那么我测试了我的 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是我的画布。我正在跟踪我在页面上放置了多少行,因为有时我们会重新包装可能包含分页符的文档,所有这些都在我们的自定义标记中。

于 2011-06-09T20:12:35.817 回答
1

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

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

于 2011-06-10T12:28:32.333 回答