adsPlace_1

Войти или Зарегистрироваться

adsPlace_3

Конвертируем HTML в PDF

Конвертируем HTML в PDF

Формат PDF все больше набирает обороты. Выставление счета в интернет магазине, создание отчётов и презентаций — это далеко не весь список, где полным ходом используется документы в формате PDF. Но иногда, у web-мастеров, возникают проблемы при конвертации html в pdf.

Сегодня рассмотрим небольшой пример, как конвертировать код HTML в формат PDF.

На сегодня, в сети уже можно найти довольно много готовых классов для конвертации HTML в PDF. Все они имеют свои плюсы и недостатки.

В данном примере, мы будем использовать готовый класс domPDF.

Dompdf — класс написанный на PHP 5 для преобразования HTML в PDF.

Из плюсов Dompdf, стоит отметить:

  • Окрытый исходный код
  • Понимает большинство тегов html 4
  • Поддержка css форматирования.
  • Подерживает изображения (png, gif и jpeg)
  • Отображает якорные и обычные ссылки

НО есть минус! Отсутствует поддержка кириллицы.

Решение проблемы описано ниже. Так что можно приступать.

Для начала, нам нужна сама библиотека.

Теперь подключаем библиотеку в наш скрипт:

require_once("dompdf/dompdf_config.inc.php");

Код html для примера будет самым простым:

$html =
  '<html><body>'.
  '<p>Put your html here, or generate it with your favourite '.
  'templating system.</p>'.
  '</body></html>';

Вот и сам пример с комментариями:

$dompdf = new DOMPDF();// Создаем обьект
$dompdf->load_html($html); // Загружаем в него наш html код
$dompdf->render(); // Создаем из HTML PDF
$dompdf->stream('mypdf.pdf'); // Выводим результат (скачивание)

Для загрузки html-кода из файла, необходимо считать его содержимое в переменную:

$html = file_get_contents('ПУТЬ_К_ФАЙЛУ');

Можно и не выводить файл для скачки, например, если нужно его сохранить или записать в переменную. Для этого нужно убрать метод stream и выполнить метод output c параметром 0:

$mypdf = $dompdf->output(0); // Запишет наш pdf файл в переменную строкой

А чтобы в наш pdf вставить изображение с абсолютным адресом, поменяйте в файле «dompdf/dompdf_config.inc.php» строчку

def("DOMPDF_ENABLE_REMOTE", false);
// НА
def("DOMPDF_ENABLE_REMOTE", true);

Теперь решим проблему с шрифтами в domPDF. Скачайте архив с шрифтами, распакуйте, и закиньте в папку lib с заменой. Проблема решена!

UPD Если проблемы с русским языком остались, то попробуйте явно указать тип кодировки:

$html =
'<html><meta http-equiv="content-type" content="text/html; charset=utf-8" /><body>'.
'<p>Теперь решим проблему с шрифтами в domPDF!</p>'.
'</body></html>';

UPD2 Скачать рабочую версию можно по этой ссылке.

Более подробная документация Dompdf на GitHub:

Последние из рубрики

