Записки жертвы высоких технологий

    Здравствуйте! Мой блог посвящен в большей своей части моей профессиональной деятельности на поприще использования технологий ORACLE для разработки баз данных OLTP и OLAP хранилищ данных. В заметках я периодически размещаю разнообразные SQL, PL/SQL и Java скрипты написанные мной и не только мной, ссылки на интересные источники в сети либо другую полезную информацию, которая каким либо образом касается моей работы с замечательными продуктами компании ORACLE.
    Вы можете связаться со мной по контактному емейлу, если у вас есть какие-либо вопросы, связанные с разработкой баз данных на основе продуктов ORACLE, буду рад помочь вам, если это будет в моих силах.

2 июл. 2013 г.

Мы снова в эфире. Работа с PDF и RTF в ORACLE

Всем привет! После продолжительного периода молчания я снова решил взяться за блог. В настоящее время снова занят разработкой баз данных ORACLE и занимаюсь модулем генерации RTF и PDF документов на основе данных БД.
Для создания файлов решил применить пакет iText, разрабатываемый итальянцем Bruno Lowagie. Из-за того, что мне нужны документы как в PDF так и в RTF, пришлось взять последнюю версию iText, которая имела поддержку обоих форматов 4.2.0. Последняя версия iText 5.4.2 больше RTF не поддерживает. Поддержка RTF была вынесена автором в отдельный проект на Sourceforge.net и в настоящее время активности в этом проекте не наблюдается. Зато версия 4.2.0 прекрасно справляется со своими задачами, то бишь с генерацией документов.
Собственно, чего я об этом пишу. При тестировании функциональности пакета я столкнулся с трудностями, связанными с выводом русского текста в PDF'е. Шрифты, находящиеся в пакете не способны отображать русские символы в кодировке cp1251. Перелопатив массу сайтов обнаружил, что та же ситуация происходит и у других пользователей пакета. Объяснения Bruno  лично мне остались непонятны и я решил поковыряться в исходном коде пакета, чтобы понять, что нужно делать, самостоятельно.

1. Необходимо использовать какой-либо шрифт, содержащий кириллические символы, например verdana.ttf (этот шрифт можно найти в папке C:\Windows\Fonts)
2. Нигде, - ни в книге iText in Action, ни в интернете нет информации, что iText допускает возможность подгрузки шрифта только из предопределенных папок сервера, хотя и требует спецификации полного пути для загрузки файла. Перечень предопределенных папок, это:


  • c:\windows\fonts
  • c:\winnt\fonts
  • d:\windows\fonts
  • d:\winnt\fonts
  • /usr/share/X11/fonts
  • /usr/X/lib/X11/fonts
  • /usr/openwin/lib/X11/fonts
  • /usr/share/fonts
  • /usr/X11R6/lib/X11/fonts
  • /Library/fonts
  • /System/Library/Fonts


В моем случае (Linux-сервер) пришлось использовать папку /usr/share/fonts, предварительно загрузив в нее шрифт verdana.ttf из Windows

После загрузки шрифта его можно использовать для формирования PDF и RTF файлов:

// Подгружаем шрифт и присваиваем ему алиас
FontFactory.register("/usr/share/fonts/verdana.ttf", "verdana");
...
// Создаем фонт по алиасу шрифта в нужной кодировке. 
// Обратите внимание на параметр BaseFont.EMBEDDED - он необходим для встраивания 
// файла шрифта в документ во избежание его подмены программой чтения PDF документов
Font fontVerdana = new FontFactory.getFont("verdana", "Cp1251", BaseFont.EMBEDDED, 30f, 1, Color.BLACK);
...
// Создаем chunk-объект для вывода в PDF
Chunk ch = new Chunk("Русский текст в PDF", fontVerdana);
...

После этого, создав документ, на экране вы увидите русские символы.
Продолжение следует:
"Парсинг и объединение RTF файлов с помощью PL/SQL"
"Генерация штрихкодов CODE128, тип С в RTF файле с помощью PL/SQL"