androideo/cakepdf

CakePHP插件,用于使用Mpdf创建和/或渲染PDF

安装: 5

依赖者: 0

建议者: 0

安全: 0

星标: 0

关注者: 0

分支: 183

类型:cakephp-plugin

5.0.2 2020-08-19 11:22 UTC

README

本项目是针对mpdf特别制作的https://github.com/FriendsOfCake/CakePdf项目的分支

Build Status Total Downloads License

包含CakePdf库的插件,该库将使用PDF引擎将HTML转换为PDF。

插件中包含的引擎

  • Mpdf (^8.0.4)

社区维护的引擎

需求

安装

使用Composer

composer require friendsofcake/cakepdf

CakePdf不包含任何支持的PDF引擎,您需要自己安装您打算使用的引擎。

推荐wkhtmltopdf引擎的软件包可以从https://wkhtmltopdf.org/downloads.html下载。DomPdf、Mpdf和Tcpdf可以通过以下命令之一使用composer安装

composer require dompdf/dompdf
composer require tecnickcom/tcpdf
composer require mpdf/mpdf

设置

使用CakePHP的控制台加载插件

./bin/cake plugin load CakePdf

如果您计划使用PDF视图功能来自动渲染并返回PDF以发送到浏览器,您还应该在您的config/routes.php文件中注册pdf扩展,无论是在全局范围内还是在应受影响的路由之前

Router::extensions(['pdf']);

或对于特定的路由范围

Router::scope('/', function (\Cake\Routing\RouteBuilder $routes) {
    $routes->addExtensions(['pdf']);
    // ...
});

更多设置信息可以在使用部分找到。

配置

使用Configure::write('CakePdf', $config);或在控制器中使用视图构建器设置名为pdfConfig的视图选项(仅在用于PdfView时)。您至少需要定义$config['engine']。当直接使用CakePdf时,您也可以将配置数组传递给构造函数。引擎的值应采用Plugin.ClassName格式,不带引擎后缀。

配置选项

  • engine: 要使用的引擎(必需),或引擎配置选项的数组
    • className: 要使用的引擎类
    • binary: 要使用的二进制文件(仅限wkhtmltopdf)
    • cwd: 当前工作目录(仅限wkhtmltopdf)
    • options: 引擎特定选项。目前用于以下引擎
      • MpdfEngine:这些选项传递给Mpdf类的构造函数
  • crypto: 要使用的加密引擎,或加密配置选项的数组
    • className: 要使用的加密类
    • binary: 要使用的二进制文件
  • pageSize: 更改默认大小,默认为A4
  • orientation: 更改默认方向,默认为纵向
  • margin: 包含键:bottom、left、right、top及其值的数组或边距
  • title: 文档标题
  • delay: 在渲染PDF之前等待的延迟(毫秒)
  • windowStatus: 在渲染PDF之前所需的窗口状态
  • encoding: 更改编码,默认为UTF-8
  • download: 设置为true以强制下载,仅当使用PdfView时
  • filename: 强制下载时文档的文件名

示例

Configure::write('CakePdf', [
    'engine' => 'CakePdf.Mpdf',
    'margin' => [
        'bottom' => 15,
        'left' => 50,
        'right' => 30,
        'top' => 45
    ],
    'orientation' => 'landscape',
    'download' => true,
                'customFontDir' => WWW_ROOT. 'font/dinpro',
            'customFontArray' => [
                'dinproregular' => [
                    'R' => 'DINPro-Regular.ttf',
                    'I' => 'DINPro-Regular.ttf',
                ],
                'dinprolight' => [
                    'R' => 'DINPro-Light.ttf',
                    'I' => 'DINPro-Light.ttf',
                ],
                'dinpromedium' => [
                    'R' => 'DINPro-Mediumtr.ttf',
                    'I' => 'DINPro-Mediumtr.ttf',
                ],
            ],
            'headerOnFirstPage' => false,
            'header' => '<img src="'.WWW_ROOT.'img'.DS.'logo.png" style="width:120px;float:right"/>',
                'footer' => '<table width="100%">
         <tr>
                 <td width="33%">{DATE j-m-Y}</td>
                 <td width="33%" align="center">{PAGENO}/{nbpg}</td>
             <td width="33%" style="text-align: right;">My document</td>
            </tr>
         </table>'
]);
class InvoicesController extends AppController
{
    // In your Invoices controller you could set additional configs,
    // or override the global ones:
    public function view($id = null)
    {
        $invoice = $this->Invoice->get($id);
        $this->viewBuilder()->setOption(
            'pdfConfig',
            [
                'orientation' => 'portrait',
                'filename' => 'Invoice_' . $id
            ]
        );
        $this->set('invoice', $invoice);
    }
}

