bc52f7a2

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


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

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

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

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

cp report.rdf ~/reports

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

    REPORTS_PATH=~/reports; export REPORTS_PATH NLS_LANG=RUSSIAN_CIS.CL8MSWIN1251; export 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

  • Запускаем сервер приложений:
  • $ORACLE_HOME/opmn/bin/opmnctl startall

  • Получаем PDF-документ, обратившись по адресу:
  • http://yourhost:port/reports/rwservlet?report=report.rdf&destype=cache&desformat=pdf

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

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

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


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


  • Я для решения этой задачи воспользовался готовым пакетом 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.

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

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


  • Указываем серверу отчётов, в каких файлах содержатся шрифты. Для этого нужно сопоставить в конфигурационном файле имя шрифта, используемого в отчёте, с именем 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"


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

    $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-документ, но не сообщали серверу отчётов о метриках шрифтов для корректной разметки отчёта.

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



    1. Получаем файлы метрик. Это можно сделать с помощью пакета ttf2pt1, который можно скачать здесь и который позволяет сгенерировать AFM-файл метрик из ttf-файла шрифта. Так, например, для шрифта Arial из файла arial.ttf нужно выполнить такую команду:

      ttf2pt1 -l cyrillic -G A arial.ttf - > Arial


    2. Обратите внимание на название 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

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


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

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

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

      cd $ORACLE_HOME/guicommon9/tk/admin/PPD cp datap462.ppd cyrillic.ppd


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


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

    8. Поскольку для шрифтов в описании принтера 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"


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

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

      #REPORTS_NO_DUMMY_PRINTER=TRUE; export REPORTS_NO_DUMMY_PRINTER


    11. Добавить две строки, устанавливающие значения переменных TK_PRINTER и TK_PRINT_STATUS:

      TK_PRINTER=cyrillic; export TK_PRINTER TK_PRINT_STATUS=echo; export TK_PRINT_STATUS

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

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


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


    14. http://yourhost:port/reports/rwservlet?report=report.rdf&destype=cache&desformat=pdf

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




      Содержание раздела