2011-05-06 29 views
17

Dinamik verilerden otomatik olarak bir pdf raporu oluşturmak için reportlab kullanıyorum. İçerik bazen portre olarak görüntülenemeyecek kadar büyük olduğundan, büyük içerik için manzaraya geçmeye çalışıyorum. Benim rapor oluşturma şu şekilde çalışırReportlab: Portre ve manzara arasında nasıl geçiş yapılır?

geçerli:

Ana işlevi:

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) 

Ne arıyorum ben yok gibi her adımda dikey konumdan yatay konuma geçiş yapabilmek için bir yoldur Görüntülemek için ihtiyaç duyulacak sayfa sayısını bilmiyorum. Ben hala raporlab için yeni ve python ile biraz, bu yüzden ben sonuna kadar tüm belgeyi oluştururken rapor raporları (PageTemplates, akışkanlar) tarafından sağlanan çözümleri nasıl kullanabileceğimi görmüyorum.

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) 

ben başka bir sayfa şablonu veya çerçeve eklemek zorundadır düşünüyorum, ama ben verilerine sırasında birinden diğerine geçiş yapabilirsiniz nasıl görmüyorum:

İşte benim diğer yararlı sınıfları bu durumda içindir ekleme aşaması.

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

Umarım açık bir şey unutmazdım.

Şimdiden çok teşekkürler.

cevap

13

basitçe reportlab.platypus paketinden NextPageTemplate kullanılan sonra peyzaj ayarları ve benim DocTemplate içinde PageTemplate:

array.append(NextPageTemplate('landscape'))

geri portrede almak için i kullanın:

array.append(NextPageTemplate('portrait'))

Bu oldukça güzel esneklik sağlar.

+1

'array'' story' – TNT

6

Ben dikey ve yatay modlar arasında geçiş nasıl budur, ama önceden hangi yönünü belirler:

Yeni ekledi: Sonunda başıma bunu yapmak için en iyi yolu bulmaya

from reportlab.lib.pagesizes import letter, A4 

lWidth, lHeight = letter 

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

Zaten sayfalar modülünde bulunan manzara ve portre işlevlerini kullanın.

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