Офлайн-версия сайта, или PDF и PHP
Недавно я сделал офлайновую версию статей с written.ru. Технически это
В некоторых случаях посетителям того или иного сайта было бы удобнее воспользоваться
CHM
Один из возможных вариантов создания офлайновых версий сайтов основан на использовании формата CHM (см., например, заметку Дмитрия Смирнова). CHM (или Microsoft HTML Help) — формат файлов справки Windows 98. Однако он оказался удачным не только для справочных систем приложений, но и для всевозможных учебников и документаций, которых расплодилось великое множество. Хотя ребята из Microsoft вскоре придумали для справки другой формат, CHM они поддерживают до сих пор. Также были созданы программы, читающие CHM под Linux.
В этом варианте сначала необходимо сохранить весь HTML, отдаваемый браузерам, в файлы, а потом, вместе с картинками и CSS, скомпилировать
- при просмотре страницы имеют такой же вид, как и на сайте;
- перед сохранением в файлы
HTML-код не надо преобразовывать — и относительные пути, и пути от корня сервера будут обрабатываться корректно; - можно организовать поиск по тексту.
Конечно, имеется и ряд недостатков, к которым можно добавить следующие:
- когда читаешь документ CHM, непонятно, какой объем текста еще предстоит прочитать;
- определенные трудности с печатью документа.
Однако самый главный недостаток — отсутствие компиляторов CHM, работающих под Linux. Это значит, что полной автоматизации при создании офлайновой версии добиться нельзя. На локальном компьютере с Windows нужно хранить копию сайта, компилировать CHM и закачивать его на сервер (выбирать
В связи с указанными недостатками логично подобрать для офлайновой версии другой формат. Один из возможных — PDF. Как следует из его названия (Portable Document Format), у пользователей любых компьютеров и операционных систем не должно быть проблем с чтением файлов PDF. Этот формат поддерживает ряд возможностей, которые в принципе позволяют сделать
Для работы с
Чтобы использовать 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.
Далее, поскольку мы собрались объединить в одном документе несколько статей, следует определенным образом разграничить внутренние ссылки на статьи в том же документе от внешних ссылок.
Еще нужно осветить вопрос о поддержке кириллицы. По умолчанию в FPDF поддерживается кодировка cp1252 для шрифтов Times, Arial, Courier. Однако использовать можно любой шрифт TrueType или Type1, причем поддержка кириллической кодировки cp1251 тоже имеется. Шрифт можно либо встроить в документ, либо нет, рассчитывая на то, что он будет установлен у пользователя в системе.
Вкратце процедура добавления шрифтов заключается в следующем. При помощи утилиты ttf2pt1 из файлов шрифтов .ttf генерируются файлы с расширением .amf. Затем скриптом font/makefont/makefont.php (из папки с FPDF) из
Следует отметить, что все необходимые файлы можно сгенерировать онлайн, используя сервис fPDF Font File Converter. Подробнее с тонкостями добавления новых шрифтов можно ознакомиться на сайте FPDF.
В конструкторе класса HTML2FPDF (функция HTML2FPDF() в файле html2fpdf.php) необходимо зарегистрировать каждый добавленный шрифт вызовом функции AddFont('FontName','','font.php'). Потом на этот шрифт можно переключаться функцией SetFont('FontName'). Если вы хотите изменить основной шрифт, поменяйте его название внутри всех вызовов функции SetFont() в файле html2fpdf.php. Не забывайте, что курсивный, полужирный и полужирный курсивный шрифты хранятся в отдельных файлах. Все эти файлы нужно добавлять в FPDF.
FPDF поддерживает закладки (bookmarks). Многоуровневые закладки позволяют с легкостью делать древовидное меню. Однако нужно учитывать одну деталь — русские символы должны быть в кодировке
В программах просмотра
Что касается быстродействия, то у рассматриваемого метода с ним не всё в порядке. При большом объеме HTML (особенно, с картинками) время работы скрипта может превысить лимит в 30 секунд. Однако это не является непреодолимой трудностью, в случае необходимости можно прибегнуть к методу разделенных вычислений. Этот метод описан в книге Дмитрия Котерова «Самоучитель PHP 4», вкратце его суть заключается в выполнении небольшой части долгих вычислений и сохранении в файл промежуточных результатов после каждого обращения к страницам сайта.
В заключение приведем пошаговую инструкцию для тех, кто решит воспользоваться описанным здесь методом создания
- Скачайте и установите класс FPDF, ознакомьтесь с ним, посмотрите, достаточно ли вам его возможностей. Он хорошо документирован, и к нему прилагаются примеры использования.
- Для использования русского языка добавьте необходимые шрифты, как было описано выше. Чаще всего одного шрифта вроде Times будет вполне достаточно.
- Изменения и исправления. В HTML2FPDF используется не оригинальный, а измененный класс FPDF. Но последняя версия HTML2FPDF — «бета», выпущенная в 2005 году. Мне пришлось исправить некоторые ошибки как в самом расширении HTML2FPDF, так и в дополнениях к FPDF, сделанных автором этого расширения. Скачайте архив с исправленными файлами HTML2FPDF и поместите их в директорию FPDF (файлы с совпадающими именами нужно заменить). В этом архиве есть файл pdfsite.php. Это работающий пример, создающий офлайновую версию сайта из нескольких документов согласно описанным здесь требованиям. Вы можете взять за основу этот пример и доработать его.
Предложенный метод автоматического создания документов PDF на сервере может быть использован не только для офлайновых версий сайтов, но и для подготовки
Комментарии
нехватает тока утф
Оставьте свой комментарий