Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Русификация FOP 0.95


Автор: ReFLeXive 17.3.2010, 16:26
ПРивет всем!
ПРоблема с русификацией FOP 0.95. КОгда вывожу в RTF - показывает русские буквы, а когда в PDF - то показывает решетки!
Делал следующее: в каталоге conf в файле fop.xconf прописал шрифты в разделе <fonts>...</fonts> таким образом:
Код

        <font metrics-url="arial.xml" kerning="yes" embed-url="arial.ttf">
        <font-triplet name="Arial" style="normal" weight="normal"/>
        <font-triplet name="ArialMT" style="normal" weight="normal"/>
    </font>
    <font metrics-url="arialbold.xml" kerning="yes" embed-url="arialbold.ttf">
        <font-triplet name="Arial" style="normal" weight="bold"/>
        <font-triplet name="ArialMT" style="normal" weight="bold"/>
    </font>
    <font metrics-url="ariali.xml" kerning="yes" embed-url="ariali.ttf">
        <font-triplet name="Arial" style="italic" weight="normal"/>
        <font-triplet name="ArialMT" style="italic" weight="normal"/>
    </font>
    <font metrics-url="arialbi.xml" kerning="yes" embed-url="arialbi.ttf">
        <font-triplet name="Arial" style="italic" weight="bold"/>
        <font-triplet name="ArialMT" style="italic" weight="bold"/>
    </font>
    <font metrics-url="arialn.xml" kerning="yes" embed-url="arialn.ttf">
        <font-triplet name="Arialn" style="normal" weight="normal"/>
        <font-triplet name="ArialnMT" style="normal" weight="normal"/>
    </font>
    <font metrics-url="arialnbold.xml" kerning="yes" embed-url="arialnbold.ttf">
        <font-triplet name="Arialn" style="normal" weight="bold"/>
        <font-triplet name="ArialnMT" style="normal" weight="bold"/>
    </font>
    <font metrics-url="dejavulgcsansmono.xml" kerning="yes" embed-url="dejavulgcsansmono.ttf">
        <font-triplet name="DejaVuLGCSansMono" style="normal" weight="normal"/>
        <font-triplet name="DejaVuLGCSansMonoMT" style="normal" weight="normal"/>
    </font>
    <font metrics-url="dejavulgcsansmonobold.xml" kerning="yes" embed-url="dejavulgcsansmonobold.ttf">
           <font-triplet name="DejaVuLGCSansMono" style="normal" weight="bold"/>
           <font-triplet name="DejaVuLGCSansMonoMT" style="normal" weight="bold"/>
    </font>


В Java приложении использую вот такой код:
Код

FopFactory factory = FopFactory.newInstance();
        Source xmlSrc = new StreamSource( new File( "1.xml" ) );
        Source xslSrc = new StreamSource( new File( "1.xsl" ) );
        try
        {
            InputStream in = factory.getClass().getResourceAsStream( "/conf/fop.xconf" );
            DefaultConfigurationBuilder cfgBuilder = new DefaultConfigurationBuilder();
            Configuration cfg = cfgBuilder.build( in );
            factory.setUserConfig( cfg );
                
            OutputStream out = new BufferedOutputStream( new FileOutputStream( new File( "/rhome/artur/test.pdf" ) ) );
            Fop fop = factory.newFop( MimeConstants.MIME_PDF, out );
            TransformerFactory trFactory = TransformerFactory.newInstance();
            Transformer transformer = trFactory.newTransformer( xslSrc );
            
            Result result = new SAXResult( fop.getDefaultHandler() );
            transformer.transform( xmlSrc, result );
            out.close();
        }
        catch ( Exception e )
        {
        }


Как я понял по выводу в консоли IDE мое приложение этот конфиг считывает(задает размеры страницы), но с русскими шрифтами в PDF работать не хочет...
Что сделать с этим?

PS. Сайт http://www.openmechanics.net/rusfop/ никак не помог - там старая версия FOPa

Автор: ReFLeXive 18.3.2010, 11:04
Никто не знает какой шрифт по умолчанию используется в FOP ?

Автор: serger 18.3.2010, 16:00
По-моему, надо свои шрифты пихать. Не помню как решал эту проблему - 3 года прошло.  smile

Добавлено через 2 минуты и 14 секунд
Ну, батенька,  smile ...
http://www.sql.ru/Forum/actualthread.aspx?bid=38&tid=491835&hl=
Да, надо свои шрифты, но пропускать через FOP/

Автор: ReFLeXive 19.3.2010, 13:14
Уважаемый serger, спасибо за ссылку! 
Однако мой код выше почти полностью идентичен по логике с тем, что вы привели по ссылке! 
я переписал по новой класс, скачал кириллические шрифты, сделал для них метрики командой:
Код

