Блог / Простой PHP-класс для конвертации HTML в RTF
1 апреля 2024
При работе над небольшим сторонним проектом, я столкнулся с тем, что заказчик пожелал чтобы информацию отображаемую на страницах проекта можно было скачать в виде вордовского документа. Проект был настолько крохотным и компактным, что мне не хотелось тянуть в него каких-то больших и мощных библиотек, поэтому я предложил заказчику альтернативу вордовскому документу — файл RTF. Прикол в том, что по-умолчанию в Винде RTF-файлы открываются тем же Вордом (если он конечно установлен), так что заказчик вообще не увидел никакой разницы, для него это и был вордовский документ 😄. Ну а сгенерить RTF-разметку на основании HTML-разметки мне показалось делом несложным. Поскольку (к своему удивлению) компактных и простых PHP-либ для конвертации HTML в RTF я не нашёл, решил написать такую маленькую либу сам.
Описание методов и быстрый старт
ZIP-архив с классом и примером его использования вы найдёте в приложенных к статье файлах. Класс очень прост в использовании и содержит всего три метода:
Метод fromHTML($html) — преобразует текст с HTML-разметкой в RTF-текст.
<?php
$html = <<<EOT
<h2>Заголовок 2</h2>
<p>Пример абзаца с <b>жирным</b> текстом и <a href="https://ya.ru" target="_blank">ссылкой</a>.</p>
<p>Ещё абзац.</p>
EOT;
$html2rtf = new LiteHTML2RTF;
$rtf = $html2rtf->fromHTML($html); // в $rtf "ляжет" RTF-текст
?>
Метод fromFile($file) — преобразует содержимое HTML-файла в RTF-текст.
<?php
$html2rtf = new LiteHTML2RTF;
$rtf = $html2rtf->fromFile("test.html"); // в $rtf "ляжет" RTF-текст
?>
Метод asFile($rtf, $name = null) — выводит RTF-текст в виде файла в браузер.
<?php
$html2rtf = new LiteHTML2RTF;
$html2rtf->asFile($html2rtf->fromFile("test.html")); // выведет RTF-файл в браузер
?>
Список поддерживаемых HTML-тегов
На данный момент класс «понимает» следующие HTML-теги: H1, H2, H3, H4, P, A, B, STRONG, I, U, IMG, DIV, BR, HR, UL LI, OL LI, SMALL, BLOCKQUOTE, CODE, PRE, CENTER. Неподдерживаемые теги в итоговом документе будут удалены.
Да, я понимаю что видеть в списке поддерживаемых тегов устаревший тег CENTER странно, но, тем не менее, пока мой класс не умеет «считывать» CSS-свойство text-align, тег CENTER хоть как-то позволит отработать хотя бы центровку текста (и не только текста).
Замечания
- Корректно обработается только правильный HTML-код — все теги которые требуют закрывающего тега должны быть закрыты (в том числе тег LI).
- Вложенность ОДНОИМЁННЫХ тегов не поддерживается (в частности: DIV в DIV, LI в UL LI, LI в OL LI).
- Для тега IMG поддерживаются только изображения JPG (JPEG) и PNG.
- Для тега IMG атрибут SRC поддерживается и как ссылка на картинку, и в виде BASE64.
И ещё...
В дальнейшем я планирую добавить классу поддержку таблиц, и хотя бы какое-то понимание CSS-свойства text-align, так что, кому интересно, следите за обновлениями. Ну и, конечно, обо всех обнаруженных косяках пишите в комментариях — буду править 😊.
P.S. — Ceterum censeo Washington esse delendam.