配置选项enginecrypto也可以是包含相关类的配置选项的数组。例如

    Configure::write('CakePdf', [
        'engine' => [
            'className' => 'CakePdf.WkHtmlToPdf',
            'options' => [
                'print-media-type' => false,
                'outline' => true,
                'dpi' => 96
            ],

            /**
             * For Mac OS X / Linux by default the `wkhtmltopdf` binary should
             * be available through environment path or you can specify location as:
             */
            // 'binary' => '/usr/local/bin/wkhtmltopdf',

            /**
             * On Windows the engine uses the path shown below as default.
             * You NEED to use the path like old fashioned MS-DOS Paths,
             * otherwise you will get error like:
             * "WKHTMLTOPDF didn't return any data"
             */
            // 'binary' => 'C:\\Progra~1\\wkhtmltopdf\\bin\\wkhtmltopdf.exe',
        ],
    ]);

用法

您可以使用两种方式使用CakePdf,请仔细阅读您实际需要的方式。许多人混淆了这两种方式,没有得到预期的结果。

1:在浏览器中使用PdfView将PDF渲染为PDF(包括强制下载)

您可以为您控制器操作创建PDF视图和布局文件,并自动渲染它们。将视图模板放置在'pdf'子目录下,例如 templates/Invoices/pdf/view.php,布局将放在 templates/layout/pdf/default.php

请确保您的InvoicesController加载了RequestHandler组件,并浏览到https:///invoices/view/1.pdf

此外,您可以通过在路由文件中添加Router::mapResources(['Invoices']);来映射资源,您可以在https:///invoices/1.pdf访问相同的文档。

如果您不想在URL中使用pdf扩展名,您可以省略在路由配置中注册它。然后,在控制器操作中指定要使用的视图类

$this->viewBuilder()->setClassName('CakePdf.Pdf');

您可以使用download选项强制PDF在浏览器中下载,而不是直接渲染。此外,您还可以使用filename选项指定自定义的文件名。

$this->viewBuilder()->setOption(
    'pdfConfig',
    [
        'download' => true, // This can be omitted if "filename" is specified.
        'filename' => 'Invoice_' . $id // This can be omitted if you want file name based on URL.
    ]
);

2: 为电子邮件附件、文件存储等创建PDF。

您可以使用CakePdf库通过视图模板创建原始PDF数据。视图文件路径看起来像templates/pdf/newsletter.php。布局文件路径如下templates/layout/pdf/default.php。请注意,两种用途的布局都在同一目录下,但视图模板使用不同的文件路径。可选地,您也可以将原始数据写入文件。

示例

<?php
    $CakePdf = new \CakePdf\Pdf\CakePdf();
    $CakePdf->template('newsletter', 'default');
    $CakePdf->viewVars($this->viewVars);
    // Get the PDF string returned
    $pdf = $CakePdf->output();
    // Or write it to file directly
    $pdf = $CakePdf->write(APP . 'files' . DS . 'newsletter.pdf');

加密

您可以可选地用权限加密PDF

要使用加密,您首先需要选择一个加密引擎。目前我们支持以下加密引擎

  • Pdftk

用法

在您的引导文件中添加以下内容。

Configure::write('CakePdf.crypto', 'CakePdf.Pdftk');

pdfConfig中的选项

  • protect: 设置为true以启用加密
  • userPassword(可选):设置打开PDF文件的密码
  • ownerPassword(可选):设置解锁锁定权限的密码
  • 上述之一必须存在,即userPassword或ownerPassword
  • permissions(可选):定义权限

权限

默认情况下,我们拒绝所有权限。

要允许所有权限

将'permission'设置为true

要允许特定的权限

将'permissions'设置为包含以下可用权限组合的数组

  • print
  • degraded_print
  • modify,
  • assembly,
  • copy_contents,
  • screen_readers,
  • annotate,
  • fill_in

如何

确保CSS、图片等在PDF中加载

对于PDF的视图模板中的静态资产使用绝对URL。如果您使用HtmlHelper::image()HtmlHelper::css(),请确保已将fullBase选项设置为true

例如

echo $this->Html->image('logo.png', ['fullBase' => true]);
echo $this->Html->css('bootstrap.css', ['fullBase' => true]);

如果您无法正确获取资产URL,您可以尝试使用文件系统路径代替资产。

<img src="<?= WWW_ROOT ?>img/logo.png" />

在所有页面上获取页眉和页脚

这里有一些基于CSS的解决方案,您可以在所有PDF页面上轻松获取页眉和页脚。