O que é o KnpSnappyBundle?
O KnpSnappyBundle é uma biblioteca necessária para permitir que o Symfony gere arquivos PDF e outros formatos de arquivo dinamicamente a partir do conteúdo do seu aplicativo. É baseado na biblioteca Snappy que é uma interface para uma série de ferramentas de linha de comando que podem gerar PDFs e outros tipos de arquivos a partir de HTML ou URLs.
Como instalar o KnpSnappyBundle no Symfony?
Instalar o KnpSnappyBundle no Symfony é um processo simples. Primeiro, você precisa adicionar a biblioteca KnpSnappyBundle ao seu projeto, executando o seguinte comando:
composer require knplabs/knp-snappy-bundle
Em seguida, você precisa adicionar o pacote ao arquivo de configuração src/Kernel.php, o que informará o Symfony que o pacote deve ser inicializado com seu aplicativo:
public function registerBundles()
{
$bundles = [
new KnpBundleSnappyBundleKnpSnappyBundle(),
];
return $bundles;
}
Como usar o KnpSnappyBundle?
Para usar o KnpSnappyBundle, você deve instanciar o serviço de renderizador do KnpSnappyBundle na ação do controlador que deseja renderizar em PDF. Você pode então usar esse serviço para gerar seu PDF.
public function generatePdfAction()
{
$snappy = $this->get('knp_snappy.pdf');
$html = $this->renderView('pdf_template.html.twig', [
'title' => 'My PDF',
'content' => 'This is my PDF content',
]);
$filename = sprintf('my_pdf_%s.pdf', date('Y-m-d'));
return new Response(
$snappy->getOutputFromHtml($html),
200,
[
'Content-Type' => 'application/pdf',
'Content-Disposition' => sprintf('attachment; filename="%s"', $filename),
]
);
}
Como renderizar em outros tipos de arquivos?
Além de PDF, o KnpSnappyBundle pode ser usado para renderizar em outros tipos de arquivos, como JPG, PNG e HTML. Para renderizar em JPG ou PNG, basta alterar o tipo Content-Type. Para renderizar em HTML, use o método getOutput() ao invés de getOutputFromHtml().
public function generateImageAction()
{
$snappy = $this->get('knp_snappy.image');
$html = $this->renderView('pdf_template.html.twig', [
'title' => 'My Image',
'content' => 'This is my image content',
]);
$filename = sprintf('my_image_%s.jpg', date('Y-m-d'));
return new Response(
$snappy->getOutputFromHtml($html),
200,
[
'Content-Type' => 'image/jpg',
'Content-Disposition' => sprintf('attachment; filename="%s"', $filename),
]
);
}
Como configurar opções de renderização?
O serviço de renderizador do KnpSnappyBundle tem várias opções que permitem controlar a maneira como os arquivos são renderizados. Essas opções podem ser definidas no arquivo de configuração config.yml ou diretamente no serviço.
knp_snappy:
pdf:
enabled: true
binary: /usr/local/bin/wkhtmltopdf
options:
page-size: A4
orientation: Landscape
Você também pode definir as opções diretamente no serviço:
$snappy = $this->get('knp_snappy.pdf');
$snappy->setOption('page-size', 'A4');
$snappy->setOption('orientation', 'Landscape');
Como usar modelos Twig para gerar PDFs?
O KnpSnappyBundle é compatível com o Twig, permitindo que você use modelos Twig para gerar os PDFs.
public function generatePdfWithTwigAction()
{
$html = $this->renderView('pdf_template.html.twig', [
'title' => 'My PDF with Twig',
'content' => 'This is my PDF content generated with Twig',
]);
$snappy = $this->get('knp_snappy.pdf');
$filename = sprintf('my_pdf_%s.pdf', date('Y-m-d'));
return new Response(
$snappy->getOutputFromHtml($html),
200,
[
'Content-Type' => 'application/pdf',
'Content-Disposition' => sprintf('attachment; filename="%s"', $filename),
]
);
}
Como usar parâmetros de consulta para gerar PDFs?
Você pode passar parâmetros de consulta na URL da ação do controlador para permitir que o usuário final personalize o documento gerado. Em seguida, você pode obter esses parâmetros usando o objeto Request:
public function generatePdfWithQueryParamsAction(Request $request)
{
$title = $request->query->get('title');
$content = $request->query->get('content');
$html = $this->renderView('pdf_template.html.twig', [
'title' => $title,
'content' => $content,
]);
$snappy = $this->get('knp_snappy.pdf');
$filename = sprintf('my_pdf_%s.pdf', date('Y-m-d'));
return new Response(
$snappy->getOutputFromHtml($html),
200,
[
'Content-Type' => 'application/pdf',
'Content-Disposition' => sprintf('attachment; filename="%s"', $filename),
]
);
}
Como renderizar com cabeçalho e rodapé personalizados?
Para renderizar com cabeçalho e rodapé personalizados, você precisa criar os templates Twig e passar a opção correspondente para o serviço de renderização.
$snappy = $this->get('knp_snappy.pdf');
$headerHtml = $this->renderView('pdf_header.html.twig', [
'title' => 'Page header',
]);
$footerHtml = $this->renderView('pdf_footer.html.twig', [
'pageNumber' => 'Page {{ page }}',
]);
$snappy->setOption('header-html', $headerHtml);
$snappy->setOption('footer-html', $footerHtml);
Como renderizar com margens personalizadas?
Você pode configurar as margens do documento definindo a opção margin, que aceita uma matriz com os valores das margens superiores, direita, inferior e esquerda em milímetros.
$snappy = $this->get('knp_snappy.pdf');
$snappy->setOption('margin', [10, 20, 10, 20]);
Como renderizar com fontes personalizadas?
Para usar fontes personalizadas em seus PDFs, você precisa especificar o caminho para a fonte usando a opção font-path e carregar a fonte com a opção user-style-sheet. Você também precisa ter a fonte instalada no servidor.
$snappy = $this->get('knp_snappy.pdf');
$snappy->setOption('font-path', '/path/to/my/fonts');
$snappy->setOption('user-style-sheet', '/path/to/my/styles.css');