Reportlab - generowanie dokumentów

Opis pakietu Reportlab do generowania z poziomu Pythona plików PDF zawierających tekst, grafikę, wykresy i inne multimedia.

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()
Wykonanie tego skryptu utworzy "plik.pdf", który będzie wyglądał mniej więcej tak:
reportlab1
Teraz odnośnie kodu. Zaczynamy od określenia płótna (canvas), czyli rozmiaru strony i nazwy pliku. Następnie rejestrujemy czcionki jakich chcemy użyć (podane pliki ttf muszą być dostępne). W Reportlab elementy umieszczane (rysowane) są w miejscu X,Y określonym w pikselach lub innej skali (cale, centymetry itd.). W powyższym przykładzie "rysujemy" plik graficzny:
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()
Tabela przyjmuje serię danych w postaci listy złożonej z list zawierających dane dla każdego wiersza, oraz jako drugi argument - listę szerokości dla poszczególnej z nich. Wszystkie właściwości tabeli określa TableStyle (czcionka, obramowania, rozmieszczenie tekstu, łączenie komórek itd). Dla danego parametru formatującego podaje się dwie listy określające "komórkę od" i "komórkę do", które mają być objęte danym formatowaniem. Komórki numerowane są od 0,0, gdzie pierwsza liczba do numer wiersza, druga, numer kolumny. Ujemna numeracja, w tym przypadku -1,-1 oznacza ostatnią prawą komórkę (0,0 to pierwsza z lewej). Tak więc w podanym przykładzie formatowanie (0,0), (-1,-1) obejmie całą tabelę. Oto bardziej złożony przykład:
# 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))
reportlab2
blog comments powered by Disqus

Kategorie

Strony