HTML, CSS 2.1 i dokumenty PDF

pdfW ostatnim czasie realizowałem projekt w którym należało zaprojektować ok. sto dokumentów PDF w postaci różnego rodzaju wniosków, w różnym układzie. Ten, kto kiedykolwiek generował dokumenty za pomocą iTexta wie, że nie jest to trudne, lecz czasochłonne. Programiści z reguły są leniwi, ponieważ zawsze szukają drogi na skróty, tak aby zrobić jak najwięcej i najmniej się przy tym napracować. Ja również, dlatego postanowiłem wykonać generowanie takich dokumentów na podstawie HTML, CSS 2.1 i oddelegować zadanie projektowania takich szablonów innej osobie 🙂
Chodzi oczywiście o projekt realizowany w Javie.

Założenia

były takie, aby główny kontroler wydruku przekazywał dane konkretnego podmiotu (wniosku) do szablonu wydruku, a ten z kolei obsługiwał formatowanie danych.

Jako silnik szablonów wykorzystałem Velocity, dzięki któremu zostało wykonane generowanie układu dokumentu PDF za pomocą HTML i CSS 2.1. i przekazenie go do biblioteki renderującyej PDFy – Flying Saucer. Ale po kolei…

Flying Saucer

Pobieramy bibliotekę generującą dokumenty PDF na podstawie HTML i CSS stąd. I dołączamy do projektu ‚jary’:

  • core-renderer.jar
  • iText-2.0.8.jar
  • xml-apis-xerces-2.9.1.jar

Hello world!

Tworzę plik szablon.html z zawartością:

A następnie piszę obsługę renderowania dokumentu PDF na podstawie wykonanego szablonu:

Wynik można zobaczyć tutaj.

No to wykonajmy kilka przykładów:

  1. Formatowanie tekstu

    Wynik tutaj.
    Można jednak zauważyć, że brakuje polskich znaków. Należy dołączyć czcionki.

  2. Dodanie własnych czcionek.

    Tworzę katalog fonts i kopiuję do niego times.ttf z katalogu czcionek Windowsa. Następnie dodaję ją w kodzie:

    Wynik tutaj.
    Należy zwrócić uwagę, że dołączenie czcionki zwiększyło rozmiar pliku z ok. 1,5kB do ok. 29kB.

  3. Listy

    Wynik tutaj.

  4. Trochę bardziej skomplikowana tabela z obrazkiem:

    Wynik tutaj.

  5. Na sam koniec: zmiana orientacji strony, marginesy i stopka z numeracją stron
    Wszystkie te ustawienia mieszczą się w tym fragmencie styli CSS:

    Wynik tutaj.

Podsumowanie

Jak widać Flying Saucer ma dosyć duże możliwości, a pokazałem tu zaledwie ich promil. Dzięki CSS2.1 można obsłużyć generowanie nagłówków i stopek. Dodać numerację stron, zmienić ich orientację, itp.

Miałem tutaj jeszcze zamieścić informację na temat wykorzystania Velocity do dynamicznego generowania zawartości szablonów, ale to już temat na osobny wpis.

Kod w Javie powyżej to tylko prosty przykład. Docelowe rozwiązanie należało opakować jeszcze kilkunastoma klasami odpowiedzialnymi za np. za zarządzanie ścieżkami do zasobów, obsługą renderowania pól formularzy, możliwości wstrzykiwania styli, itp.

To również może Cię zainteresować:

  • 10-letni chłopak zdobył 100% na egzaminie OCPJP z Javy!10-letni chłopak zdobył 100% na egzaminie OCPJP z Javy! W zeszłym roku Ronil Shah zaskoczył prawie wszystkich zdobywając sto procent punktów w egzaminie z Javy OCPJP. Jednak to nie wszystko. Najciekawsze jest to, że egzamin ten przewidziany […]
  • Programowanie funkcyjne w Javie.Programowanie funkcyjne w Javie. Co nieco o programowaniu funkcyjnym. Czy możliwe jest całkowite usunięcie ze swojego kodu wyrażeń typu if / else, for, while, do while? Wydaje się to niemożliwe, bo wielu programistów […]
  • C64 intro w CSS3C64 intro w CSS3 W ostatnim artykule opisywałem jak samemu można zrobić sobie swój retro komputer wykorzystując mini komputer Odroid C1+. Dzisiaj natrafiłem na coś ciekawego - przykład możliwości wykonania […]
  • Termotransferowa drukarka etykiet Zebra P4TTermotransferowa drukarka etykiet Zebra P4T W ostatnim czasie pracowałem nad systemem dla dużej amerykańskiej firmy, który miał usprawnić zarządzanie zleceniami dla operatorów wózków widłowych w magazynie. Importujemy dane […]
  • Java Spring, recenzja kursu wideo z Videopoint.plJava Spring, recenzja kursu wideo z Videopoint.pl Każdy, kto zawodowo programuje w obojętnie jakim języku wie, że bez wsparcia frameworków nasze życie byłoby znacznie trudniejsze. Tak jak Python ma swojego Django, PHP - Symfony, czy Ruby […]
  • Czat z socket.io i JavaCzat z socket.io i Java Cel: Oprogramowanie w javie chatu działającego w czasie rzeczywistym bez komunikacji asynchronicznej. Biblioteki: socket.io netty-socketio Efekt […]

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *