2013-12-24 1 views
1

Я использую Python 2.7.6 и Django 1.5.5. Как я могу написать строку в SimpleDocTemplate?Python с ReportLab. Как написать строку с SimpleDocTemplate?

Я tryng это:

@login_required 
def report(request): 
    rep = Report(request.user.username + "_cities.pdf") 

    # Title 
    rep.add_header("Cities") 

    line = Line(0, 100, 500, 100) 
    rep.add(line) 

    # Body 
    columns = ("City") 
    cities = [(p.name) for p in City.objects.all()] 

    table = Table([columns] + cities, style=GRID_STYLE) 
    table.hAlign = "LEFT" 
    table.setStyle([('BACKGROUND', (1, 1), (-2, -2), colors.lightgrey)]) 

    rep.add(table) 

    rep.build() 
    return rep.response 

Line() является from reportlab.graphics.shapes import Line. Класс Report является только класс-оболочка для SimpleDocTemplate:

class Report: 
    styles = None 
    response = None 
    document = None 
    elements = [] 

    def __init__(self, report_file_name): 
     self.styles = styles.getSampleStyleSheet() 
     self.styles.add(ParagraphStyle(name='Title2', 
             fontName="Helvetica", 
             fontSize=12, 
             leading=14, 
             spaceBefore=12, 
             spaceAfter=6, 
             alignment=TA_CENTER), 
         alias='title2') 

     self.response = HttpResponse(mimetype="application/pdf") 
     self.response["Content-Disposition"] = "attachment; filename=" + report_file_name 

     self.document = SimpleDocTemplate(self.response, topMargin=5, leftMargin=2, rightMargin=1, bottomMargin=1) 
     self.document.pagesize = portrait(A4) 

     return 

    def add_header(self, header_text): 
     p = Paragraph(header_text, self.styles['Title2']) 
     self.elements.append(p) 

    def add(self, paragraph): 
     self.elements.append(paragraph) 

    def build(self): 
     self.document.build(self.elements) 

Когда я вызываю функцию отчета, я получаю сообщение об ошибке:

Line instance has no attribute 'getKeepWithNext' 

курица я удалить/комментировать строки с Line(), ошибка не ocurre.

Вы можете мне помочь? Как написать эту строку?

ответ

2

Просто добавление Line к списку элементов не работает: вы можете пройти только Flowable s до SimpleDocTemplate.build(). Но вы можете обернуть его в Drawing, который является Flowable:

d = Drawing(100, 1) 
d.add(Line(0, 0, 100, 0)) 
rep.add(d) 
+0

Спасибо и очень много! –

Смежные вопросы