DeepEdit!

Программирование баз данных на Oracle, техническая документация, литература, статьи и публикации

  • Увеличить размер шрифта
  • Размер шрифта по умолчанию
  • Уменьшить размер шрифта

Использование кириллицы в PDF-отчётах Oracle Reports на Unix-платформах

Введение

Одним из ключевых факторов, влияющих на принятие решение выбора операционной системы для использования в ней компонента 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-документе может отличаться от ожидаемого результата. Основными причинами являются:

1. Acrobat Reader не находит шрифтов для отображения кириллицы.

2. Во время формирования документа сервер отчётов пользовался неверными файлами метрик шрифтов.

Рассмотрим эти вопросы более детально:

Для того чтобы корректно отобразить кириллицу на экране, программа Acrobat Reader должна откуда-то взять описания глифов символов в PDF-документе. Существуют два варианта решения:

1. В документе указано название шрифта, а сам шрифт будет найден в среде Acrobat Reader, либо в операционной системе

2. Шрифт встроен в PDF-документ.

Первый вариант является очень ненадёжным, потому что он предполагает наличие на стороне клиента определённой конфигурации в виде "правильной" версии Acrobat Reader.

Второй вариант решения хоть и увеличивает размер документа за счёт наличия в нём шрифтов, но он даёт определённую гарантию того, что PDF-отчёт будет корректно отображён у каждого пользователя независимо от того, есть ли у него необходимые шрифты на машине или нет. Надо сказать, что существуют два способа встраивания шрифта в документ: шрифт может быть включён в документ полностью с описанием всех глифов, либо шрифт может быть встроен частично, когда в PDF-файле присутствуют описания и глифы только тех символов, которые присутствуют в документе. Каждый из этих методов имеет свои недостатки и преимущества, детальное обсуждение которых выходит за рамки статьи.

Как правило, в PDF-документах очень редко используются моноширинные шрифты, все символы которых имеют одинаковую ширину, поэтому важным фактором при формировании документа сервером отчётов является предоставление информации о размерах используемых шрифтов в виде AFM-файлов метрик. В них содержатся такие данные шрифта, как ширина, высота, стиль символов, и эта информация позволяет серверу отчётов на этапе формирования PDF-файла верно рассчитать месторасположение строк на листе документа.

Таким образом, конфигурируя сервер отчётов на работу с шрифтами, содержащими кириллицу, мы должны уделить особое внимание настройке двух опций сервера отчётов:

1. Встраивание используемого шрифта с кириллицей в PDF-документ.

2. Предоставление AFM-файлов метрик шрифтов серверу отчётов

Обзор процесса настройки

Процесс настройки сервера отчётов на использование кириллицы при формировании отчётов целесообразно разбивать на три этапа:

1. Настраиваем сервер отчётов на создание документов, не затрагивая вопросы корректного отображения символов.

2. Настраиваем сервер отчётов на включение в PDF-документ информации о шрифах, используя механизм Font Subsetting.

3. Настраиваем сервер отчётов на использование информации о метриках шрифтов, содержащих кириллицу, при построении PDF-документа.

Следование этим действиям позволяет наиболее аккуратно и последовательно настроить сервер отчётов. При возникновении каких-либо несоответствий на том или ином этапе мы можем однозначно диагностировать причину проблемы.

Настройка Oracle Reports на примере простого документа

Рассмотрим настройку сервера отчётов на примере конфигурирования системы для формирования отчёта на основе файла report.rdf, содержащего символы кириллицы.

1. Формируем отчёты без претензий к внешнему виду документа

На этом шаге мы выполняем набор действий, который позволяет нам получить PDF-документ в качестве отчёта и убедиться в том, что отчёт всё-таки формируется. Кириллица, скорее всего, будет представлена в виде каких-либо нечитаемых символов, но на это пока обращать внимания не стоит.

1. Копируем файл report.rdf в отдельный каталог:

cp report.rdf ~/reports

2. Редактируем файл $ORACLE_HOME/bin/reports.sh и изменяем строки с настройками для переменных окружения REPORTS_PATH и NLS_LANG:

REPORTS_PATH=~/reports; export REPORTS_PATH

NLS_LANG=RUSSIAN_CIS.CL8MSWIN1251; export NLS_LANG

3. Выполняем операцию по замене значения поля 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

4. Запускаем сервер приложений:

$ORACLE_HOME/opmn/bin/opmnctl startall

5. Получаем PDF-документ, обратившись по адресу:

http://yourhost:port/reports/rwservlet?report=report.rdf=cache=pdf

Отчёт будет выглядеть примерно так:

Настраиваем механизм Font Subsetting

Теперь нужно сконфигурировать сервер отчётов таким образом, чтобы в получаемых PDF-документах можно было распознать кириллицу и прочитать текст. Для этого требуется использовать механизм Font Subsetting, который заставляет сервер отчётов на этапе формирования документа встроить в файл описание глифов символов.

