Источник: "Oracle Magazine/Русское издание"
Одним из ключевых факторов, влияющих на принятие решение выбора операционной системы для использования в ней компонента Oracle Reports сервера приложений OracleAS, является корректность работы сервера отчётов с русским языком на той или иной платформе.
К большому сожалению, процесс настройки сервера отчётов на полноценное восприятие кириллицы не является прозрачным для Unix-платформ. Причина кроется в том, что имеется принципиальная разница между архитектурой механизма формирования документов в среде Oracle Reports в операционных системах Windows и Unix. Как результат, в Unix-системах администратор сервера приложений должен выполнить ряд действий для того, чтобы получать в качестве результата работы сервера отчётов качественные документы. Большая гибкость настройки сервера отчётов и, как следствие, обширная информация по методике настройке в стандартной документации и публикациях на сайте Metalink (сайт технической поддержки Oracle) играет, как ни странно, плохую шутку с администраторами сервера отчётов в Unix-платформах – читая документы, очень легко запутаться и так и остаться с нерешённым вопросом по настройке сервера отчётов для формирования документов, содержащих кириллицу.
Цель данной статьи состоит в том, чтобы продемонстрировать основные действия, которые необходимо выполнить на Unix-платформе для получения качественных отчётов Oracle Reports, содержащих кириллицу. В статье для демонстрации используется операционная система Red Hat Linux Advanced Server и “чистый” сервер приложений Oracle Application Server 10.1.2.0.2.
Если администратор сервера приложений в процессе настройки сервера отчётов выполнил только минимальный набор действий по настройке, то при попытке сформировать PDF-отчёт, который должен содержать кириллицу, пользователь получит документ, который при просмотре через программу Acrobat Reader будет нечитаемым или неверно размеченным.
Почему так происходит? Даже если документ с точки зрения сервера Oracle Reports был сформирован корректно, то всё равно существует целый комплекс причин, из-за которых внешний вид текста в PDF-документе может отличаться от ожидаемого результата. Основными причинами являются:
Рассмотрим эти вопросы более детально:
Для того, чтобы корректно отобразить кириллицу на экране, программа Acrobat Reader должна откуда-то взять описания глифов символов в PDF-документе. Существуют два варианта решения:
Первый вариант является очень ненадёжным, потому что он предполагает наличие на стороне клиента определённой конфигурации в виде “правильной” версии Acrobat Reader.
Второй вариант решения хоть и увеличивает размер документа за счёт наличия в нём шрифтов, но он даёт определённую гарантию того, что PDF-отчёт будет корректно отображён у каждого пользователя, независимо от того, есть ли у него необходимые шрифты на машине или нет. Надо сказать, что существуют два способа встраивания шрифта в документ: шрифт может быть включён в документ полностью с описанием всех глифов, либо шрифт может быть встроен частично, когда в PDF-файле присутствуют описания и глифы только тех символов, которые присутствуют в документе. Каждый из этих методов имеет свои недостатки и преимущества, детальное обсуждение которых выходит за рамки статьи.
Как правило, в PDF-документах очень редко используются моноширинные шрифты, все символы которых имеют одинаковую ширину, поэтому важным фактором при формировании документа сервером отчётов является предоставление информации о размерах используемых шрифтов в виде AFM-файлов метрик. В них содержатся такие данные шрифта, как ширина, высота, стиль символов, и эта информация позволяет серверу отчётов на этапе формирования PDF-файла верно рассчитать месторасположение строк на листе документа.
Таким образом, конфигурируя сервер отчётов на работу с шрифтами, содержащими кириллицу, мы должны уделить особое внимание настройке двух опций сервера отчётов:
Следование этим действиям позволяет наиболее аккуратно и последовательно настроить сервер отчётов. При возникновении каких-либо несоответствий на том или ином этапе мы можем однозначно диагностировать причину проблемы.
Рассмотрим настройку сервера отчётов на примере конфигурирования системы для формирования отчёта на основе файла report.rdf, содержащего символы кириллицы.
На этом шаге мы выполняем набор действий, который позволяет нам получить PDF-документ в качестве отчёта и убедиться в том, что отчёт всё-таки формируется. Кириллица, скорее всего, будет представлена в виде каких-либо нечитаемых символов, но на это пока обращать внимания не стоит.
cp report.rdf ~/reports
REPORTS_PATH=~/reports; export REPORTS_PATH NLS_LANG=RUSSIAN_CIS.CL8MSWIN1251; export NLS_LANG
#!/bin/sh
for i in `ls $ORACLE_HOME/guicommon9/tk/admin/AFM/*` ; do
cat "$i" | sed 's/AdobeStandardEncoding/FontSpecific/g' > "${i}.replaced"
mv "${i}.replaced" "$i"
done
$ORACLE_HOME/opmn/bin/opmnctl startall
http://yourhost:port/reports/rwservlet?report=report.rdf&destype=cache&desformat=pdf
Отчёт будет выглядеть примерно так:

