jeydotc/pdf-service

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

项目 pdf-service 的描述。

v0.9.2 2021-01-25 17:26 UTC

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

  1. 接收一些数据。
  2. 获取一个模板。
  3. 用接收到的数据渲染模板。
  4. 从渲染的数据生成PDF。
  5. 将PDF存储在某个地方。

这些都是渲染PDF的5个关键方面,并且它们都由这个类管理

PDFService\Core\PDFRenderService

神奇之处在于,您可以配置所有这些方面以适应您的需求

  1. 获取一个模板。
    • 从文件系统获取(目前唯一的实现,也是默认的)。
    • 或从数据库获取。
    • 或从外部服务获取。
    • 或仅实现 ITemplatesRepository 并调用 ->setTemplatesRepository()
  2. 用接收到的数据渲染模板。
    • 使用原始PHP(默认)。
    • 或仅实现 ITemplateEngine 并调用 ->setTemplateEngine() 来适应您最喜欢的模板引擎。
  3. 从渲染的数据生成PDF。
    • 使用 wkhtmltopdf(目前唯一的实现,也是默认的)。
    • 或 DOMPdf
    • 或任何可以将HTML转换为PDF的东西,只需实现 IPDFRenderer 并调用 ->setPdfRenderer()
  4. 将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 类中发送一些额外的信息吗?