eckinox/pdf-bundle

此包最新版本(v5.0.0)没有可用的许可证信息。

Symfony 插件,用于从 Twig 模板生成 PDF。

安装次数: 3,608

依赖项: 0

建议者: 0

安全: 0

星标: 6

关注者: 1

分支: 2

开放性问题: 2

类型:symfony-bundle

v5.0.0 2024-04-25 19:08 UTC

README

在 Symfony 中生成 PDF 应该很简单。
现在,它确实如此!

使用此插件,您只需像渲染 Twig 模板一样渲染 PDF。

入门

1. 安装 Puppeteer

在继续之前,请确保您已安装 nodenpm

要安装 Puppeteer 及其依赖项,我们建议您查看 Puppeteer 的官方安装指南 以及他们的 官方故障排除指南

以下是在写作时在 Ubuntu(在 20.04 上测试)上有效的一段代码

curl -sL https://deb.nodesource.com/setup_16.x | sudo -E bash -
sudo apt-get install -y nodejs gconf-service libasound2 libatk1.0-0 libc6 libcairo2 libcups2 libdbus-1-3 libexpat1 libfontconfig1 libgcc1 libgconf-2-4 libgdk-pixbuf2.0-0 libglib2.0-0 libgtk-3-0 libnspr4 libpango-1.0-0 libpangocairo-1.0-0 libstdc++6 libx11-6 libx11-xcb1 libxcb1 libxcomposite1 libxcursor1 libxdamage1 libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 libxss1 libxtst6 ca-certificates fonts-liberation libappindicator1 libnss3 lsb-release xdg-utils wget libappindicator3-1 libatk-bridge2.0-0 libgbm1
sudo npm install --global --unsafe-perm puppeteer
sudo chmod -R o+rx /root/.cache/puppeteer/chrome

2. 通过 Composer 安装此包

composer require eckinox/pdf-bundle

3. 全局配置请求上下文

此插件需要知道您应用程序的 URL 以在底层执行一些巧妙的功能。
因此,您必须在参数中定义您应用程序的请求上下文。

有关这些参数的更多信息,请参阅 Symfony 的控制台文档

# config/services.yaml
parameters:
    router.request_context.host: 'myapp.com'
    router.request_context.scheme: 'https'
    router.request_context.base_url: '/'

4. 开始生成 PDF!

以下是一个基本示例,以帮助您入门。
有关更完整示例和信息,请参阅下面的文档。

<?php

namespace App\Controller;

use Eckinox\PdfBundle\Pdf\PdfGeneratorInterface;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;

class ReportController extends AbstractController
{
    /**
     * @Route("/my-report", name="my_report")
     */
    public function overview(PdfGeneratorInterface $pdfGenerator): Response
    {
        $pdf = $pdfGenerator->renderPdf("your_template.html.twig", [
            "key" => "value",
            "foo" => "bar",
        ]);

        return $pdf->output();
    }

格式

PdfGeneratorInterface::renderPdf() 接受一个名为 $format 的第三个可选参数。这允许您定义用于生成 PDF 的格式和方向。

使用内置格式

指定格式最简单和最常见的方法是使用内置的 FormatFactory,它可以为您提供所有最常见的格式。

使用内置格式指定格式如下所示

<?php

namespace App\Controller;

use Eckinox\PdfBundle\Pdf\FormatFactory;
use Eckinox\PdfBundle\Pdf\PdfGeneratorInterface;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;

class ReportController extends AbstractController
{
    /**
     * @Route("/my-report", name="my_report")
     */
    public function overview(PdfGeneratorInterface $pdfGenerator): Response
    {
        $pdf = $pdfGenerator->renderPdf("your_template.html.twig", [], FormatFactory::a4());

        return $pdf->output();
    }

每个格式工厂方法都接受一个布尔参数 $landscape,允许您确定所需的朝向。此参数默认为肖像模式(false)。

内置格式列表

以下是内置格式的列表

指定自定义格式

如果内置格式没有提供您需要的尺寸,您始终可以创建自己的格式。

只需创建一个 Format 实例并指定您想要的宽度和高度。可选地,您还可以定义朝向和边距。

宽度和高度参数接受以下单位:pxincmmm

$format = new Format("4.25in", "5.5in");

边距

应在文档的 CSS 中直接处理文档的边距。

尽管此库提供了一些边距支持并向 Puppeteer 提供此信息,但 Puppeteer 在当前实现中实际上并未使用它。

因此,您应在 CSS 中的 @pagehtml 元素上使用物理单位(incmmm)定义边距。

输出、下载和存储 PDF

PDF 生成器返回的 PdfInterface 实例有三个您可以使用的方法

  • PdfInterface::output(string $filename) : 返回一个 Response,在浏览器中输出 PDF。
  • PdfInterface::download(string $filename) : 返回一个触发PDF下载的 Response
  • PdfInterface::getContent() : 返回PDF的内容作为字符串。
    • 这很有用,可以将PDF存储到本地文件系统或外部存储,如Amazon S3或DO Spaces。

故障排除

大文件大小(或:我的PDF文件太大了!!)

此组件依赖于Puppeteer,而Puppeteer依赖于Chromium的PDF生成。Chromium的PDF生成依赖于使用的版本,当PDF包含图片或emoji时,可能会生成非常大的文件大小的PDF。

解决这个问题的一个简单方法是将您的图片包裹在一个SVG标签中,如下所示

<svg width="800" height="1200" xmlns="http://www.w3.org/2000/svg">
	<image href="your-image" width="800" height="1200" />
</svg>

当您这样做时,您的图片将嵌入到PDF中,其文件大小与常规大小相同,而不是重新渲染为PDF。这应该会显著减小生成的PDF文件大小。

许可

此组件受MIT许可协议的许可。