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?
PS Chciałem zgłosić issue na githubie, na stronie projektu – ale github zastrajkował dlatego napisałem to na wiki.