ceeram / cakepdf
Requires
- cakephp/cakephp: ^3.5
Requires (Dev)
- cakephp/chronos: ^1.1
- dompdf/dompdf: ^0.8
- mpdf/mpdf: ^7.0
- phpunit/phpunit: ^5.7.14|^6.0
- tecnickcom/tcpdf: ^6.2
Suggests
- dompdf/dompdf: If you wish to use the DomPdf engine
- mpdf/mpdf: If you wish to use the Mpdf engine
- tecnickcom/tcpdf: If you wish to use the Tcpdf engine
Replaces
- ceeram/cakepdf: 3.5.2
This package is not auto-updated.
Last update: 2019-02-20 17:15:00 UTC
README
包含 CakePdf 库的插件,使用 PDF 引擎将 HTML 转换为 PDF。
当前引擎
- DomPdf (^0.8)
- Mpdf (^7.0)
- Tcpdf (^6.2)
- WkHtmlToPdf 推荐引擎
需求
- CakePHP 3.4+
- 以下任一渲染引擎:DomPdf、Mpdf、Tcpdf 或 wkhtmltopdf
- pdftk(可选)请参阅:http://www.pdflabs.com/tools/pdftk-the-pdf-toolkit/
安装
使用 Composer
composer require friendsofcake/cakepdf
CakePdf 不包含任何支持的 PDF 引擎,您需要自行安装您打算使用的引擎。推荐的 WkHtmlToPdf 引擎可以从 http://wkhtmltopdf.org/ 下载,默认情况下 CakePdf 预期 WkHtmlToPdf 二进制文件位于 /usr/bin/wkhtmltopdf。如果您在 Windows 上使用 WkHtmlToPdf,请从路径名称中删除任何空格。例如,使用 C:/Progra~1/wkhtmltopdf/bin/wkhtmltopdf.exe
DomPdf、Mpdf 和 Tcpdf 可以通过 composer 使用以下命令之一安装
composer require dompdf/dompdf
composer require tecnickcom/tcpdf
composer require mpdf/mpdf
设置
在 config/bootstrap.php
中添加
Plugin::load('CakePdf', ['bootstrap' => true]);
或使用 CakePHP 的控制台
./bin/cake plugin load CakePdf -b
如果您计划使用 PDF 视图功能,该功能会自动渲染并返回 PDF 以发送到浏览器,您还应在您的 config/routes.php
文件中注册 pdf
扩展,要么在影响到的路由之前全局注册,要么为特定路由作用域注册
Router::extensions(['pdf']);
或为特定路由作用域
Router::scope('/', function (\Cake\Routing\RouteBuilder $routes) { $routes->addExtensions(['pdf']); // ... });
更多设置信息可以在使用部分找到。
配置
使用 Configure::write('CakePdf', $config);
或设置 Controller 属性 $pdfConfig
(仅在与 PdfView 一起使用时)。您需要至少定义 $config['engine']
。当直接使用 CakePdf 时,您也可以将配置数组传递给构造函数。引擎的值应具有 Plugin.ClassName
格式,不带引擎后缀。
配置选项
- engine:要使用的引擎(必需),或引擎配置选项的数组
- className:要使用的引擎类
- binary:要使用的二进制文件(仅限 wkhtmltopdf)
- cwd:当前工作目录(仅限 wkhtmltopdf)
- options:特定于引擎的选项。目前用于以下引擎
WkHtmlToPdfEngine
:选项作为 CLI 参数传递TexToPdfEngine
:选项作为 CLI 参数传递DomPdfEngine
:选项传递给Dompdf
类的构造函数MpdfEngine
:选项传递给Mpdf
类的构造函数
- crypto:要使用的加密引擎,或加密配置选项的数组
- className:要使用的加密类
- binary:要使用的二进制文件
- pageSize:更改默认大小,默认为 A4
- orientation:更改默认方向,默认为竖直
- margin:包含键:bottom、left、right、top 以及它们值的数组
- 标题:文档标题
- 延迟:在渲染PDF之前等待的毫秒数
- 窗口状态:渲染PDF之前所需的窗口状态
- 编码:更改编码,默认为UTF-8
- 下载:设置为true以强制下载,仅在使用PdfView时
- 文件名:使用强制下载时的文档文件名
示例
<?php Configure::write('CakePdf', [ 'engine' => 'CakePdf.WkHtmlToPdf', 'margin' => [ 'bottom' => 15, 'left' => 50, 'right' => 30, 'top' => 45 ], 'orientation' => 'landscape', 'download' => true ]); ?> <?php 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()->options([ 'pdfConfig' => [ 'orientation' => 'portrait', 'filename' => 'Invoice_' . $id ] ]); $this->set('invoice', $invoice); } } ?>
配置选项 engine
和 crypto
也可以是包含相关类配置选项的数组。例如
Configure::write('CakePdf', [ 'engine' => [ 'className' => 'CakePdf.WkHtmlToPdf', // Mac OS X / Linux is usually like: 'binary' => '/usr/local/bin/wkhtmltopdf', // On Windows environmnent you NEED to use the path like // old fashioned MS-DOS Paths, otherwise you will keep getting: // WKHTMLTOPDF didn't return any data // 'binary' => 'C:\\Progra~1\\wkhtmltopdf\\bin\\wkhtmltopdf.exe', // 'cwd' => 'C:\\Progra~1\\wkhtmltopdf\\bin', 'options' => [ 'print-media-type' => false, 'outline' => true, 'dpi' => 96 ], ], ]);
用法
您可以使用两种方式使用 CakePdf,仔细阅读您实际需要的方式。许多人混淆了这两种方式,但没有得到预期的结果。
1:在浏览器中渲染PDF(包括强制下载)
您可以为控制器动作创建PDF视图和布局文件,并自动渲染它们。将视图模板放在'pdf'子目录中,例如 src/Template/Invoices/pdf/view.ctp
,布局将位于 src/Template/Layout/pdf/default.ctp
。
确保您的 InvoicesController
类 加载了 RequestHandler
组件,并浏览到 http://localhost/invoices/view/1.pdf
此外,您可以通过在路由文件中添加 Router::mapResources(['Invoices']);
来映射资源,并且您可以在 http://localhost/invoices/1.pdf
访问相同的文档。
如果您不希望在URL中使用 pdf
扩展名,您可以在路由配置中省略注册它。然后在控制器操作中指定要使用的视图类
$this->viewBuilder()->setClassName('CakePdf.Pdf');
您可以选择使用 download
选项强制在浏览器中渲染PDF时进行下载。此外,您还可以使用 filename
选项指定自定义文件名。
$this->viewBuilder()->options([ '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数据。视图文件路径类似于 src/Template/Pdf/newsletter.ctp
。布局文件路径类似于 src/Template/Layout/pdf/default.ctp
。请注意,两种使用类型的布局都在同一目录中,但视图模板使用不同的文件路径。您还可以将原始数据写入文件。
示例
<?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' 设置为一个数组,其中包含以下可用权限的组合
- 打印
- 降级打印
- 修改
- 组合
- 复制内容
- 屏幕阅读器
- 注释
- 填写
如何
确保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]);
在所有页面上获取页眉和页脚
以下是一些基于CSS的解决方案,您可以参考这些方案,轻松地在所有PDF页面上获取页眉和页脚。
- https://ourcodeworld.com/articles/read/687/how-to-configure-a-header-and-footer-in-dompdf
- http://www.jessicaschillinger.us/2017/blog/print-repeating-header-browser/
感谢
非常感谢Kim Biesbjerg和Jelle Henkens的贡献。想在这里看到您的名字?为改进或其他PDF引擎创建一个pull request。