Навигация
Главная
Поиск
Форум
FAQ's
Ссылки
Карта сайта
Чат программистов

Статьи
-Delphi
-C/C++
-Turbo Pascal
-Assembler
-Java/JS
-PHP
-Perl
-DHTML
-Prolog
-GPSS
-Сайтостроительство
-CMS: PHP Fusion
-Инвестирование

Файлы
-Для программистов
-Компонеты для Delphi
-Исходники на Delphi
-Исходники на C/C++
-Книги по Delphi
-Книги по С/С++
-Книги по JAVA/JS
-Книги по Basic/VB/.NET
-Книги по PHP/MySQL
-Книги по Assembler
-PHP Fusion MOD'ы
-by Kest
Professional Download System
Реклама
Услуги

Автоматическое добавление статей на сайты на Wordpress, Joomla, DLE
Заказать продвижение сайта
Программа для рисования блок-схем
Инженерный калькулятор онлайн
Таблица сложения онлайн
Популярные статьи
OpenGL и Delphi... 65535
Форум на вашем ... 65535
21 ошибка прогр... 65535
HACK F.A.Q 65535
Бип из системно... 65535
Гостевая книга ... 65535
Invision Power ... 65535
Пример работы с... 65535
Содержание сайт... 65535
ТЕХНОЛОГИИ ДОСТ... 65535
Организация зап... 65535
Вызов хранимых ... 65535
Создание отчето... 65535
Имитационное мо... 65535
Программируемая... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Реклама
Сейчас на сайте
Гостей: 17
На сайте нет зарегистрированных пользователей

Пользователей: 13,370
новичок: dogoco6
Новости
Реклама
Выполняем курсовые и лабораторные по разным языкам программирования
Подробнее - курсовые и лабораторные на заказ
Delphi, Turbo Pascal, Assembler, C, C++, C#, Visual Basic, Java, GPSS, Prolog, 3D MAX, Компас 3D
Заказать программу для Windows Mobile, Symbian

Моделирование регулировочного участка цеха на GPSS + Пояснительная записка
Моделирование литейного цеха на GPSS + Пояснительная записка
Поиск пути в графе заданном списками инцедентности на Turbo Pascal

Офлайн-версия сайта, или PDF и PHP
В некоторых случаях посетителям того или иного сайта было бы удобнее воспользоваться офлайн-версией, которую можно скачать на локальный компьютер. "Счастливые" обладатели модемов, а также вовремя не заплатившие за Интернет пользователи сказали бы за офлайн-версии некоторых сайтов "спасибо".

Один из возможных вариантов создания офлайновых версий сайтов основан на использовании формата 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 Комментариев · 7175 Прочтений · Для печати

• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •


Комментарии
Нет комментариев.
Добавить комментарий
Имя:



smiley smiley smiley smiley smiley smiley smiley smiley smiley
Запретить смайлики в комментариях

Введите проверочный код:* =
Рейтинги
Рейтинг доступен только для пользователей.

Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.

Нет данных для оценки.
Гость
Имя

Пароль



Вы не зарегистрированны?
Нажмите здесь для регистрации.

Забыли пароль?
Запросите новый здесь.
Поделиться ссылкой
Фолловь меня в Твиттере! • Смотрите канал о путешествияхКак приготовить мидии в тайланде?
Загрузки
Новые загрузки
iChat v.7.0 Final...
iComm v.6.1 - выв...
Visual Studio 200...
CodeGear RAD Stud...
Шаблон для новост...

Случайные загрузки
Факториал [Исходн...
De Knop
IIIDTrans
MPTools
PDPcheck
INSTANT BOOSTER v...
IPAddresseEdit
ActiveX в Delphi
Самоучитель C++
Программа для рис...
DateEdit
Delphi 6/7 базы д...
Медиа комбайн
Пример работы с р...
ScreenSaver [Исхо...
Задача о 8ми ладьях
Интерактивный инт...
Алгоритм DES шифр...
Работа с матрицами
FormShape [Исходн...

Топ загрузок
Приложение Клие... 100774
Delphi 7 Enterp... 97836
Converter AMR<-... 20268
GPSS World Stud... 17014
Borland C++Buil... 14191
Borland Delphi ... 10291
Turbo Pascal fo... 7374
Калькулятор [Ис... 5984
Visual Studio 2... 5207
Microsoft SQL S... 3661
Случайные статьи
Размещение прокси-...
Установка голубого...
Нарушение биполярн...
ГЛАВА 11. ПРОГРАМ...
Сосредоточение на ...
Эффективные разреш...
Мониторинг состоян...
Где бесплатно скач...
Работа в отрыве от...
Пространства имен ...
• Инициализация во...
Сигнализации новог...
6.6. Воздействие...
Служба поддержки -...
Спецификации MPEG-4
Игровые автоматы к...
Windows
Денежные слоты
Подключение файла-...
Варианты дисплея с...
SMB-подпись гарант...
Ввод программ
Язык С: типы членов
ОЦЕНКА НОВЫХ ВОЗМО...
Система воспроизве...
Статистика



Друзья сайта
Программы, игры


Полезно
В какую объединенную сеть входит классовая сеть? Суммирование маршрутов Занимают ли таблицы память маршрутизатора?