Drukowanie bezpośrednio do PDF
Andrzej Śliwa - 3 lutego 2010
W aplikacjach webowych format PDF ugruntował już swoją pozycję. W większości przypadków jest formatem w którym „drukowane” są zarówno faktury, jak i wszelkiej maści dokumenty informacyjne. W przypadku frameworka Ruby on Rails do tej pory korzystałem z biblioteki Prawn.
Niestety możliwości tej biblioteki są dość ubogie jeśli chodzi o tworzenie dokumentów mocno customizowanych, wymuszając wręcz rysowanie co bardziej skomplikowanych elementów wizualnych. W powiązaniu z wymaganiami klienta
powodowało to ciągłą, syzyfową pracę, by zapewnić poprawne wyświetlanie dokumentów gdzie treść oraz jej rozkład mógł się zmieniać.
Zrażony tymi problemami postanowiłem znaleźć rozwiązanie bazujące na htmlu jako formacie źródłowym dla PDF.
Skierowałem swoje pierwsze kroki w kierunku GitHuba i tam też znalazłem gotowe rozwiązanie moich problemów w postaci plugina.
Plugin nazywa się Wicket PDF i jest tak naprawdę prostym wrapperem dla programu uruchamianego z linii poleceń
wkhtmltopdf (bazujący na webkit).
Instalacja rozwiązania polega na zainstalowaniu wkhtmltopdf (ze źródeł, bądź z prekompilowanych binarek)
w przypadku mojego systemu operacyjnego(Mac OSX) wygląda to następująco:
$ wget http://wkhtmltopdf.googlecode.com/files/wkhtmltopdf-0.9.1-OS-X.i368
$ sudo mv wkhtmltopdf-0.9.1-OS-X.i368 /opt/local/bin/wkhtmltopdf
$ sudo chmod +x wkhtmltopdf
możemy oczywiście przetestować funkcjonowanie tego programu:
$ wkhtmltopdf www.google.pl google.pdf
lub
$ wkhtmltopdf file:///Users/andrzejsliwa/Desktop/test.html test.pdf
następnie instalujemy sam plugin:
$ script/plugin install git://github.com/mileszs/wicked_pdf.git
$ script/generate wicked_pdf
tak zainstalowany plugin można bez problemu wykorzystać w następujący sposób:
# GET /pages/1
# GET /pages/1.xml
def show
@page = Page.find(params[:id])
respond_to do |format|
format.html # show.html.erb
format.xml { render :xml => @page }
format.pdf do
render :Pdf => "#{@page.id}",
:template => 'pages/show.html.erb',
:wkhtmltopdf => '/opt/local/bin/wkhtmlopdf'
end
end
end
generowanie linków dla dokumentów pdf może wyglądać następująco:
<%= link_to "PDF", page_path(@page, :format => 'pdf'), :target => "_blank"%>
Lektura obowiązkowa:
http://github.com/mileszs/wicked_pdf
http://code.google.com/p/wkhtmltopdf/
http://andrzejsliwa.com/2010/02/03/drukowanie-pdf/
Andrzej Śliwa
Programista, pasjonat, scrum master, konsultant IT.
Pasjonuje się językami dynamicznymi, metodami wytwarzania oprogramowania oraz metodologiami prowadzenia projektów, szczególnie dbający o jakość wytwarzanych rozwiązań. Obecnie koncentruje się na rozwoju w zakresie wykorzystywania frameworka Ruby on Rails, skalowanych rozwiązań, cloud computingu i języków funkcyjnych.
Comments