Как создать PDF из HTML, используя SnappyBundle (wkhtmltopdf) в Symfony 3

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

Альтернативой генерируемым на стороне сервера диаграммам является создание диаграмм с помощью Javascript (на стороне клиента). Существует множество библиотек Javascript, которые позволяют создавать необычные диаграммы, и вы можете извлечь их SVG (или изображение base64) и вернуть их на сервер, чтобы включить их в качестве изображения в PDF-файл. Звучит хорошо и функционально, однако у этого решения есть недостаток. SVG изменится и вызовет проблемы с размерами позже в вашем PDF в соответствии с разрешением монитора вашего пользователя или размерами окна браузера.

Некоторые веб-приложения, как решение, сгенерирует HTML-представление как ответ в браузере (который будет отображать ваши модные диаграммы), и пользователь должен будет использовать (и знать, как) браузер для сохранения (или печати) содержимого в формате PDF. Однако, как пользователь, вы можете просто захотеть скачать PDF одной кнопкой, выбрать, где вы хотите сохранить его, и все. Не так ли легко справиться с библиотеками, как TCPDF?

Проблемы везде, но вот где wkhtmltopdf Это очень удобно, так как вы сможете писать CSS, HTML и Javascript так же, как на веб-сайте (с некоторыми минимальными ограничениями), и ваш PDF будет выглядеть потрясающе.

В этой статье вы узнаете, как реализовать SnappyBundle в вашем проекте Symfony 3 и как создавать PDF-файлы различными способами.

Требования

Тебе понадобиться wkhtmltopdf доступно в вашей системе и доступно в командной строке. wkhtmltopdf — это инструмент командной строки для рендеринга HTML в PDF и различные форматы изображений с использованием движка рендеринга Qt WebKit. Они работают полностью «без головы» и не требуют отображения или обслуживания дисплея.

  • Окна: Вы можете скачать установщик для каждой архитектуры (x86 и x64) в площадь установки. Хотя вы можете изменить путь к исполняемому файлу wkhtmltopdf позже в файле config.yml, желательно иметь wkhtmltopdf доступно как переменная среды в вашей системе (если вы не хотите создавать переменную среды для wkhtmltopdf, вы можете указать полный путь к исполняемому файлу позже). Вы можете прочитайте, как создать переменные окружения в окнах в этой статье.
  • Debian / Ubuntu: Вы можете установить дистрибутив из wkhtmltopdf непосредственно в консоли, используя следующую команду:
$ sudo apt-get install wkhtmltopdf

Посетить домашняя страница wkhtmltopdf для получения дополнительной информации здесь.

1) Установка и настройка SnappyBundle

кусачий Сам по себе является оболочкой PHP (5.3+) для утилиты преобразования wkhtmltopdf. Он позволяет вам генерировать файлы PDF или изображения из ваших HTML-документов, используя движок webkit. KnpSnappyBundle обеспечивает простую интеграцию для вашего проекта Symfony.

Чтобы установить SnappyBundle в свой проект, выполните следующую команду composer:

composer require knplabs/knp-snappy-bundle

Или добавьте вручную добавление имени пакета в файл composer.json и затем выполните composer install:

{
"require": {
"knplabs/knp-snappy-bundle": "~1.4"
}
}

Когда загрузка будет завершена, включите пакет, добавив следующую строку в ваше ядро:

$bundles = [
//..//
new Knp\Bundle\SnappyBundle\KnpSnappyBundle(),
];      

Наконец, вам просто нужно добавить базовую конфигурацию в ваш config.yml файл, обеспечивающий и разрешающий двоичный путь wkhtmltopdf.

Обратите внимание, что, как упоминалось ранее, для работы SnappyBundle требуется wkhtmltopdf, поэтому перед использованием его необходимо указать в двоичном параметре config.yml полный путь к исполняемому файлу wkhtmltopdf, иначе вы столкнетесь с одной из самых известных ошибок:

Код состояния выхода ‘1’ говорит о том, что что-то пошло не так: stderr: «» stdout: «»

