knplabs / knp-snappy-bundle

通过将Twig/HTML模板转换为PDF和图片,轻松在Symfony中创建。

安装次数: 25,181,948

依赖项: 58

建议者: 3

安全性: 0

星标: 1,230

关注者: 55

分支: 143

开放问题: 2

类型:symfony-bundle

v1.10.2 2024-06-10 12:38 UTC

README

Build Status Scrutinizer Code Quality StyleCI

Snappywkhtmltopdf转换工具的PHP包装器。它允许您使用webkit引擎从HTML文档生成PDF或图片文件。

KnpSnappyBundle为您的Symfony项目提供了一种简单的集成方式。

限制

如果您使用JavaScript来渲染页面,可能会遇到一些问题,因为wkhtmltopdf不完全兼容ES6 api。解决此问题的唯一方法是提供polyfills,以修复现代ES6 api和wkhtmltopdf渲染引擎之间的差距。

安装

使用composer,需要

composer require knplabs/knp-snappy-bundle

如果您不使用Flex,请在您的内核中启用它

// config/bundles.php
<?php

return [
    //...
    Knp\Bundle\SnappyBundle\KnpSnappyBundle::class => ['all' => true],
    //...
];

配置

如果您需要更改二进制文件,更改实例选项,甚至禁用一个或两个服务,您可以通过配置来实现。

# config/packages/knp_snappy.yaml
knp_snappy:
    pdf:
        enabled:    true
        binary:     /usr/local/bin/wkhtmltopdf #"\"C:\\Program Files\\wkhtmltopdf\\bin\\wkhtmltopdf.exe\"" for Windows users
        options:    []
    image:
        enabled:    true
        binary:     /usr/local/bin/wkhtmltoimage #"\"C:\\Program Files\\wkhtmltopdf\\bin\\wkhtmltoimage.exe\"" for Windows users
        options:    []

如果您想更改默认的临时文件夹sys_get_temp_dir(),可以使用

# config/packages/knp_snappy.yaml
knp_snappy:
    temporary_folder: "%kernel.cache_dir%/snappy"

您还可以使用process_timeout配置生成器使用的超时。

# config/packages/knp_snappy.yaml
knp_snappy:
    process_timeout: 20 # In seconds

用法

该包注册了两个服务

  • knp_snappy.image服务允许您生成图片;
  • knp_snappy.pdf服务允许您生成PDF文件。

从URL生成图片

// @var Knp\Snappy\Image
$knpSnappyImage->generate('http://www.google.fr', '/path/to/the/image.jpg');

从URL生成PDF文档

// @var Knp\Snappy\Pdf
$knpSnappyPdf->generate('http://www.google.fr', '/path/to/the/file.pdf');

从多个URL生成PDF文档

// @var Knp\Snappy\Pdf
$knpSnappyPdf->generate(array('http://www.google.fr', 'http://www.knplabs.com', 'http://www.google.com'), '/path/to/the/file.pdf');

从Twig视图生成PDF文档

// @var Knp\Snappy\Pdf
$knpSnappyPdf->generateFromHtml(
    $this->renderView(
        'MyBundle:Foo:bar.html.twig',
        array(
            'some'  => $vars
        )
    ),
    '/path/to/the/file.pdf'
);

从控制器以响应形式渲染图片

use Knp\Bundle\SnappyBundle\Snappy\Response\JpegResponse;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;

class SomeController extends AbstractController
{
    public function imageAction(Knp\Snappy\Image $knpSnappyImage)
    {
        $html = $this->renderView('MyBundle:Foo:bar.html.twig', array(
            'some'  => $vars
        ));

        return new JpegResponse(
            $knpSnappyImage->getOutputFromHtml($html),
            'image.jpg'
        );
    }
}

从控制器以响应形式渲染PDF文档

use Knp\Bundle\SnappyBundle\Snappy\Response\PdfResponse;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;

class SomeController extends AbstractController
{
    public function pdfAction(Knp\Snappy\Pdf $knpSnappyPdf)
    {
        $html = $this->renderView('MyBundle:Foo:bar.html.twig', array(
            'some'  => $vars
        ));

        return new PdfResponse(
            $knpSnappyPdf->getOutputFromHtml($html),
            'file.pdf'
        );
    }
}

渲染包含相对URL(如CSS文件)的PDF文档

use Knp\Bundle\SnappyBundle\Snappy\Response\PdfResponse;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;

class SomeController extends AbstractController
{
    public function pdfAction(Knp\Snappy\Pdf $knpSnappyPdf)
    {
        $pageUrl = $this->generateUrl('homepage', array(), true); // use absolute path!

        return new PdfResponse(
            $knpSnappyPdf->getOutput($pageUrl),
            'file.pdf'
        );
    }
}

维护者

KNPLabs正在寻找维护者(查看原因)。

如果您感兴趣,请随时打开PR请求成为维护者。

我们期待您的消息 :)

致谢

SnappyBundle和Snappy基于出色的wkhtmltopdf。SnappyBundle由KnpLabs开发。