2011-06-09 52 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拼接在一起,在這種情況下,這無關緊要),這就像我說的那樣醜陋,但它完成了工作..

相關問題