12. FOP
Пакет
FOP предназначен для обработки документов по стандарту XSL FO (Formating Objects).
В частности он позволяет создавать PDF-документы на базе документов XML.
Для преобразования из исходного XML в FO пакет FOP по умолчанию использует XSLT-процессор
Xalan в паре с Xerces.
Для создания итогового изображения в FOP необходимо подключить шрифты, поддерживающие русские буквы.
Вот как можно проделать это для версии 0.20.1:
- В подкаталог conf/fonts (например, в c:\fop-0.20.1\conf\fonts\) скопировать файлы ttf из системного каталога Windows.
Для Arial normal/normal, normal/bold, italic/normal и italic/bold нужны файлы arial.ttf, arialbd.ttf, ariali.ttf и arialbi.ttf
- Сгенерировать файлы описаний шрифтов (типа arial.xml).
Для этого для каждого шрифта нужно выполнить команду (это для Arial normal/normal, всё в одну строку):
java -cp .;c:\fop-0.20.1\build\fop.jar;c:\fop-0.20.1\lib\batik.jar;
c:\fop-0.20.1\lib\xalan-2.0.0.jar;c:\fop-0.20.1\lib\xerces.jar;
c:\fop-0.20.1\lib\jimi-1.0.jar
org.apache.fop.fonts.apps.TTFReader fonts\arial.ttf fonts\arial.xml
- В FOP добавить в conf/userconfig.xml описание шрифта с русскими буквами, типа:
<font metrics-file="c:\fop-0.20.1\conf\fonts\arial.xml" kerning="yes"
embed-file="c:\fop-0.20.1\conf\fonts\arial.ttf">
<font-triplet name="Arial" style="normal" weight="normal"/>
<font-triplet name="ArialMT" style="normal" weight="normal"/>
</font>
Аналогично добавляются Arial normal/bold, italic/normal и italic/bold
- При вызове FOP из командной строки после org.apache.fop.apps.Fop писать -c c:\fop-0.20.1\conf\userconfig.xml
Если нужно использовать FOP из сервлета, то нужно в сервлете после строчки:
Driver driver=new Driver();
добавить строчки:
// Каталог fonts (c:\weblogic\fonts) был
// создан исключительно для удобства.
String userConfig="fonts/userconfig.xml";
File userConfigFile=new File(userConfig);
Options options=new Options(userConfigFile);
Тогда расположение файлов ttf в файле userconfig.xml можно указать относительно корня сервера приложения, без указания абсолютного пути:
<font metrics-file="fonts/arial.xml" kerning="yes"
embed-file="fonts/arial.ttf">
<font-triplet name="Arial" style="normal" weight="normal"/>
<font-triplet name="ArialMT" style="normal" weight="normal"/>
</font>
- В файле FO (или XML и XSL) перед использованием шрифта писать:
font-family="Arial"
font-weight="bold" (Если используется Arial bold)
font-style="italic" (Если используется Arial italic)
Данный алгоритм прислал
Алексей Тюрин, за что ему отдельное спасибо.
Если Вы используете встроенный в FOP просмотрщик, то необходимо учесть его особенности.
В частности, хотя предполагается, что надписи в нём русифицированы, на самом деле сделано это с ошибкой (в версии 0.19.0).
Для загрузки надписей из файлов ресурсов в пакете org.apache.fop.viewer.resources используется собственный загрузчик (класс org.apache.fop.viewer.LoadableProperties).
Кодировка чтения там жёстко зафиксирована (8859_1, как и в случае Properties.load()), однако поддержка записи вида "\uXXXX" не реализована.
Я сообщил об этой ошибке разработчикам, они включили её исправление в свои планы.
Кроме всего прочего существует сайт посвящённый русификации FOP (
http://www.openmechanics.net/rusfop/).
Там Вы сможете найти дистрибутив FOP с уже исправленными ошибками и подключенными русскими шрифтами.