2011-05-06 2 views
17

나는 동적 데이터에서 PDF 보고서를 자동으로 생성하기 위해 reportlab을 사용하고 있습니다. 콘텐츠가 너무 커서 세로로 표시 할 수 없기 때문에 큰 콘텐츠를보기 위해 가로로 전환하려고합니다. 내 보고서 생성 작동 방법은 다음과 같습니다Reportlab : 세로와 가로 사이를 전환하는 방법?

은 다음과 같습니다

주요 기능 :

doc = DocTemplate(...)   //Doctemplate is a customed BaseDocTemplate class 
array = [] 
some_data= "Here is some data displayed in portrait" 

array.append(Paragraph(some_data)) 

large_data = "this data is too large to be displayed in portrait" 
array.append(Paragraph(large_data)) 

... // Some more data is added after this 

doc.build(array, canvasmaker=NumberedCanvas) 

은 내가 무엇을 찾고 있어요 것은 내가 돈으로, 각 단계에서 세로에서 가로로 전환 할 수있는 방법입니다 그것을 표시하는 데 필요한 페이지 수를 알지 못합니다. 필자는 여전히 reportlab에 익숙하지 않고 파이썬에 대해서도 약간의 지식이 있으므로 최종적으로 전체 문서를 작성할 때 reportlab (PageTemplates, flowables)이 제공하는 솔루션을 올바르게 사용할 수있는 방법을 알지 못합니다.

class DocTemplate(BaseDocTemplate,): 
def __init__(self, filename, **kw): 
    apply(BaseDocTemplate.__init__, (self, filename), kw) 
    f = Frame(2.6*cm, 2.8*cm, 16*cm, 22.7*cm, id='f') 
    pt = PageTemplate('RectPage', [f], onPage=beforeDrawPage, onPageEnd=afterDrawPage) 
    //beforeDrawPage and afterDrawPage fill the headers of the page (that also need to be in landscape) 
    self.addPageTemplates(pt) 

가 나는 다른 페이지 템플릿 또는 프레임을 추가해야 생각하지만, 난 내가 데이터 중 다른 하나에서 전환 할 수 표시되지 않습니다 :

여기 내 다른 유용한 클래스는이 경우에 있습니다 단계 추가.

class NumberedCanvas(canvas.Canvas): 
def __init__(self, *args, **kwargs): 
    canvas.Canvas.__init__(self, *args, **kwargs) 

    self._saved_page_states = [] 

def showPage(self): 
    self._saved_page_states.append(dict(self.__dict__)) 
    self._startPage() 

def save(self): 
    """add page info to each page (page x of y)""" 
    num_pages = len(self._saved_page_states) 
    for state in self._saved_page_states: 
     self.__dict__.update(state) 
     self.draw_page_number(num_pages) 
     canvas.Canvas.showPage(self) 
    self.setTitle("Title") 
    canvas.Canvas.save(self) 
    self._doc.SaveToFile(self._filename, self) 

def draw_page_number(self, page_count): 
    self.setFont("Helvetica", 11) 
    self.drawRightString(18.5*cm, 26.8*cm, 
     "PAGE %d/%d" % (self._pageNumber, page_count)) 

나는 분명히하기를 잊어 버렸으면 좋겠다.

미리 감사드립니다.

답변

13

을 단순히 reportlab.platypus 패키지에서 NextPageTemplate 사용 후 풍경 설정 및 내 DocTemplate에 PageTemplate :

array.append(NextPageTemplate('landscape'))

다시 초상화를 얻으려면, 내가 사용

array.append(NextPageTemplate('portrait'))

이 꽤 좋은 유연성을 할 수 있습니다.

+1

'array'는'story'입니다. – TNT

6

내가 가로 모드와 세로 모드 사이를 전환하는 방법이 있습니다,하지만 난 사전에 어떤 방향을 결정합니다

내가 새로운 추가 : 나는 마침내 나 자신에 의해 그것을 할 수있는 최선의 방법을 알아 냈

from reportlab.lib.pagesizes import letter, A4 

lWidth, lHeight = letter 

if orientation == 'landscape': 
    canvas.setPageSize((lHeight, lWidth)) 
else: 
    canvas.setPageSize((lWidth, lHeight)) 
29

이미 페이지 크기 모듈에있는 가로 및 세로 기능을 사용하십시오.

from reportlab.lib.pagesizes import letter, landscape 
c = canvas.Canvas(file, pagesize=landscape(letter))