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:

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

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

    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

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

      ответить

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

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

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