Офлайн-версія сайту, або pdf і - php - - сайт роману парпалака

Нещодавно я зробив офлайновую версію статей з written.ru. Технічно це pdf-файл розміром трохи більше мегабайта, який автоматично генерується на сервері. Включає тексти статей і малюнки до них. Оновлюється у міру появи нових статей. Нижче - подробиці про те, як це працює.

У деяких випадках відвідувачам того чи іншого сайту було б зручніше скористатися офлайн-версією, яку можна завантажити на локальний комп'ютер. «Щасливі» володарі модемів, а також вчасно не заплатили за інтернет користувачі сказали б за офлайн-версії деяких сайтів «спасибі».

Один з можливих варіантів створення офлайнових версій сайтів заснований на використанні формату CHM (див. Наприклад, замітку Дмитра Смирнова). CHM (або Microsoft HTML Help) - формат файлів довідки Windows 98. Однак він виявився вдалим не тільки для довідкових систем додатків, але і для всіляких підручників і документацій, яких розплодилося безліч. Хоча хлопці з Microsoft незабаром придумали для довідки інший формат, CHM вони підтримують досі. Також були створені програми, Новомосковскющіе CHM під Linux.

У цьому варіанті спочатку необхідно зберегти весь HTML, що віддають браузерам, в файли, а потім, разом з картинками і CSS, скомпілювати один-єдиний CHM-файл. Така процедура має ряд переваг:

Звичайно, є і ряд недоліків, до яких можна додати такі:

  • коли Новомосковскешь документ 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.

Ще потрібно висвітлити питання про підтримку кирилиці. За замовчуванням в 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 і - php - - сайт роману парпалака

Що стосується швидкодії, то у розглянутого методу з ним не все в порядку. При великому обсязі HTML (особливо, з картинками) час роботи скрипта може перевищити ліміт в 30 секунд. Однак це не є непереборною трудністю, в разі необхідності можна вдатися до методу розділених обчислень. Цей метод описаний в книзі Дмитра Котеровим «Самовчитель PHP 4», коротко його суть полягає у виконанні невеликої частини довгих обчислень і збереженні в файл проміжних результатів після кожного звернення до сторінок сайту.

На закінчення наведемо покрокову інструкцію для тих, хто вирішить скористатися описаним тут методом створення PDF-файлів на сервері з HTML.

Запропонований метод автоматичного створення документів PDF на сервері може бути використаний не тільки для офлайнових версій сайтів, але і для підготовки прайс-листів, текстів договорів та інших документів, які буде роздруковувати користувач.

Схожі статті