Двоичный путь в Windows

При использовании установщика по умолчанию (и параметров установки по умолчанию) wkhtmltopdf в программных файлах вашего основного раздела должна быть папка wkhtmltopdf / bin, в которой находится исполняемый файл wkhtmltopdf, поэтому вам нужно указать путь только в следующем примере.

Однако, если вы использовали пользовательскую установку, просто измените путь на новый, содержащий исполняемый файл wkhtmltopdf в binary имущество.

# Windows configuration
knp_snappy:
pdf:
enabled:    true
# If you have wkhtmltopdf as an environment variable you don't need to provide the
# full path to the executable, use it in the same way as you use in the console
#binary:  "wkhtmltopdf"
binary:     "\"C:\\Program Files\\wkhtmltopdf\\bin\\wkhtmltopdf.exe\""
options:    []
image:
enabled:    true
binary:     "\"C:\\Program Files\\wkhtmltopdf\\bin\\wkhtmltoimage.exe\""
options:    []

Двоичный путь в Linux / Unix, как

Если вы установили wkhtmltopdf с помощью метода apt-get, пути, вероятно, следующие:

# app/config/config.yml
knp_snappy:
pdf:
enabled:    true
binary:     /usr/local/bin/wkhtmltopdf
options:    []
image:
enabled:    true
binary:     /usr/local/bin/wkhtmltoimage
options:    []

Как изменить настройки генерации PDF

Вы можете динамически изменять настройки по умолчанию в файле config.yml:

# config.yml
knp_snappy:
pdf:
enabled:    true
binary:     "wkhtmltopdf"
options:
no-outline: true
page-size: LETTER
# Recommended to set UTF-8 as default encoding :)
encoding: UTF-8

Или динамически в вашем контроллере (или сервисе и т. Д.), Используя PHP с методом setOption snappy:

$snappy = $this->get('knp_snappy.pdf');
$snappy->setOption('no-outline', true);
$snappy->setOption('page-size','LETTER');
$snappy->setOption('encoding', 'UTF-8');

Вы можете увидеть полный список всех параметров, доступных для wkhtmltopdf в этом документе.

Изменить путь кеша генерации PDF-файлов

Снейппи использует sys_get_temp_dir() Метод по умолчанию, чтобы получить папку временных файлов системы для сохранения PDF-файлов, однако вы можете изменить путь, который вы хотите изменить, с помощью свойства временные_фолдеры:

# app/config/config.yml
knp_snappy:
temporary_folder: %kernel.cache_dir%/snappy

В предыдущем примере была выбрана папка в папке кэша вашего проекта SF3 (var / cache / snappy).

2) Примеры

Рендеринг PDF с веб-адреса

Следующий пример отобразит домашнюю страницу «Наш мир кода» в формате PDF:

get('knp_snappy.pdf');
$filename = 'myFirstSnappyPDF';
$url = 'http://site.com';
return new Response(
$snappy->getOutput($url),
200,
array(
'Content-Type'          => 'application/pdf',
'Content-Disposition'   => 'inline; filename="'.$filename.'.pdf"'
)
);
}
}

Рендеринг PDF из URL проекта (маршрутизация Symfony)

С 2 маршрутами в этом примере:

sandbox_homepage:
path:     /
defaults: { _controller: sandboxBundle:Default:index }
sandbox_pdfexample:
path:     /pdf-example
defaults: { _controller: sandboxBundle:Default:pdf }

И контроллер:

render('sandboxBundle:Default:index.html.twig',[
]);
}
/**
*  Render in a PDF the sandbox_homepage URL
* @return Response
*/
public function pdfAction()
{
$snappy = $this->get('knp_snappy.pdf');
$filename = 'myFirstSnappyPDF';
// use absolute path !
$pageUrl = $this->generateUrl('sandbox_homepage', array(), UrlGeneratorInterface::ABSOLUTE_URL);
return new Response(
$snappy->getOutput($pageUrl),
200,
array(
'Content-Type'          => 'application/pdf',
'Content-Disposition'   => 'inline; filename="'.$filename.'.pdf"'
)
);
}
}

