В некоторых случаях посетителям того или иного сайта было бы удобнее воспользоваться офлайн-версией, которую можно скачать на локальный компьютер. "Счастливые" обладатели модемов, а также вовремя не заплатившие за Интернет пользователи сказали бы за офлайн-версии некоторых сайтов "спасибо".
Один из возможных вариантов создания офлайновых версий сайтов основан на использовании формата CHM. CHM (или Microsoft HTML Help) — формат файлов справки Windows 98. Однако он оказался удачным не только для справочных систем приложений, но и для всевозможных учебников и документаций. В этом варианте сначала необходимо сохранить весь HTML, отдаваемый браузерам, в файлы, а потом вместе с картинками и CSS скомпилировать один-единственный CHM-файл. Такая процедура имеет ряд преимуществ:
при просмотре страницы имеют такой же вид, как и на сайте;
перед сохранением в файлы HTML-код не надо преобразовывать — и относительные пути, и пути от корня сервера будут обрабатываться корректно;
можно организовать поиск по тексту.
Конечно, имеется и ряд недостатков, среди которых можно отметить следующие:
когда читаешь документ CHM, непонятно, какой объем текста еще предстоит прочитать;
определенные трудности с печатью документа.
Однако самый главный недостаток — отсутствие компиляторов CHM, работающих под Linux. Это значит, что полной автоматизации при создании офлайновой версии добиться нельзя. На локальном компьютере с Windows нужно хранить копию сайта, компилировать CHM и закачивать его на сервер (выбирать Windows-хостинг только из-за возможности генерировать CHM-файлы особого смысла нет).
В связи с указанными недостатками логично подобрать для офлайновой версии другой формат. Один из возможных — PDF. Как следует из его названия (Portable Document Format), у пользователей любых компьютеров и операционных систем не должно быть проблем с чтением файлов PDF. Этот формат поддерживает ряд возможностей, которые в принципе позволяют сделать офлайн-версию сайтов. Файлы PDF могут содержать текстовую и графическую информацию, внутренние и внешние гиперссылки, закладки, позволяющие организовать древовидную систему разделов. Давайте посмотрим, как это все выглядит на практике.
Для работы с PDF-файлами в PHP есть интерфейс к библиотеке PDFlib. Однако этой библиотеки может не быть на сервере. Да и лицензия, по которой она распространяется, ограничивает ее применение. Из других вариантов можно отметить класс FPDF. Этот класс позволяет создавать PDF-файлы напрямую из PHP без дополнительных библиотек. Он содержит простейшие инструкции по выводу форматированного текста и графики. Например, вывести такую-то строку таким-то шрифтом, начиная с определенной позиции. К сожалению, никакого намека на поддержку HTML в FDPF нет. Однако примеры из документации работают правильно, и это не может не вдохновлять на дальнейшие поиски.
Чтобы использовать FPDF для наших целей, его нужно дополнить парсером HTML. Наиболее перспективной существующей разработкой оказалась HTML2FPDF 3.0 beta. Это расширение класса FPDF, дополняющее его парсером HTML, поддержкой картинок GIF (сам FPDF поддерживает только PNG и JPEG) и рядом других небольших улучшений. Однако на практике выяснилось, что это действительно beta. В исходном коде было найдено и исправлено достаточное количество багов, прежде чем скрипты заработали более-менее приемлемо.
Поговорим теперь об особенностях расширения HTML2FPDF. Заявлено, что оно поддерживает HTML и частично CSS, однако на самом деле эта поддержка очень ограничена:
CSS не поддерживается почти никак;
невнятная реализация концепта строчных и блочных боксов (display: inline; и display: block;), отсутствие плавающих (float) блоков, проблемы с тегом blockquote;
у картинок не обрабатывается атрибут align, то есть текст не может обтекать картинки;
нельзя изменить размер шрифта для отдельного участка в тексте (теги big и small).
Это означает, что исходный HTML нужно подвергнуть определенным преобразованиям: заменить такие теги, как small и blockquote на i. Однако здесь тоже не все так просто. Внутри строчного тега i не может находиться несколько параграфов — блочных тегов p (курсивом выделится только первый), поэтому содержимое каждого тега p из blockquote следует заключить в тег i.
Далее, поскольку мы собрались объединить в одном документе несколько статей, следует определенным образом разграничить внутренние ссылки на статьи в том же документе от внешних ссылок. Во-первых, все относительные пути в ссылках нужно превратить в пути, начинающиеся от корня веб-сервера. Значения атрибутов HREF во внутренних ссылках нужно заменить на #N, а заголовки статей разметить якорями:
. Для картинок, в отличие от ссылок, в атрибуты SRC нужно записать абсолютные пути, так как значения этих атрибутов будут передаваться функции fopen().
Еще нужно осветить вопрос о поддержке кириллицы. По умолчанию в FPDF поддерживается кодировка cp1252 для шрифтов Times, Arial, Courier. Однако использовать можно любой шрифт TrueType или Type1, причем поддержка кириллической кодировки cp1251 тоже имеется. Шрифт можно либо встроить в документ либо нет, рассчитывая на то, что он будет установлен у пользователя в системе.
Вкратце процедура добавления шрифтов заключается в следующем. При помощи утилиты ttf2pt1 из файлов шрифтов .ttf генерируются файлы с расширением .amf. Затем скриптом font/makefont/makefont.php (из папки с FPDF) из AMF-файлов создаются файлы с описанием шрифтов для FPDF с расширением .php, а также из .ttf — сжатые шрифты с расширением .z. Файл с расширением .php необходимо поместить в папку font в папке FPDF. Если туда же поместить и файл с расширением .z, тогда при создании PDF-файла шрифт будет встроен в него.
Следует отметить, что все необходимые файлы можно сгенерировать онлайн, используя сервис fPDF Font File Converter. Подробнее с тонкостями добавления новых шрифтов можно ознакомиться на сайте FPDF.
В конструкторе класса HTML2FPDF (функция HTML2FPDF() в файле html2fpdf.php) необходимо зарегистрировать каждый добавленный шрифт вызовом функции AddFont('FontName','','font.php'). Потом на этот шрифт можно переключаться функцией SetFont('FontName'). Если вы хотите изменить основной шрифт, поменяйте его название внутри всех вызовов функции SetFont() в файле html2fpdf.php. Не забывайте, что курсивный, полужирный и полужирный курсивный шрифты хранятся в отдельных файлах. Все эти файлы нужно добавлять в FPDF.
FPDF поддерживает закладки (bookmarks). Многоуровневые закладки позволяют с легкостью делать древовидное меню. Однако нужно учитывать одну деталь — русские символы должны быть в кодировке UTF-16.
В программах просмотра PDF-файлов обычно есть возможность поиска. К сожалению, Adobe Reader не может искать русский текст, но это проблемы исключительно данного продукта. В Foxit Reader, например, с поиском все в порядке.
Что касается быстродействия, то у рассматриваемого метода с ним не все в порядке. При большом объеме HTML и картинок время работы скрипта может превысить лимит в 30 секунд. Однако это не является непреодолимой трудностью, в случае необходимости можно прибегнуть к методу разделенных вычислений. Этот метод описан в книге Дмитрия Котерова "Самоучитель PHP 4", вкратце его суть заключается в выполнении небольшой части долгих вычислений и сохранении в файл промежуточных результатов после каждого обращения к страницам сайта.
В заключение приведем пошаговую инструкцию для тех, кто решит воспользоваться описанным здесь методом создания PDF-файлов на сервере из HTML.
Скачайте и установите класс FPDF, ознакомьтесь с ним, посмотрите, достаточно ли вам его возможностей. Он хорошо документирован, и к нему прилагаются примеры использования.
Для использования русского языка добавьте необходимые шрифты, как было описано выше. Чаще всего одного шрифта вроде Times будет вполне достаточно.
Скачайте архив с исправленными файлами HTML2FPDF и поместите их в директорию FPDF (файлы с совпадающими именами нужно заменить). В этом архиве есть файл pdfsite.php. Это работающий пример, создающий офлайновую версию сайта из нескольких документов согласно описанным здесь требованиям. Вы можете взять за основу этот пример и доработать его.
Предложенный метод автоматического создания документов PDF на сервере может быть использован не только для офлайновых версий сайтов, но и для подготовки прайс-листов, текстов договоров и других документов, которые будет распечатывать пользователь.
автор: Роман Парпалак
Опубликовал Kest
October 27 2008 09:44:26 ·
0 Комментариев ·
7553 Прочтений ·
• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •
Комментарии
Нет комментариев.
Добавить комментарий
Рейтинги
Рейтинг доступен только для пользователей.
Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.
Нет данных для оценки.
Гость
Вы не зарегистрированны? Нажмите здесь для регистрации.