Теперь нужно сконфигурировать сервер отчётов таким образом, чтобы в получаемых PDF-документах можно было распознать кириллицу и прочитать текст. Для этого требуется использовать механизм Font Subsetting, который заставляет сервер отчётов на этапе формирования документа встроить в файл описание глифов символов.
Суть данной настройки состоит в том, что мы должны разместить на сервере ttf-файлы с шрифтами и произвести сопоставление шрифта в документе с конкретным ttf-файлом в операционной системе.
Я для решения этой задачи воспользовался готовым пакетом msttcorefonts-1.2-3.noarch.rpm, который размещает в каталоге /usr/X11R6/lib/X11/fonts/msttcorefonts ttf-файлы ряда популярных шрифтов. Нас интересуют следующие файлы:
Если у вас возникли проблемы с поиском этого пакета, то вы можете воспользоваться ttf-файлами шрифтов, взятыми из-под операционной системы Windows.
REPORTS_PATH=~/reports:/usr/X11R6/lib/X11/fonts/msttcorefonts; export REPORTS_PATH
times..Italic.Bold.. = "timesbi.ttf" times...Bold.. = "timesbd.ttf" times..Italic... = "timesi.ttf" times..... = "times.ttf" helvetica..Italic.Bold.. = "arialbi.ttf" helvetica...Bold.. = "arialbd.ttf" helvetica..Italic... = "ariali.ttf" helvetica..... = "arial.ttf" courier..Italic.Bold.. = "courbi.ttf" courier...Bold.. = "courbd.ttf" courier..Italic... = "couri.ttf" courier..... = "cour.ttf"
$ORACLE_HOME/opmn/bin/opmnctl restartproc process-type=OC4J_BI_Forms
http://yourhost:port/reports/rwservlet?report=report.rdf&destype=cache&desformat=pdf
мы увидим отчёт с кириллицей, но текст будет не выровнен:

