2016-05-03 77 views
0

我正在嘗試爲ReportLab編寫一個Flowable,它需要能夠拆分。根據我對文檔的理解,我需要定義一個函數split(self, aW, aH),它將流動分開。然而,我得到了我無法解決的以下錯誤。拆分ReportLab流程

一個簡單的可流動:

class MPGrid (Flowable): 
def __init__(self, height=1*cm, width=None): 
    self.height = height 
    self.width = None 

def wrap(self, aW, aH): 
    self.width = aW 
    return (aW, self.height) 

def split(self, aW, aH): 
    if aH >= self.height: 
     return [self] 
    else: 
     return [MPGrid(aH, aW), MPGrid(self.height - aH, None)] 

def draw(self): 
    if not self.width: 
     from reportlab.platypus.doctemplate import LayoutError 
     raise LayoutError('No Width Defined') 

    c = self.canv 
    c.saveState() 
    c.rect(0, 0, self.width, self.height) 
    c.restoreState() 

當一個文檔中使用,並要求分割,產生以下錯誤:

reportlab.platypus.doctemplate.LayoutError: Splitting error(n==2) on page 4 in 
<MPGrid at 0x102051c68 frame=col1>... 
S[0]=<MPGrid at 0x102043ef0 frame=col1>... 

這種流動應該是一個固定的高度,如果實在是太大了對於可用高度,將其分割爲消耗高度,然後在下一幀中提醒固定高度。

我在做什麼錯誤導致這個不太有用的錯誤?

回答

0

隨着相當多的測試,我遇到了這個問題的答案。如果有人有解決方案,我仍然樂於接受更好的解決方案

這是發生,因爲分被調用了兩次,第二次時,可用高度爲零(或接近於零),並嘗試創建一個具有(近)零高度流動性。解決的辦法是檢查這種情況,不能在這種情況下拆分。

下面的修改後的代碼還有一些其他的小改動,以使代碼更「完整」。

class MPGrid (Flowable): 
def __init__(self, height=None, width=None): 
    self.height = height 
    self.width = width 

def wrap(self, aW, aH): 
    if not self.width: self.width = aW 
    if not self.height: self.height = aH 

    return (self.width, self.height) 

def split(self, aW, aH): 
    if aH >= self.height: 
     return [self] 
    else: 
     # if not aH == 0.0: (https://www.python.org/dev/peps/pep-0485) 
     if not abs(aH - 0.0) <= max(1e-09 * max(abs(aH), abs(0.0)), 0.0): 
      return [MPGrid(aH), MPGrid(self.height - aH, None)] 
     else: 
      return [] # Flowable Not Splittable 

def draw(self): 
    if not self.width or not self.height: 
     from reportlab.platypus.doctemplate import LayoutError 
     raise LayoutError('Invalid Dimensions') 

    c = self.canv 
    c.saveState() 
    c.rect(0, 0, self.width, self.height) 
    c.restoreState()