Generowanie PDF z Grails PDF Plugin + polskie znaki

Wczoraj rozwijałem mój projekt na programowanie w środowisku sieciowym. Projekt tworzę w świetnym frameworku -  Grails, w dynamicznym języku programowania na JVM – Groovy. Jednym z zadań projektu jest tworzenie list osób w formacie PDF, czyli tego samego co wyświetlamy na ekranie.

W pierwszej chwili pomyślałem o użyciu JasperReports, ale wpisanie w google frazy “grails pdf” skierowało mnie na stronę pluginu PDF do grailsów. Genialne! Po co robić coś jeszcze raz, lepiej wykorzystać strony GSP i na ich podstawie wyrenderować dokument, dostosowując go tylko w CSS – odpowiednie style można przecież stworzyć dla wskazując w CSS, że mamy wykorzystać ten styl przy wydruku: media=”print” zamiast media=”screen”.

Po wpisaniu w konsoli grails install-plugin pdf i usiadłem i myślałem, że wszystko pójdzie dobrze. Pojawił się błąd – nie mogło skopiować plików. Wszystko przez to, że skrypt instalacyjny jest źle napisany – w pliku KATALOG_DOMOWY/.grails/1.1.1/plugins/grails-pdf-0.4 musiałem zmnienić /script/_Install.groovy tak, żeby kopiowanie plików odbywało się ze ścieżki “${pluginBasedir}/grails-app/views/pdf” (dodałem te pdf na końcu).

Jeszcze chwila czekania i miałem już wszystko zainstalowane, dodałem na stronie odpowiedni link <g:pdfLink url=”/members/list” /> i.. nic nie działało :) . Po pierwsze okazało się że miałem jeden tag niedomknięty, przez co nie generowałem poprawnego XHTML’a i po prostu dokument nie mógł być przetworzony. Co jednak ciekawsze, sam pdfLink generował mi znak “&” zamiast odpowiedniej encji i to też sprawiało problemy, przez co użyłem linka poprzez zwyczajny “href” (na stronie demo plugina jest to dopisane dokładniej). Nieco zirytowany obejrzałem pierwszy dokument i.. nie posiadał on polskich znaków :) .

Najciekawsze jest to, że w tej sytuacji prostego rozwiązania nie ma, a przynajmniej ja go nie znalazłem. Rozwiązanie trudniejsze to modyfikacja pluginu tak, żeby dodać do niego polskie fonty :) .

Po pierwsze potrzebujemy odpowiednich fontów. Ja użyłem paczki od Microsoftu,  i wybrałem z niej “arial.ttf”. Potem zmodyfikowałem plugin. Plugin po instalacji w projekcie siedzi sobie w folderze KATALOG_DOMOWY/.grails/1.1.1/projects/NAZWA_PROJEKTU/plugins. W pliku grails-app/services/PdfService.groovy jest to, co nas interesuje – użycie xhtmlrenderera. Zgodnie z instrukcją trzeba dodać odpowiednie fonty zaraz po stworzeniu renderea – zróbmy to:

ITextRenderer renderer = new ITextRenderer();
def fonts = ConfigurationHolder.config.pdfplugin.addFonts
fonts.each {
renderer.getFontResolver().addFont (it,
BaseFont.IDENTITY_H,
BaseFont.NOT_EMBEDDED);
}

Potrzebujemy jeszcze dodać dwa importy:

import com.lowagie.text.pdf.BaseFont
import org.codehaus.groovy.grails.commons.ConfigurationHolder

Teraz w konfiguracji trzeba dodać ścieżkę do pliku z fontem, lub plikami. Tak więc w Config.groovy dodajemy:

pdfplugin.addFonts=["/sciezka/do/plkiu/arial.ttf"]

I po restarcie aplikacji możemy cieszyć się działającymi plikami pdf z polskimi literkami ;) . Uważajcie tylko, żeby w CSS dla generowania strony wybrać odpowiednią rodzinę fontów, np. “Arial Unicode”,Arial,sans-serif. Proste, nie? :D

PS Chciałem zgłosić issue na githubie, na stronie projektu – ale github zastrajkował dlatego napisałem to na wiki.

Comments

2 Responses to “Generowanie PDF z Grails PDF Plugin + polskie znaki”

  1. Jacek Laskowski on June 4th, 2009 1:08 pm

    Przysiągłbym, że to powinno być jeszcze prostsze w Grails. Z tymi fontami docisnąłeś Grailsy do granic wytrzymałości :) Oby to nie był ostatni i jedyny wpis o Grailsach. Czyta się przyjemnie.

  2. Marcin Łępicki on June 4th, 2009 1:34 pm

    Hej! Witam u siebie :)

    “Zbieg okoliczności” zawodowych sprawił, że trafiłem do zespołu pracującego w Grails – także obiecuję więcej postów, także o Grails + Flex :)

Leave a Reply