Суть данной настройки состоит в том, что мы должны разместить на сервере ttf-файлы с шрифтами и произвести сопоставление шрифта в документе с конкретным ttf-файлом в операционной системе.

1. Размещаем файлы в каталоге операционной системы.

Я для решения этой задачи воспользовался готовым пакетом msttcorefonts-1.2-3.noarch.rpm, который размещает в каталоге /usr/X11R6/lib/X11/fonts/msttcorefonts ttf-файлы ряда популярных шрифтов. Нас интересуют следующие файлы:

Шрифт Arial: arialbd.ttf arialbi.ttf ariali.ttf arial.ttf

Шрифт Courier: courbd.ttf courbi.ttf couri.ttf cour.ttf

Шрифт Times New Roman: timesbd.ttf timesbi.ttf timesi.ttf times.ttf

Если у вас возникли проблемы с поиском этого пакета, то вы можете воспользоваться ttf-файлами шрифтов, взятыми из-под операционной системы Windows.

2. Редактируем файл $ORACLE_HOME/bin/reports.sh, сообщая через переменную REPORTS_PATH серверу отчётов месторасположение файлов шрифтов:

REPORTS_PATH=~/reports:/usr/X11R6/lib/X11/fonts/msttcorefonts; export REPORTS_PATH

3. Указываем серверу отчётов, в каких файлах содержатся шрифты. Для этого нужно сопоставить в конфигурационном файле имя шрифта, используемого в отчёте, с именем ttf-файла. Данная операция выполняется путём редактирования конфигурационного файла $ORACLE_HOME/ guicommon9/tk/admin/uifont.ali. В этом файле уже по умолчанию прописан ряд настроек, который определяет псевдонимы для шрифтов. Нам необходимо в разделе [ PDF:Subset ] сопоставить псевдоним с именем ttf-файла шрифта:

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"

4. Перезапускаем сервер отчётов:

$ORACLE_HOME/opmn/bin/opmnctl restartproc process-type=OC4J_BI_Forms

5. Обращаемся к серверу отчётов по адресу

http://yourhost:port/reports/rwservlet?report=report.rdf=cache=pdf

мы увидим отчёт с кириллицей, но текст будет не выровнен:

Итак, мы убедились, что в документ попала информация шрифтов и она используется программой Acrobat Reader при отображении. То, что кириллица не выровнена, это нормально на данном этапе, поскольку мы только настроили включение информации шрифтов в PDF-документ, но не сообщали серверу отчётов о метриках шрифтов для корректной разметки отчёта.

3. Настраиваем сервер отчётов на использование метрик новых шрифтов

1. Получаем файлы метрик. Это можно сделать с помощью пакета ttf2pt1, который можно скачать с http://ttf2pt1.sourceforge.net/ и который позволяет сгенерировать 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

2. Вносим в файл $ORACLE_HOME/guicommon9/tk/admin/uiprint.txt определение нового принтера, добавив строку:

cyrillic:Postscript:1:Configure your uiprint.txt file:cyrillic.ppd:

Под термином "принтер" здесь далее имеется ввиду логический принтер, который позволяет корректно отформатировать данные, которые в дальнейшем будут отправлены на физический принтер. В частности, этот логический принтер предоставляет серверу отчётов информацию о шрифтах физического принтера, отступах в документе, и прочие данные.

1. Создаём файл cyrillic.ppd, описывающий принтер. Его можно создать на основе файла datap462.ppd:

cd $ORACLE_HOME/guicommon9/tk/admin/PPD

cp datap462.ppd cyrillic.ppd

2. В описании принтера определяем его шрифты. Этот принтер будет использовать шрифты, содержащие кириллицу.

В файле $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

3. Поскольку для шрифтов в описании принтера cyrillic мы используем полные имена шрифтов, то файл псевдонимов $ORACLE_HOME/guicommon9/tk/admin/uifont.ali нуждается в модификации. Мы можем в файле убрать определения всех псевдонимов и привести его к такому виду:

[ 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 всё-таки будут иметь эти шрифты на своей стороне.

4. В файле $ORACLE_HOME/bin/reports.sh указываем, что сервер отчётов должен использовать принтер cyrillic при формировании отчёта. Для этого мы должны в файле закомментировать строку, устанавливающую значение переменной REPORTS_NO_DUMMY_PRINTER:

#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

5. Перезапускаем сервер отчётов:

$ORACLE_HOME/opmn/bin/opmnctl restartproc process-type=OC4J_BI_Forms

6. Обратившись к серверу отчётов по адресу

http://yourhost:port/reports/rwservlet?report=report.rdf=cache=pdf

мы получаем корректно сформированный отчёт, в котором присутствует кириллица и текст выровнен в соответствии с размерами символов:

Источник

 


вибратор ив







jAntivirus