Итак, мы убедились, что в документ попала информация шрифтов и она используется программой Acrobat Reader при отображении. То, что кириллица не выровнена, это нормально на данном этапе, поскольку мы только настроили включение информации шрифтов в PDF-документ, но не сообщали серверу отчётов о метриках шрифтов для корректной разметки отчёта.
ttf2pt1 -l cyrillic -G A arial.ttf - > Arial
Обратите внимание на название AFM-файла, которое нужно сделать равным полю FullName этого файла.
Таким образом для наших 12 шрифтов мы получим 12 AFM файлов
Arial Arial Italic Arial Bold Arial Bold Italic Courier New Courier New Italic Courier New Bold Courier New Bold Italic Times New Roman Times New Roman Italic Times New Roman Bold Times New Roman Bold Italic
Эти файлы следует разместить в каталоге $ORACLE_HOME/guicommon9/tk/admin/AFM
cyrillic:Postscript:1:Configure your uiprint.txt file:cyrillic.ppd:
Под термином “принтер” здесь далее имеется ввиду логический принтер, который позволяет корректно отформатировать данные, которые в дальнейшем будут отправлены на физический принтер. В частности, этот логический принтер предоставляет серверу отчётов информацию о шрифтах физического принтера, отступах в документе, и прочие данные.
cd $ORACLE_HOME/guicommon9/tk/admin/PPD cp datap462.ppd cyrillic.ppd
В файле $ORACLE_HOME/guicommon9/tk/admin/PPD/cyrillic.ppd заменяем строки:
*% Font Information ==================== *DefaultFont: Courier *Font Courier: Standard "(001.004)" Standard ROM *Font Courier-Bold: Standard "(001.001)" Standard ROM *Font Courier-BoldOblique: Standard "(001.001)" Standard ROM *Font Courier-Oblique: Standard "(001.001)" Standard ROM *Font Helvetica: Standard "(001.001)" Standard ROM *Font Helvetica-Bold: Standard "(001.001)" Standard ROM *Font Helvetica-BoldOblique: Standard "(001.001)" Standard ROM *Font Helvetica-Oblique: Standard "(001.001)" Standard ROM *Font Symbol: Special "(001.001)" Special ROM *Font Times-Bold: Standard "(001.001)" Standard ROM *Font Times-BoldItalic: Standard "(001.001)" Standard ROM *Font Times-Italic: Standard "(001.001)" Standard ROM *Font Times-Roman: Standard "(001.001)" Standard ROM на *% Font Information ==================== *DefaultFont: Courier New *Font Times New Roman: Standard "(001.001)" Standard ROM *Font Times New Roman Bold: Standard "(001.001)" Standard ROM *Font Times New Roman Bold Italic: Standard "(001.001)" Standard ROM *Font Times New Roman Italic: Standard "(001.001)" Standard ROM *Font Arial: Standard "(001.004)" Standard ROM *Font Arial Bold: Standard "(001.004)" Standard ROM *Font Arial Bold Italic: Standard "(001.004)" Standard ROM *Font Arial Italic: Standard "(001.004)" Standard ROM *Font Courier New: Standard "(001.004)" Standard ROM *Font Courier New Bold: Standard "(001.001)" Standard ROM *Font Courier New Bold Italic: Standard "(001.001)" Standard ROM *Font Courier New Italic: Standard "(001.001)" Standard ROM
[ Global ] [ Printer ] [ Printer:PostScript1 ] [ Printer:PostScript2 ] [ Printer:PCL5 ] [ Display ] [ Display:Motif ] [ Display:CM ] [ PDF ] [ PDF:Embed ] [ PDF:Subset ] "Times New Roman"..Italic.Bold.. = "timesbi.ttf" "Times New Roman"...Bold.. = "timesbd.ttf" "Times New Roman"..Italic... = "timesi.ttf" "Times New Roman"..... = "times.ttf" Arial..Italic.Bold.. = "arialbi.ttf" Arial...Bold.. = "arialbd.ttf" Arial..Italic... = "ariali.ttf" Arial..... = "arial.ttf" "Courier New"..Italic.Bold.. = "courbi.ttf" "Courier New"...Bold.. = "courbd.ttf" "Courier New"..Italic... = "couri.ttf" "Courier New"..... = "cour.ttf"
Таким образом, сервер отчётов, зная через файл описания принтера о том, что принтер обладает соответствующим шрифтами, содержащими кириллицу, всё-таки встраивает в PDF-документ шрифты. И эти встроенные шрифты будут использоваться при печати или просмотре документа. То есть, мы специально создаём ситуацию, когда, с одной стороны, вроде бы принтер и обладает шрифтами и знает что-то про них (метрики), но с другой стороны, мы специально добиваемся того, чтобы шрифты попали в документ, поскольку маловероятно, что реальный физический принтер или программа Acrobat Reader всё-таки будут иметь эти шрифты на своей стороне.
#REPORTS_NO_DUMMY_PRINTER=TRUE; export REPORTS_NO_DUMMY_PRINTER
Добавить две строки, устанавливающие значения переменных TK_PRINTER и TK_PRINT_STATUS:
TK_PRINTER=cyrillic; export TK_PRINTER TK_PRINT_STATUS=echo; export TK_PRINT_STATUS
$ORACLE_HOME/opmn/bin/opmnctl restartproc process-type=OC4J_BI_Forms
http://yourhost:port/reports/rwservlet?report=report.rdf&destype=cache&desformat=pdf
мы получаем корректно сформированный отчёт, в котором присутствует кириллица и текст выровнен в соответствии с размерами символов:
