2011-06-09 174 views
2

我正在准备一个项目列表的PDF报告,基本上是一个长表,其中一些单元格填充数据和一些单元格为空。这份报告将被打印出来,用户将在纸上填写空单元格。她还将添加新行并填写新数据。在reportlab中添加尽可能多的空行作为适合最后一页的长表

所以我会提供一些(如3个)空行作为网格来填充数据。但是,如果页面上仍有空间,我想用空行填充它。

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

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

任何想法?

回答

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

+0

我想我明白了。换行是段落的一种方法吗?它什么时候被叫? – jammon 2011-06-10 14:29:36

+0

@jammon - 对不起,我可以更详细地解释我的方法。在这个例子中,Self是一个自定义类。它将各种命令从自定义标记语法映射到reportlab中相应的api调用。他们的库中可能没有'newline()'方法。我会添加一些额外的代码来进一步演示。 – 2011-06-10 16:50:48

+0

的确非常感谢。我会尽力把我的大脑包裹起来。 Reportlab对初学者非常有用,但肯定有一些边缘和任务,解决方案很不明显。 – jammon 2011-06-11 14:44:49

0

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

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