jeydotc / pdf-service
项目 pdf-service 的描述。
Requires
- php: >=7.2
- knplabs/knp-snappy: ^1.2
Requires (Dev)
- phpunit/phpunit: 7.5.6
This package is auto-updated.
Last update: 2024-08-29 05:43:47 UTC
README
<?php use \PDFService\Core\PDFRenderService; use \PDFService\TemplateRepositories\FileSystemTemplatesRepository; use \PDFService\TemplateEngines\RawTemplateEngine; use \PDFService\PDFRenderers\SnappyPDFRenderer; use \PDFService\BinStorages\FileSystemBinStorage; use \PDFService\Core\RenderRequest; // Setup the service, preferably at DI config: $rendererService = PDFRenderService::create() ->setTemplatesRepository(new FileSystemTemplatesRepository("/path/to/templates")) ->setTemplateEngine(new RawTemplateEngine(sys_get_temp_dir())) ->setPdfRenderer(new SnappyPDFRenderer()) ->setBinStorage(new FileSystemBinStorage("/path/to/storage/folder")); // Render your PDF. $rendererService->renderPDF(new RenderRequest("my-template.php", [ 'my' => 'data' ]));
介绍
此库旨在提供一个简单且可配置的管道来渲染PDF。
主要思想是使用此过程来渲染PDF
- 接收一些数据。
- 获取一个模板。
- 用接收到的数据渲染模板。
- 从渲染的数据生成PDF。
- 将PDF存储在某个地方。
这些都是渲染PDF的5个关键方面,并且它们都由这个类管理
PDFService\Core\PDFRenderService
神奇之处在于,您可以配置所有这些方面以适应您的需求
- 获取一个模板。
- 从文件系统获取(目前唯一的实现,也是默认的)。
- 或从数据库获取。
- 或从外部服务获取。
- 或仅实现
ITemplatesRepository
并调用->setTemplatesRepository()
- 用接收到的数据渲染模板。
- 使用原始PHP(默认)。
- 或仅实现
ITemplateEngine
并调用->setTemplateEngine()
来适应您最喜欢的模板引擎。
- 从渲染的数据生成PDF。
- 使用 wkhtmltopdf(目前唯一的实现,也是默认的)。
- 或 DOMPdf
- 或任何可以将HTML转换为PDF的东西,只需实现
IPDFRenderer
并调用->setPdfRenderer()
。
- 将PDF存储在某个地方。
- 仅返回数据(默认)。
- 或将它存储在文件系统中(也实现了)。
- 或将它发送到外部服务(数据库、存储等)。
- 仅实现
IBinStorage
并调用->setBinStorage()
。
如何安装
composer require jeydotc/pdf-service
设置 wkhtmltopdf
二进制文件,这是 SnappyPDFRenderer
所需要的
默认的 SnappyPDFRenderer
需要一个 wkhtmltopdf
二进制文件才能工作,有几个选项可以配置它
选项 1: 自己下载
只需下载适合您系统的二进制文件并将其复制到您的 ./vendor/bin
文件夹。或者将其放在任何地方,并在构造函数中提供绝对路径。
选项 2: 使用 post-install-cmd
在您的 composer.json
文件中,在 "scripts" 部分下添加此代码段
{ // The rest of your composer file.... "scripts": { //<-- Add this if not already existing. "post-install-cmd": [ //<-- Add this if not already existing. "PDFService\\Composer\\RuntimeInstall::installRuntime" //<-- Add this array entry. ] }, }
然后运行 composer install
。这将尝试根据您的系统下载合适的二进制文件。目前,支持的只有
- MacOS-x64
- Ubuntu-16-AMD64
- Ubuntu-18-AMD64
- Ubuntu-20-AMD64
- Windows-x64
如果您的系统不在上述列表中,您仍然可以像这样运行您的 composer install
PDF_SERVICE_URL=<url-to-wkhtmltopdf-binary> composer install
其中 <url-to-wkhtmltopdf-binary>
可以是下载二进制文件的URL,或者您本地机器中 wkhtmltopdf
文件的绝对路径。
如何使用
创建并保存一个模板到某个地方
My-Raw-Template.php
<?php return function($data){?> <html> <head> <style> h1 { color: #9999FF; } </style> </head> <body> <h1>Hello $data['name']</h1> </body> </html> <?php };
创建并配置一个 PDFREndererService
实例
$service = PDFRenderService::create() ->setTemplatesRepository(new FileSystemTemplatesRepository('/the/directory/where-templates/are/located'));
调用 renderPDF 方法并获取结果
$result = $service->renderPDF(new RenderRequest('My-Raw-Template.php', [ 'name' => 'Joe' ]));
在这种情况下,结果将是作为字符串返回的PDF数据,您可以将其存储在某个地方或返回给用户。
要使服务生成文件,您只需设置一个二进制存储,为此,在调用 render 方法之前,只需调用 setBinStorage
$service = PDFRenderService::create() ->setTemplatesRepository(new FileSystemTemplatesRepository('/the/directory/where-templates/are/located')) ->setBinStorage(new FileSystemBinStorage('/place/to-put/pdfs/into')); $result = $service->renderPDF(new RenderRequest('My-Raw-Template.php', [ 'name' => 'Joe' ]));
这将在指定的目录中保存PDF并返回文件名。
名称将通过连接模板名称、结果PDF的MD5哈希和时间生成,如下所示
{templateName}-{dataMD5}-{time()}.pdf
示例
My-Raw-Template.php-2de85b56ded9694eb5100349480d980b-1550007643.pdf
要改变这种行为,只需将可调用对象作为存储构造函数的第二个参数传递
$service = PDFRenderService::create() ->setTemplatesRepository(new FileSystemTemplatesRepository('/the/directory/where-templates/are/located')) ->setBinStorage(new FileSystemBinStorage('/place/to-put/pdfs/into', function(RenderRequest $request, $pdfData){ return 'I-Like-Turtles.pdf'; })); $result = $service->renderPDF(new RenderRequest('My-Raw-Template.php', [ 'name' => 'Joe' ]));
待办:在 $request 类中发送一些额外的信息吗?