java -cp ./build/*:./lib/* org.apache.fop.fonts.apps.TTFReader times.ttf times.xml


Метрики успешно создались, я их вместе с файлом шрифта скопировал в каталог, с конфигом! И все равно - решетки вместо русских букв!
Также думал, что дело в кодировке, однако в xml прописана кодировка UTF-8, файлы создавались в кодировке UTF-8 и в RTF русские буквы очень хорошо отображаются!!!

Автор: ReFLeXive 22.3.2010, 12:52
Есть какие нить мысли? )

Автор: Egik2 22.3.2010, 17:27
Есть.
Давно на форум не заходил, а то бы помог.

Нужно ставить собственный FOP из сырцов.
Я уже сталкивался с такой же проблемой  smile.
Посмотри здесь, поможет http://xmlsite.sourceforge.net/rusfop/

Автор: ReFLeXive 23.3.2010, 14:58
Цитата(Egik2 @  22.3.2010,  17:27 Найти цитируемый пост)
Нужно ставить собственный FOP из сырцов.

Я как то пробовал, но что то сходу не получилось. Попробую еще разок.

Цитата(Egik2 @  22.3.2010,  17:27 Найти цитируемый пост)
Посмотри здесь, поможет Russian FOP 

К сожалению, данный ресурс не поможет, поскольку описанное там относиться к FOP версий 0.19.х - 0.20.
Работа с версиями 0.9х значительно изменилась по сравнению с предыдущими. К тому ж по сути я занимаюсь обновлением этой библиотеки в проекте, т.к. возникла реальная необходимость именно в версии 0.9х (рендеринг в формат RTF).

Автор: ReFLeXive 23.3.2010, 15:13
На форуме SQL.ru посоветовали чуть-чуть видоизменить xsl файл, а именно: прописать в блоке <fo:block> название шрифта. Сделал вот таким образом:
Код

<fo:block font-size="14pt" font-family="arial"  text-align="center">
            Hello, <xsl:value-of select="/reg/name"/>!
</fo:block>

Однако ситуация не изменилась в лучшую сторону. Однако,  при этом сервер выдал в лог вот такое сообщение:
Код

23.03.2010 16:53:01 org.apache.fop.fonts.FontInfo notifyFontReplacement
WARNING: Font 'arial,normal,400' not found. Substituting with 'any,normal,400'.

Что бы это могло значить? Проблемы с метриками шрифта?

Автор: serger 24.3.2010, 10:43
У меня эта проблема точно лечилась. Помню, что генерил свои шрифты, увы более ничего. Увы не могу глянуть проект (было на прошлой работе).
Проверьте, мож всё-таки не ту шрифт в итоге используете.

Автор: ReFLeXive 24.3.2010, 15:29
Сегодня утром до меня дошло, что нужно писать не название файла шрифта, а его triplet-name из конфигурации, т.е. по сути псевдоним шрифта( написал не arial, а Arial, как указано в triplet-name )! Сделал так и... о чудо! Заработало! Заговорил FOP по-русски! Это не может не радовать меня! smile
Еще раз огромное спасибо за советы!
Но еще всплывает вот такой момент: тестирование я проводил на тестовом проекте ( извиняюсь за тавтологию), теперь нужно ввести эту библиотеку (fop-0.95) в рабочий проект. ДЛя того, чтобы у клиентов нашего ПО не было возни со шрифтами у нас в старых версиях FOP каталог со шрифтами, метриками и конфигурационным файлом лежали прямо в самой библиотеке. То же самое и я хочу сделать.
Делаю следующее: Создал каталог conf, в него поместил файл настроек fop.xconf, шрифты (arial, times) c их метриками. Затем этот каталог conf я поместил в jar-архив fop путем простого перетаскивания. Получилось что то вроде: fop.jar!/conf/ .
В своем Java-классе для определения font-base я делаю следующее:

Код

fopFactory.setFontBaseURL( fopFactory.getClass().getResource( "/conf/" ).getPath() );


Эта команда задает font-base вот таким:
Код

file:/rhome/artur/workspace/Test/lib/fop.jar!/conf/

Путь, в принципе, верный!
В конфигурации я поменял соответствующие пути до метрики и до самого файла со шрифтом таким образом:
Код

<font metrics-url="arial.xml" kerning="yes" embed-url="arial.ttf">
          <font-triplet name="arial" style="normal" weight="normal"/>
</font >

По идее, относительный путь до arial.xml и arial.ttf должен определяться через font-base:
<font-base>/arial.xml
<font-base>/arial.ttf

Однако, в консоли сервер выдает:
Код

org.apache.fop.apps.FOPException: Failed to resolve font with embed-url 'arial.ttf'


ПОдскажите пожалуйста, возможно ли обратиться к файлу шрифта внутри библиотеки?

Автор: ReFLeXive 25.3.2010, 10:48
К счастью, на форуме SQL.ru мне подсказали как что сделать, поэтому проблема с русификацией FOP решена. Кому будет нужно, то можно нaйти ответ вот здесь:
http://www.sql.ru/forum/actualthread.aspx?bid=38&tid=491835
Сейчас пока буду разруливать кучу ошибок в проекте.

Автор: chemtech 8.2.2013, 19:21
ReFLeXive

Добрый день. Иду по вашим тропам в компиляции xml в FOP. Компилирую книгу https://launchpad.net/serverguide. У меня также появляются квадраты вместо русских букв. Можете помочь?

Цитата

C:\Users\Администратор\Downloads\fop-1.1>java -cp ./build/*:./lib/* org.apache.fop.fonts.apps.TTFReader arial.ttf arial.xml
Error: Could not find or load main class org.apache.fop.fonts.apps.TTFReader

C:\Users\Администратор\Downloads\fop-1.1>java -cp build\fop.jar;lib\avalon-framework.jar;lib\commons-logging.jar;lib\commons-io.jar org.apache.fop.fonts.apps.T
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
        at org.apache.fop.fonts.apps.TTFReader.main(TTFReader.java:126)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        ... 1 more


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)