Комментарии(44)

    1. Аватар пользователя Макс

      Макс

      17:04 08.05.2012

      Проблема с шрифтами не решена.
      Сделал как написано и все равно белеберда.
      кодировка utf-8.
      что я делаю не так?

      ответить
      • Аватар пользователя Максим Никифоров

        Максим Никифоров

        20:00 08.05.2012

        Смотрите обновление статьи внизу. Будут вопросы, задавайте.

        ответить
    2. Аватар пользователя Павел

      Павел

      19:03 26.05.2012

      Загрузил последнию версию DOMPDF 0.6.0 beta 3, заменил шрифты, строка

      — есть, но как была проблема, так она и осталась… весь интернет перерыл, но так и не нашёл реального решения проблемы с кодировкой… ((

      была попавшись старая версия DOMPDF с решённой проблемой — кодировки — работала, но куча проблем с таблицами…, которых нет в DOMPDF 0.6

      Помогите, плиз…

      ответить
      • Аватар пользователя Максим Никифоров

        Максим Никифоров

        00:31 27.05.2012

        У меня работает на ура. Проверьте кодировку самого файла, он может быть записан в ANCII, а должен в UTF-8. Откройте Ваш файл в notepad++ и в меню «Кодировка» нажмите преобразовать в UTF8(без BOM). Должно помочь.

        ответить
    3. Аватар пользователя Kotaries

      Kotaries

      04:55 27.07.2012

      У меня после того как я делаю замену папки fonts вместо ПДФки выдается тупо содержимое какого-то пхп файла:

      array ( 'sans-serif' =&gt; array ( 'normal' =&gt; DOMPDF_FONT_DIR . 'Helvetica', 'bold' =&gt; DOMPDF_FONT_DIR . 'Helvetica-Bold', 'italic' =&gt; DOMPDF_FONT_DIR . 'Helvetica-BoldOblique', 'bold_italic' =&gt; DOMPDF_FONT_DIR . 'Helvetica-BoldOblique', ), 'times' =&gt; array ( 'normal' =&gt; DOMPDF_FONT_DIR . 'Times-Roman', 'bold' =&gt; DOMPDF_FONT_DIR . 'Times-Bold', 'italic' =&gt; DOMPDF_FONT_DIR . 'Times-BoldItalic', 'bold_italic' =&gt; DOMPDF_FONT_DIR . 'Times-BoldItalic', ), 'times-roman' =&gt; array ( 'normal' =&gt; DOMPDF_FONT_DIR . 'Times-Roman', 'bold' =&gt; DOMPDF_FONT_DIR . 'Times-Bold', 'italic' =&gt; DOMP
      

      и там еще много таких буковок…пипец полный, заказ горит, я хз че делать.

      ответить
    4. Аватар пользователя Алексей

      Алексей

      12:38 29.07.2012

      Почему то все равно идут знаки вопросов вместо русских символов. Использовал последний архив. Что не так может быть? Что нужно и где изменить, чтобы отобразился нормальный текст?

      ответить
      • Аватар пользователя Максим Никифоров

        Максим Никифоров

        23:02 29.07.2012

        Попробуйте задать кодировку страницы с помощью php:

        header('Content-Type: text/html; charset=utf-8')

        Если Вы используете денвер, тогда поменяйте стандартную кодировку в файле php.ini (параметр default_charset)

        ответить
        • Аватар пользователя Алексей

          Алексей

          06:10 30.07.2012

          Добавление строчки: header(‘Content-Type: text/html; charset=utf-8′), не помогает все также идут знаки вопросов. Используется, к сожалению не денвер… и где этот файл(php.ini) я к сожалению не знаю… Через какой модуль Вы используете генератор PDF? может быть дело в нем? Я для этого использую Print
          (http://drupal.org/project/print)

          ответить
          • Аватар пользователя Максим Никифоров

            Максим Никифоров

            08:23 30.07.2012

            В некоторых хостингах разрешено править php.ini с админ. панели.
            В файле dompdf/dompdf_config.inc.php в строке 329 попробуйте поставить кодировку UTF-8

            ответить
      • Аватар пользователя Alex

        Alex

        23:52 15.01.2013

        Спасибо автору. С его архивом заработало. Правда пришлось повозиться. После установки архива всеравно ???????. Хотя тестовый index.php выдавал нормальную кирилицу. Оказалась проблема в том что мой файл , который конвертится в ПДФ , подгружал таблицу CSS , в которой подключались шрифты — верданы, ариалы и т.д. Как только убрал эти шрифты все заработало. Вывод — проверяйте использует ли ваш файл свои шрифты.

        ответить
    5. Аватар пользователя Алексей

      Алексей

      08:47 30.07.2012

      В этой строке и так стоит UTF-8. Печально…ну буду пытаться найти файл и искать помехи в нем…

      ответить
      • Аватар пользователя Алексей

        Алексей

        07:20 31.07.2012

        default_charset = «iso-8859-1»
        есть возможность не меняя этого сохранить текст с русскими символами?

        ответить
        • Аватар пользователя Максим Никифоров

          Максим Никифоров

          08:02 31.07.2012

          Попробуйте поменять на utf-8. Если не подойдет то поменяете обратно.

          ответить
    6. Аватар пользователя Макс

      Макс

      10:47 05.11.2012

      Решение для версии 0.6 beta 3
      У меня заработало

      ответить
    7. Аватар пользователя Serik

      Serik

      12:53 04.06.2013

      Добрый день!

      НЕ получается вставить изображение. Поменял

      def("DOMPDF_ENABLE_REMOTE", false);
      // НА
      def("DOMPDF_ENABLE_REMOTE", true);

      Пробовал адрес от сервера ‘var/www/domain/images/image.png’.

      Пишеть в pdf файле «Image not readable or empty»

      ответить
      • Аватар пользователя Никифоров Максим

        Serik,
        Используйте адрес изображения относительный файла скрипта по созданию файла pdf или прямой адрес (http://сайт/images/image.png)

        ответить
        • Аватар пользователя Serik

          Serik

          11:44 05.06.2013

          Никифоров Максим,
          Спасибо за ответ. Изображение передается но не правильно, пишет: «Шрифт imes содержит не правильный BBox», картинка пустая, кликабельная урл не правильный.

          ответить
        • Аватар пользователя Serik

          Serik

          12:13 05.06.2013

          Никифоров Максим,
          Нашел ответ, может кому то поможет, абсолютным урл не получилось, сделал относительным так:

          /var/www/****/data/www/domian/images/image.jpg
          ответить
    8. Аватар пользователя Виктория

      Виктория

      14:58 28.08.2013

      Огромное спасибо за статью!!! мучилась неделю с русскими шрифтами.
      По вашей статье — загрузка шрифтов и мета не помогли, а вот загрузка рабочей версии все починила.

      ответить
    9. Аватар пользователя Игорь

      Игорь

      16:53 08.10.2013

      Всё работает, спасибо

      ответить
    10. Аватар пользователя Video-VV

      Video-VV

      02:37 12.11.2013

      У меня заработало, но как-то странно, подгружается в файл PDF только шрифт TimesNewRomanPSMT (который в папке fonts имеет название php_times.ufm и его вариации).
      Типа :

      <p> Пример текста</p>

      Или так:

      <p style="font-family:serif"> Пример текста</p>

      А вот например, указывая в HTML коде типа

      <p style="font-family:sans-serif"> Пример текста</p>

      получаю в файле PDF подставной шрифт Helvetica и вместо текста вопросики :(
      Вопрос только times (serif) в кириллице работает в данной библиотеке ?

      ответить
    11. Аватар пользователя Виталий

      Виталий

      13:03 25.12.2013

      Вопрос в следующем, переключаю в скрипте php на true, но когда начинаю подключать php и mysql скрипт отказывается работать и ругается. Подскажите как можно решить проблему?

      ответить
    12. Аватар пользователя Роман

      Роман

      17:59 14.01.2014

      Если в исходном html подключен файл стилей, то в pdf файле эти стили не отображаются. Приходится копировать стили в html. Как это исправить?

      ответить
    13. Аватар пользователя 3.14rate

      3.14rate

      19:01 03.02.2014

      А как быть с динамическим содержимым и с циклами for их же в переменную не занесешь?

      ответить
      • Аватар пользователя Максим Никифоров

        3.14rate, а что мешает собрать html шаблон с использованием циклов?

        $html ='<html><body>';
         
        for(i=0;i<=10;i++){
        $html .='<p>Put your html here, or generate it with your favourite</p>';
        } 
          
        $html .='</body></html>';
        
        ответить
        • Аватар пользователя Алексей

          Алексей

          16:55 28.02.2016

          Максим Никифоров, Добрый день … подскажите пожалуйста

          foreach($ar as $ar_colls){
          $odin = $ar_colls[0];
          $dva = $ar_colls[1];
          $tri = $ar_colls[2];
          $chet = $ar_colls[3];
          
          if (empty($dva)&& empty($tri)&& empty($chet)){
          	$html .= '';
          	$html .= '$odin';  <----- Тут должен быть вывод переменной
          	$html .= '' . "\n" ;
          		}
          

          Не могу вывести значение переменной ((( Жду помощи… Спасибо заранее!!!

          ответить
          • Аватар пользователя Максим Никифоров

            Алексей, замените одинарные кавычки на двойные или уберите их вообще

            $html .= $odin;  <----- Тут должен быть вывод переменной
            
            ответить
    14. Аватар пользователя Дмитрий

      Дмитрий

      23:51 24.03.2014

      Здравствуйте.
      Есть html форма, которую заполняет пользователь. При нажатии кнопки должен сгенерироваться pdf файл. Но на выходе он поврежден. Пример кода после формы:

      <?php
      if (isset($_POST['button']))
          {
              require_once("dompdf/dompdf_config.inc.php");    
      
              $html =
              '<html><meta http-equiv="content-type" content="text/html; charset=windows-1251" /><body><form>'.
              '<p>Договор:</p>'.
              '</form></body></html>';
      
              $dompdf = new DOMPDF();// 
              $dompdf->load_html($html); 
              $dompdf->render(); 
              $dompdf->stream('pdf.pdf'); 
          }
      ?>
      ответить
    15. Аватар пользователя danil

      danil

      20:32 08.06.2014

      помогите не как не могу загрузить картинку в файл pdf все сделал как написано выше. пробовал менять адрес не к чему не привело. в файле на месте картинки квадратик

      ответить
    16. Аватар пользователя Alex

      Alex

      19:01 01.03.2015

      здравствуйте, скачал и подключил все как написано тут но не работает ((( помогите пишет Unable to stream pdf: headers already sent

      ответить
    17. Аватар пользователя Юзер

      Юзер

      22:55 03.02.2016

      Пипец сегодня перерыл инета, пока сюда не прибрел — только этот архив с содержимым помог исправить ситуацию с кракозябрами.
      СПАСИБО!

      ответить
    18. Аватар пользователя Константин

      Константин

      21:55 24.02.2016

      как сохранить pdf в файл?

      ответить
    19. Аватар пользователя Alex

      Alex

      22:23 09.06.2016

      Добрый день!
      Подскажите пожалуйста как отправить сгенирированный файл (положенный в переменную по примеру статьи) по почте ? то есть я само пиьсмо в обработчике php делаю pdf и хочу отправить файлом приложения к присьму — просто аттачмент у меня почему не отправляет — пишет или пусто, или пустое имя или нету файла что отправлять

      ответить
    20. Аватар пользователя Илья

      Илья

      11:55 16.06.2016

      Спасибо! Проблему с русским языком решил путем использования рабочей версии и добавлением

      <meta http-equiv="content-type" content="text/html; charset=utf-8" />

      в html документ

      ответить
    21. Аватар пользователя Роман

      Роман

      14:39 24.06.2016

      Текст в pdf получается только шрифтом Times (ну или очень на него похожим)
      Почему?

      ответить
    22. Аватар пользователя адексей

      адексей

      09:15 31.08.2016

      При выполнении команды:
      $output = $dompdf->output();
      file_put_contents(«pdf/123.pdf», $output);
      Получаю файл pdf размером 800кб. А хотелось бы в 10 раз меньше.
      Подскажите как включить сжатие?!

      ответить
    23. Аватар пользователя Дмитрий

      Дмитрий

      17:58 13.11.2016

      Ура! На с рабочей версией на Битриксе заработало!

      ответить
    24. Аватар пользователя Emil

      Emil

      13:23 20.01.2017

      Спасибо автору статьи, работает отлично, из довольно сложной таблицы с кириллицей, получилось генерить pdf , по виду такой же как и в браузере. !

      ответить
    25. Аватар пользователя Александр

      Александр

      14:06 18.02.2017

      Супер.
      Скачал все работает.
      Спасибо.

      ответить
    26. Аватар пользователя Anuar

      Anuar

      11:07 28.09.2017

      Нельзя ли сделать так что бы он брал с другого файла только лишь определнные вещи которые находять в одном классе? На битриксе работаю вот надо что новости каждые конвертировались в пдф и снизу ссылка была скачать? как такое чудо осуществить?

      ответить
    27. Аватар пользователя Азамат Сарсенов

      Здравствуйте, кто может помочь установить это на мой сайт?

      ответить

    Оставь свой отзыв

    Для вставки кода используйте кнопки php, html, javascript, css, sql

    * - поля обязательны к заполнению