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