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