Reportlab - generowanie dokumentów
3 September 2008
Comments
Reportlab to biblioteka-framework do generowania plików PDF posiadająca liczne możliwości. Za jej pomocą możemy tworzyć pliki PDF zawierające formatowany tekst, pliki graficzne, tabelki i inne elementy. Biblioteka posiada obszerną dokumentację w postaci pliku PDF. Poniżej przedstawię podstawowe elementy Reportlaba. Na stronie projektu można pobrać pakiety dla MS Windows, a w przypadku dystrybucji Linuksa odpowiedni pakiet powinien znajdować się w repozytorium.
Generowanie pliku PDF
Oto przykładowy kod generujący plik pdf z zawartością:# -*- coding: utf-8 -*-
from reportlab.platypus import Table, TableStyle, Paragraph
from reportlab.lib import colors
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
from reportlab.lib.styles import getSampleStyleSheet
c = canvas.Canvas('plik.pdf', pagesize=A4)
width, height = A4
# dodanie czcionek
pdfmetrics.registerFont(TTFont('Arial-Bold', 'arialbd.ttf'))
pdfmetrics.registerFont(TTFont('Arial', 'arial.ttf'))
pdfmetrics.registerFont(TTFont('Dejavu-Italic', 'DejaVuSerif-Italic.ttf'))
# umieszczanie grafiki
minus = 460
c.drawImage('pic.jpg', 40, (height-minus))
minus += 40
# prosty tekst
c.setFont("Arial", 14)
c.drawString(40,(height-minus), "Prosty tekst")
minus += 40
# paragraf
stylesheet=getSampleStyleSheet()
styleN = stylesheet['Normal']
styleN.fontSize = 17
styleN.fontName = 'Dejavu-Italic'
p = Paragraph(u'<para align="center">Tekst złożony <u>bardziej</u></para>', styleN)
w,h = p.wrap(width, height)
p.drawOn(c, 0, height-minus)
# zapis do pliku
c.showPage()
c.save()

drawImage(nazwa_pliku, margines lewy, (margines górny))
A także prosty nieformatowany tekst (drawString), oraz tekst formatowany (Paragraph). Wszystkie te elementy posiadają szereg opcji odpowiedzialnych za ich wygląd, a szczegóły znajdziemy w dokumentacji.Możemy także tworzyć tabele. Najprostszy przykład prezentuje poniższy kod:
# -*- coding: utf-8 -*-
from reportlab.platypus import Table, TableStyle, Paragraph
from reportlab.lib import colors
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
from reportlab.lib.styles import getSampleStyleSheet
c = canvas.Canvas('plik.pdf', pagesize=A4)
width, height = A4
# dodanie czcionek
pdfmetrics.registerFont(TTFont('Arial-Bold', 'arialbd.ttf'))
pdfmetrics.registerFont(TTFont('Arial', 'arial.ttf'))
pdfmetrics.registerFont(TTFont('Dejavu-Italic', 'DejaVuSerif-Italic.ttf'))
# tabelka
minus = 160
data = [['k00','k01'],['k10', 'k11']]
# Table(dane, [szerokość kolumn])
tt=Table(data, [150,150])
# wygląd tabeli
tt.setStyle(TableStyle([('FONT',(0,0),(-1,-1), 'Arial', 13),
('ALIGN', (0,0), (-1,-1), 'RIGHT'),
('GRID', (0,0), (-1,-1), 0.25, colors.black),
]))
w,h = tt.wrap(width, height)
tt.drawOn(c, 50, (height-minus))
# zapis do pliku
c.showPage()
c.save()
# tabelka
minus = 160
data = []
data.append(['Stworzenie PDF', '1', 'szt.', '333 zł', '13%', '313 zł'])
data.append(['Stworzenie PDF2', '1', 'szt.', '333 zł', '13%', '313 zł'])
data.append(['Wartość netto', '', '', '', '','555 zł'])
data.append(['Podatek VAT 22%', '', '', '', '','666 zł'])
data.append(['Wartość brutto', '', '', '', '', '999 zł'])
t=Table(data, [200, 30, 45, 70, 40, 135])
t.setStyle(TableStyle([('FONT', (0,0), (-1,-1), 'Arial', 9),
('ALIGN', (0,0), (-1,-1), 'CENTER'),
('GRID', (0,0), (-1,-1), 0.25, colors.black),
('FONT', (-1,-2), (-1,-2), 'Arial-Bold', 11),
('ALIGN', (0,-3), (0,-1), 'RIGHT'),
('SPAN', (0,-1), (-2,-1)),
('SPAN', (0,-2), (-2,-2)),
('SPAN', (0,-3), (-2,-3)),
]))
w,h = t.wrap(width, height)
t.drawOn(c, 50, (height-minus))

RkBlog
Comment article