Настройка Oracle Reports на примере простого документа
Рассмотрим настройку сервера отчётов на примере конфигурирования системы для формирования отчёта на основе файла report.rdf, содержащего символы кириллицы.
Формируем отчёты без претензий к внешнему виду документа
На этом шаге мы выполняем набор действий, который позволяет нам получить PDF-документ в качестве отчёта и убедиться в том, что отчёт всё-таки формируется. Кириллица, скорее всего, будет представлена в виде каких-либо нечитаемых символов, но на это пока обращать внимания не стоит.
Копируем файл report.rdf в отдельный каталог:
cp report.rdf ~/reports
Редактируем файл $ORACLE_HOME/bin/reports.sh и изменяем строки с настройками для переменных окружения REPORTS_PATH и NLS_LANG:
Выполняем операцию по замене значения поля EncodingScheme с AdobeStandardEncoding на FontSpecific в AFM-файлах (см. Metalink Note:300416.1, где даётся объяснение необходимости этого действия). Это проще всего выполнить при помощи простого скрипта:
#!/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
Теперь нужно сконфигурировать сервер отчётов таким образом, чтобы в получаемых PDF-документах можно было распознать кириллицу и прочитать текст. Для этого требуется использовать механизм Font Subsetting, который заставляет сервер отчётов на этапе формирования документа встроить в файл описание глифов символов.
Суть данной настройки состоит в том, что мы должны разместить на сервере ttf-файлы с шрифтами и произвести сопоставление шрифта в документе с конкретным ttf-файлом в операционной системе.
Размещаем файлы в каталоге операционной системы.
Я для решения этой задачи воспользовался готовым пакетом msttcorefonts-1.2-3.noarch.rpm, который размещает в каталоге /usr/X11R6/lib/X11/fonts/msttcorefonts ttf-файлы ряда популярных шрифтов. Нас интересуют следующие файлы:
Указываем серверу отчётов, в каких файлах содержатся шрифты. Для этого нужно сопоставить в конфигурационном файле имя шрифта, используемого в отчёте, с именем ttf-файла. Данная операция выполняется путём редактирования конфигурационного файла $ORACLE_HOME/ guicommon9/tk/admin/uifont.ali. В этом файле уже по умолчанию прописан ряд настроек, который определяет псевдонимы для шрифтов. Нам необходимо в разделе [ PDF:Subset ] сопоставить псевдоним с именем ttf-файла шрифта:
мы увидим отчёт с кириллицей, но текст будет не выровнен:
Итак, мы убедились, что в документ попала информация шрифтов и она используется программой Acrobat Reader при отображении. То, что кириллица не выровнена, это нормально на данном этапе, поскольку мы только настроили включение информации шрифтов в PDF-документ, но не сообщали серверу отчётов о метриках шрифтов для корректной разметки отчёта.
Настраиваем сервер отчётов на использование метрик новых шрифтов
Получаем файлы метрик. Это можно сделать с помощью пакета ttf2pt1, который можно скачать здесь и который позволяет сгенерировать AFM-файл метрик из ttf-файла шрифта. Так, например, для шрифта Arial из файла arial.ttf нужно выполнить такую команду:
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
Вносим в файл $ORACLE_HOME/guicommon9/tk/admin/uiprint.txt определение нового принтера, добавив строку:
cyrillic:Postscript:1:Configure your uiprint.txt file:cyrillic.ppd:
Под термином “принтер” здесь далее имеется ввиду логический принтер, который позволяет корректно отформатировать данные, которые в дальнейшем будут отправлены на физический принтер. В частности, этот логический принтер предоставляет серверу отчётов информацию о шрифтах физического принтера, отступах в документе, и прочие данные.
Создаём файл cyrillic.ppd, описывающий принтер. Его можно создать на основе файла datap462.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
Поскольку для шрифтов в описании принтера cyrillic мы используем полные имена шрифтов, то файл псевдонимов $ORACLE_HOME/guicommon9/tk/admin/uifont.ali нуждается в модификации. Мы можем в файле убрать определения всех псевдонимов и привести его к такому виду:
"Times New Roman"..Italic.Bold.. = "timesbi.ttf" "Times New Roman"...Bold.. = "timesbd.ttf" "Times New Roman"..Italic... = "timesi.ttf" "Times New Roman"..... = "times.ttf"
Таким образом, сервер отчётов, зная через файл описания принтера о том, что принтер обладает соответствующим шрифтами, содержащими кириллицу, всё-таки встраивает в PDF-документ шрифты. И эти встроенные шрифты будут использоваться при печати или просмотре документа. То есть, мы специально создаём ситуацию, когда, с одной стороны, вроде бы принтер и обладает шрифтами и знает что-то про них (метрики), но с другой стороны, мы специально добиваемся того, чтобы шрифты попали в документ, поскольку маловероятно, что реальный физический принтер или программа Acrobat Reader всё-таки будут иметь эти шрифты на своей стороне.
В файле $ORACLE_HOME/bin/reports.sh указываем, что сервер отчётов должен использовать принтер cyrillic при формировании отчёта. Для этого мы должны в файле закомментировать строку, устанавливающую значение переменной REPORTS_NO_DUMMY_PRINTER: