iamthom / cakepdf
CakePHP 插件,用于创建和/或渲染 PDF 文件,支持多个 PDF 引擎。
Requires
- php: >=5.4.16
- cakephp/cakephp: ~3.1
- cakephp/plugin-installer: *
Requires (Dev)
Suggests
- dompdf/dompdf: If you wish to use the DomPdf engine
- h4cc/wkhtmltopdf-amd64: If you wish to use the WkHtmlToPdf
- mpdf/mpdf: If you wish to use the Mpdf engine
- tecnick.com/tcpdf: If you wish to use the Tcpdf engine
This package is not auto-updated.
Last update: 2024-09-28 19:47:20 UTC
README
我为自己的需求定制了这个插件。请参考原始源代码以获得更好的支持
CakePdf 插件
包含 CakePdf 库的插件,将使用 PDF 引擎将 HTML 转换为 PDF。
当前引擎
- DomPdf
- Mpdf
- Tcpdf
- WkHtmlToPdf 推荐引擎
需求
- PHP 5.4.16+
- CakePHP 3.0+
- 以下任一渲染引擎:DomPdf、Mpdf、Tcpdf 或 wkhtmltopdf
- pdftk(可选)请参阅:http://www.pdflabs.com/tools/pdftk-the-pdf-toolkit/
安装
您可以使用 composer 将此插件安装到您的 CakePHP 应用程序中。对于现有应用程序,您可以将以下内容添加到您的 composer.json
文件中
"require": { "friendsofcake/cakepdf": "^3.1" }
然后运行 php composer.phar update
或 composer update
(取决于您的 composer 设置)
CakePdf 不包括任何支持的 PDF 引擎,您需要自己安装它们。推荐的 wkhtmltopdf 引擎可以从 http://wkhtmltopdf.org/ 下载,默认情况下 CakePdf 预期 wkhtmltopdf 二进制文件位于 /usr/bin/wkhtmltopdf。
DomPdf、Mpdf 和 Tcpdf 可以使用以下命令之一通过 composer 安装
composer require dompdf/dompdf
composer require tecnick.com/tcpdf
composer require mpdf/mpdf
设置
在 config/bootstrap.php
中添加
Plugin::load('CakePdf', array('bootstrap' => true, 'routes' => true));
配置
使用 Configure::write('CakePdf', $config);
或设置 Controller 属性 $pdfConfig
(仅在使用 PdfView 时)您需要至少定义 $config['engine']
。当直接使用 CakePdf 时,您也可以将配置数组传递给构造函数。引擎的值应具有 Plugin.ClassName
格式,不带引擎后缀
配置选项
- engine:要使用的引擎(必需),或引擎配置选项的数组
- className:要使用的引擎类
- binary:要使用的二进制文件(仅对 wkhtmltopdf)
- options:传递给 wkhtmltopdf 的选项
- crypto:要使用的加密引擎,或加密配置选项的数组
- className:要使用的加密类
- binary:要使用的二进制文件
- pageSize:更改默认大小,默认为 A4
- orientation:更改默认方向,默认为肖像
- margin:包含键:bottom、left、right、top 及其值的边距数组
- title:文档标题
- encoding:更改编码,默认为 UTF-8
- download:设置为 true 以强制下载,仅当使用 PdfView 时
- filename:使用强制下载时的文档文件名
示例
<?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', 'options' => [ 'print-media-type' => false, 'outline' => true, 'dpi' => 96 ], ], ]);
用法
您可以使用 CakePdf 的两种方式,仔细阅读您实际需要哪种。许多人混淆了两种方式,没有得到预期的结果。
1:使用 PdfView 在浏览器中渲染 PDF(包括强制下载)
您可以为您的控制器操作创建 PDF 视图和布局文件,并自动渲染它们。将视图模板放在 'pdf' 子目录中,例如 src/Template/Invoices/pdf/view.ctp
布局将在 src/Template/Layouts/pdf/default.ctp
中
请确保您的InvoicesController在$components
数组中包含RequestHandler组件。浏览到https:///invoices/view/1.pdf
另外,您可以通过在路由文件中添加Router::mapResources(array('Invoices'));
来映射资源,并且您可以在https:///invoices/1.pdf访问相同的文档
2: 创建用于电子邮件附件、文件存储等的PDF。
您可以使用CakePdf库通过视图模板创建原始PDF数据。视图文件路径可能如下所示:src/Template/Pdf/newsletter.ctp
。布局文件路径可能如下所示:src/Template/Layouts/pdf/default.ctp
请注意,两种用途的布局都在同一目录中,但视图模板使用不同的文件路径。您还可以选择将原始数据写入文件。
示例
<?php $CakePdf = new \CakePdf\Pdf\CakePdf(); $CakePdf->template('newsletter', 'default'); //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'设置为包含以下可用权限组合的数组
- degraded_print
- modify,
- assembly,
- copy_contents,
- screen_readers,
- annotate,
- fill_in
关于静态资源的说明
在PDF的视图模板中使用绝对URL来引用静态资源。如果您使用HtmlHelper::image()
、HtmlHelper::script()
或HtmlHelper::css()
,请确保您有$options['fullBase'] = true
另一个解决方案是创建一个AppHelper
,该Helper强制在PDF请求中将$options['fullBase'] = true
。例如
class AppHelper extends Helper { public function assetUrl($path, $options = array()) { if (!empty($this->request->params['ext']) && $this->request->params['ext'] === 'pdf') { $options['fullBase'] = true; } return parent::assetUrl($path, $options); } }
感谢
非常感谢Kim Biesbjerg和Jelle Henkens的贡献。也想在这里看到您的名字吗?创建一个改进/其他PDF引擎的拉取请求。