Ostatnio pobrałem sobie ze strony Apache’a pakiet fop-0.94. Warto wspomnieć, do czego takowy pakiet służy. Otóż wykonuje on, poprzez odmianę transformaty XSL, zwaną XSL-FO, generowanie dokumentu w wybranym formacie – najczęściej chodzi o PDF oraz o PS.
Zadaniem, które sobie postawiłem było wygenerowanie pliku PDF z polskimi krzaczkami. Samo uruchomienie pakietu nie nastręcza kłopotów. Wystarzy rozpakować pobrany pakiet i uruchomić polecenie fop w systemie Linux’owym, lub fop.bat, jeżeli jest to Windows. Lista parametrów pięknie pokaże się naszym oczom. Standarodowe używanie programu polega na ładowaniu plików .fo i generowaniu powiedzmy .pdf. Lepszą zabawę uzyskujemy wykorzystując plik transformacji .xsl, który na bazie pliku z danymi .xml generuje nam plik typu .fo, z którego powstaje upragniony .pdf czy .ps.
Problem z jakim się napotkałem to oczywiście polskie czcionki, które, jakżeby inaczej, w domyślnej konfiguracji są niezbyt dostępne dla użytkownika. Zadanie to można zrealizować poprzez wykorzystanie pliku z czcionkami, które akceptuje fop. A akceptuje dwa dość popularne typy: TrueType oraz PostScript Type 1. Posiadając system Windows możemy odnaleźć czcionki TrueType z polską czcionką i spróbować je wykorzystać. Pliki posiadają rozszerzenie .ttf. Oczywiście polecam wcześniej przyjrzeć się, co takowy plik tak naprawdę zawiera.
Aby wykorzystać wybraną czcionkę powinniśmy w pierwszej kolejności wygenerować tak zwane font metrics, którymi FOP będzie się posługiwał. Poniżej zamieszczam kod skryptu sh, który używałem do generowania takowego pliku. Skrypt używa w tym celu klasy TTFReader, która dostarczona jest z FOP’em. Jeżeli import odbywa się z czcionek True Type 1, to należy wykorzystać klasę PMFReader.
#!/bin/sh
#
# sciezka do katalogu domowego Java
JAVA_HOME="/opt/java";
# sciezka do pliku fop.jar
FOP_PATH="/opt/java/fop/build";
# sciezka do jar'ow uzywanych przez fop'a
LIB_PATH="/opt/java/fop/lib";
#
$JAVA_HOME/bin/java -cp $FOP_PATH/fop.jar:$LIB_PATH/avalon-framework.jar:$LIB_PATH/xml-apis.jar:$LIB_PATH/xercesImpl.jar:$LIB_PATH/xalan.jar:$LIB_PATH/commons-logging-1.0.4.jar:$LIB_PATH/commons-io-1.3.1.jar org.apache.fop.fonts.apps.TTFReader $1 $1.xml
Jeżeli posiadamy czcionki bold oraz italic, to dla nich również generujemy pliki font metrics.
Teraz pliki czcionek oraz wygenerowane font metrics umieszczamy w jakimś miejscu na dysku, niech to będzie /usr/local/lib/fop. Potrzebny jest nam teraz plik konfiguracyjny, który pozwoli na podłączenie takich czcionek. Będzie on wyglądał tak:
<configuration>
<renderers>
<renderer mime="application/pdf">
<fonts>
<font metrics-url="file:///usr/local/lib/fop/czcionka.ttf.xml" kerning="yes" embed-url="file:///usr/local/lib/fop/czcionka.ttf">
<font-triplet name="Czcionka" style="normal" weight="normal"/>
</font>
<font metrics-url="file:///usr/local/lib/fop/czcionka-bold.ttf.xml" kerning="yes" embed-url="file:///usr/local/lib/fop/czcionka-bold.ttf">
<font-triplet name="Czcionka" style="normal" weight="bold"/>
</font>
<font metrics-url="file:///usr/local/lib/fop/czcionka-italic.ttf.xml" kerning="yes" embed-url="file:///usr/local/lib/fop/czcionka-italic.ttf">
<font-triplet name="Czcionka" style="italic" weight="normal"/>
</font>
</fonts>
</renderer>
</renderers>
</configuration>
Plik konfiguracyjny zawiera ścieżki, wskazujące na pliki czcionek oraz ich odpowiednie font metrics. Oczywiście konfiguracja może również zawierać inne dane konfiguracyjne, jakie używamy do fop’a. Te określone tutaj określają zestaw czcionek, używanych podczas renderowania dokumentu PDF – na co wskazuje atrybut mime=”application/pdf”, użyty dla elementu renderer. Aby użyć pliku konfiguracyjnego wykorzystujemy polecenie fop z parametrem -c nazwa-pliku-konfiguracyjnego.
To co jest jeszcze istotne to fakt, że podczas generowania pliku PDF/PS, fop automatycznie tworzy w katalogu domowym bieżącego użytkownika folder .fop, w którym zostaje zawarty cache dla czcionek, jakie są wykorzystywane. Warto o tym pamiętać w przypadku korzystania z tego narzędzia poprzez np. zestaw narzędzi apache + php, gdy mamy skonfigurowanego użytkownika dla aplikacji. Fop będzie wtedy próbował założyć folder w katalogu domowym takiego użytkownika – dobrze więc sprawdzić, czy użytkownik ma uprawnienia do zapisywania w takim katalogu. (Można również utworzyć samodzielnie folder .fop, w jego katalogu domowym i nadać na nim odpowiednie uprawnienia własności/zapisu).
Więcej na temat fop‘a znajdziemy na stonie domowej projektu Apache’a http://xmlgraphics.apache.org/fop/