在日常的 web 项目开发中,生成 pdf 文档是一个非常普遍但又常常令人头疼的需求。想象一下这样的场景:
“老板,用户反馈说他们需要把订单详情下载成 PDF 格式,方便打印和归档!” “好的,没问题!”
你信心满满地接下任务,但很快就发现,这远不是一个简单的“没问题”。
遇到的困难:
DomPdf
mPDF
wkhtmltopdf
面对这些挑战,我们迫切需要一个统一、高效且易于集成的解决方案。幸运的是,在 CakePHP 的生态圈里,
friendsofcake/cakepdf
friendsofcake/cakepdf
立即学习“PHP免费学习笔记(深入)”;
1. 安装 CakePdf 插件
首先,使用 Composer 安装
friendsofcake/cakepdf
<pre class="brush:php;toolbar:false;">composer require friendsofcake/cakepdf
2. 安装 PDF 引擎
CakePdf
wkhtmltopdf
<pre class="brush:php;toolbar:false;">composer require dompdf/dompdf # 或者 composer require tecnickcom/tcpdf # 或者 composer require mpdf/mpdf
3. 加载插件并配置路由
在你的 CakePHP 项目中加载插件:
<pre class="brush:php;toolbar:false;">./bin/cake plugin load CakePdf
为了让 CakePHP 能够识别
config/routes.php
<pre class="brush:php;toolbar:false;">// config/routes.php
$routes->scope('/', function (CakeRoutingRouteBuilder $routes) {
$routes->setExtensions(['pdf']); // 添加这一行
// ... 其他路由
});CakePdf
场景一:Web 页面直接生成 PDF (PdfView)
这是最常见的用法,当用户访问一个带有
在控制器中启用 PdfView: 在你的控制器中,通过
addViewClasses
PdfView
<pre class="brush:php;toolbar:false;">// src/Controller/InvoicesController.php
use CakePdfViewPdfView;
use AppControllerAppController; // 确保引入你的AppController
class InvoicesController extends AppController
{
public function initialize(): void
{
parent::initialize();
$this->addViewClasses([PdfView::class]); // 注册 PdfView
}
public function view($id = null)
{
$invoice = $this->Invoices->get($id);
// 可以通过 setOption('pdfConfig') 覆盖全局配置或添加特定配置
$this->viewBuilder()->setOption(
'pdfConfig',
[
'orientation' => 'portrait', // 纵向
'filename' => 'Invoice_' . $id . '.pdf', // 设置下载文件名
'download' => true, // 强制下载
]
);
$this->set('invoice', $invoice);
}
}创建 PDF 视图和布局文件:
CakePdf
InvoicesController::view()
templates/Invoices/pdf/view.php
templates/layout/pdf/default.php
在这些文件中,你可以像编写普通 HTML 一样编写你的 PDF 内容。
现在,当用户访问
http://localhost/invoices/view/1.pdf
Invoice_1.pdf
场景二:生成 PDF 数据用于邮件附件、文件存储等
如果你需要将 PDF 作为邮件附件发送,或者存储到服务器上,而不是直接在浏览器中显示,可以直接使用
CakePdf
<pre class="brush:php;toolbar:false;">// 假设在某个服务或命令中
use CakePdfPdfCakePdf;
use CakeCoreConfigure; // 用于读取配置
// 确保 CakePdf 配置已加载,例如在 bootstrap.php 或这里临时配置
Configure::write('CakePdf', [
'engine' => 'CakePdf.WkHtmlToPdf', // 指定使用的引擎
'margin' => [
'bottom' => 15, 'left' => 15, 'right' => 15, 'top' => 15,
],
'orientation' => 'portrait',
'encoding' => 'UTF-8',
]);
$CakePdf = new CakePdf();
// 指定要渲染的视图模板 (相对于 templates/pdf/ 目录)
$CakePdf->template('newsletter', 'default');
// 传递视图变量
$CakePdf->viewVars(['title' => '最新资讯', 'content' => '这里是详细的资讯内容...']);
// 获取 PDF 文件的二进制字符串
$pdfData = $CakePdf->output();
// 将 PDF 数据写入文件
$filePath = APP . 'files' . DS . 'newsletter.pdf';
$CakePdf->write($filePath);
// 现在你可以将 $pdfData 作为邮件附件发送,或者使用 $filePath
echo "PDF 已生成并保存到: " . $filePath;灵活的配置选项
CakePdf
<pre class="brush:php;toolbar:false;">// 在 config/bootstrap.php 或控制器中配置
Configure::write('CakePdf', [
'engine' => [
'className' => 'CakePdf.WkHtmlToPdf', // 引擎类名
'binary' => '/usr/local/bin/wkhtmltopdf', // WkHtmlToPdf 二进制文件路径 (Linux/Mac)
// 'binary' => 'C:\Progra~1\wkhtmltopdf\bin\wkhtmltopdf.exe', // Windows 路径
'options' => [ // 传递给 wkhtmltopdf 的 CLI 参数
'print-media-type' => false,
'outline' => true,
'dpi' => 96,
'enable-local-file-access' => true, // 允许访问本地文件系统路径
],
],
'pageSize' => 'A4', // 页面大小
'orientation' => 'landscape', // 横向
'margin' => [ // 边距
'bottom' => 15, 'left' => 50, 'right' => 30, 'top' => 45,
],
'title' => '我的自定义 PDF 标题',
'encoding' => 'UTF-8',
'download' => false, // 默认不强制下载
'filename' => 'document.pdf', // 默认文件名
// ... 更多选项
]);确保 CSS、图片等静态资源正确加载
这是一个常见问题。为了让 PDF 引擎能够正确加载 CSS 和图片,你需要:
HtmlHelper::image()
HtmlHelper::css()
fullBase
true
<pre class="brush:php;toolbar:false;">echo $this->Html->image('logo.png', ['fullBase' => true]);
echo $this->Html->css('bootstrap.css', ['fullBase' => true]);wkhtmltopdf
enable-local-file-access
true
<pre class="brush:php;toolbar:false;">@@##@@img/logo.png" />
页眉和页脚
对于页眉和页脚,通常通过 CSS 来实现。你可以参考一些 CSS 技巧,例如使用
position: fixed
@page
wkhtmltopdf
--header-html
--footer-html
engine.options
friendsofcake/cakepdf
PdfView
无论是生成在线报表、可下载的发票,还是邮件附件,
CakePdf
以上就是如何优雅地在CakePHP中生成PDF文档?CakePdf插件助你轻松搞定的详细内容,更多请关注php中文网其它相关文章!
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号