Замечания: хост, который используется при генерации абсолютного URL, автоматически определяется с использованием текущего объекта запроса. При создании абсолютных URL-адресов вне веб-контекста (например, в консольной команде) это не работает. Увидеть Как сгенерировать URL из консоли чтобы узнать, как решить эту проблему.

Визуализация PDF из HTML в виде ветки

get('knp_snappy.pdf');
$html = $this->renderView('sandboxBundle:Default:template.html.twig', array(
//..Send some data to your view if you need to //
));
$filename = 'myFirstSnappyPDF';
return new Response(
$snappy->getOutputFromHtml($html),
200,
array(
'Content-Type'          => 'application/pdf',
'Content-Disposition'   => 'inline; filename="'.$filename.'.pdf"'
)
);
}
}

Вернуть PDF ответ для просмотра в браузере

get('knp_snappy.pdf');
$html = 'Hello';
$filename = 'myFirstSnappyPDF';
return new Response(
$snappy->getOutputFromHtml($html),
200,
array(
'Content-Type'          => 'application/pdf',
'Content-Disposition'   => 'inline; filename="'.$filename.'.pdf"'
)
);
}
}

Вернуть ответ в формате PDF в виде вложения (скачать ответ)

get('knp_snappy.pdf');
$html = 'Hello';
$filename = 'myFirstSnappyPDF';
return new Response(
$snappy->getOutputFromHtml($html),
200,
array(
'Content-Type'          => 'application/pdf',
'Content-Disposition'   => 'attachment; filename="'.$filename.'.pdf"'
)
);
}
}

Базовый пример основных функций (и преимуществ) wkhtmltopdf

Работайте так же, как в браузере, wkhtmltopdf будет отвечать за преобразование этого в PDF. В этом примере мы собираемся сгенерировать PDF с некоторыми базовыми функциями, такими как использование javascript, svg и т. Д.

{{title}}

This is my awesome first PDF generated using Snappy in my Symfony 3 project.

UTF-8 Test : κ?σμε

Image :

SVG Example :

Canvas Example with Javascript:

document.getElementById("dinamic-content").innerHTML = 'This string has been appended using javascript'; // Draw circle on canvas var c = document.getElementById("myCanvas"); var ctx = c.getContext("2d"); ctx.beginPath(); ctx.arc(100,75,50,0,2*Math.PI); ctx.stroke();

Мы собираемся вернуть сгенерированный PDF в браузер с простым контроллером:

get('knp_snappy.pdf');
$html = $this->renderView('sandboxBundle:Default:template.html.twig', array(
'title' => 'Hello World !'
));
$filename = 'myFirstSnappyPDF';
return new Response(
$snappy->getOutputFromHtml($html),
200,
array(
'Content-Type'          => 'application/pdf',
'Content-Disposition'   => 'inline; filename="'.$filename.'.pdf"'
)
);
}
}

И вывод PDF должен выглядеть так:

SnappyBundle PDF с точки зрения ветки - JavaScript

Выводы

  • Вам нужен wkhtmltopdf, установленный на вашем компьютере. Snappy — это просто оболочка, которая упрощает создание PDF-файлов с помощью нескольких строк PHP. Если вы не знакомы с установочными установками, вы можете использовать «портативную» версию в своем проект, использующий wkhtmltopdf как зависимость от композитора.
  • wkhtmltopdf позволяют вам создавать изображения (скриншоты) из веб-URL (или обычного HTML), и SnappyBundle имеет включенную обертку для этого, узнать больше об этой функции в документации.
  • Благодаря wkhtmltopdfвы можете использовать Javascript для изменения содержимого HTML для создания PDF, что очень удобно для отображения диаграмм или графики в PDF с клиентским кодом (такие библиотеки, как Highcharts, D3.js и т. д.).

Повеселись !

Ссылка на основную публикацию
Adblock
detector