eckinox / pdf-bundle
Symfony 插件,用于从 Twig 模板生成 PDF。
Requires
- php: >=8.1.10
- eckinox/php-puppeteer: ^1.0
- symfony/http-foundation: ^5.4|^6.0
- symfony/http-kernel: ^5.4|^6.0
- symfony/string: ^5.4|^6.0
- twig/twig: ^3.8
Requires (Dev)
- eckinox/eckinox-cs: ^3.0
This package is auto-updated.
Last update: 2024-09-25 20:15:59 UTC
README
在 Symfony 中生成 PDF 应该很简单。
现在,它确实如此!
使用此插件,您只需像渲染 Twig 模板一样渲染 PDF。
入门
1. 安装 Puppeteer
在继续之前,请确保您已安装 node
和 npm
。
要安装 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
实例并指定您想要的宽度和高度。可选地,您还可以定义朝向和边距。
宽度和高度参数接受以下单位:px
、in
、cm
和 mm
。
$format = new Format("4.25in", "5.5in");
边距
应在文档的 CSS 中直接处理文档的边距。
尽管此库提供了一些边距支持并向 Puppeteer 提供此信息,但 Puppeteer 在当前实现中实际上并未使用它。
因此,您应在 CSS 中的 @page
或 html
元素上使用物理单位(in
、cm
或 mm
)定义边距。
输出、下载和存储 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许可协议的许可。