在CakePHP 3.X中,使用PLUGIN CAKEPDF
我尝试使用wkhtmltopdf和dompdf,并且两者都无法下载有效的PDF文件,它会下载纯文本文件。
我的 bootstrap.php :
Plugin::load('CakePdf', array('bootstrap' => true, 'routes' => true));
my routes.php: .......
Router::scope('/users/view', function ($routes) {
$routes->extensions('pdf');
$routes->connect('/view/*', ['controller' => 'Users', 'action' => 'view']);
$routes->fallbacks('InflectedRoute');
});
Router::scope('/', function ($routes) {
......
一切都很好,但是当我在浏览器中导航到这个时:
/cakephp/users/view/5.pdf
我没有得到正确的PDF文件,而是我下载了这样的文本文件: (查看ctp似乎有效)
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title>
Users\pdf </title>
<link rel="stylesheet" href="http://localhost/fct/css/style.css"/></head>
<body>
<h2>Informe PDF</h2>
<div id="container">
<div id="content">
<div class="users view">
<h2>User</h2>
<dl>
<dt>Id</dt>
<dd>
2
</dd>
<dt>Username</dt>
<dd>
tutor666
</dd>
<dt>Created</dt>
<dd>
8/5/16, 7:34 PM
</dd>
<dt>Modified</dt>
<dd>
8/5/16, 7:34 PM
</dd>
</dl>
</div>
</div>
</div>
</body>
</html>
所以也许我的 router.php 错了?...
Router::scope('/users/view', function ($routes) { $routes->extensions('pdf'); $routes->connect('/view/*', ['controller' => 'Users', 'action' => 'view']); $routes->fallbacks('InflectedRoute');
审查cakepdf文档似乎“/ cakephp / users / view / 5.pdf”是正确的方法....但它仍然下载文本文件而不是PDF文件。感到绝望!
该文件应该是'User_15.pdf'但是'15 .pdf,所以这段代码可能不起作用:
UsersController:View(): $this->viewBuilder()->options([ 'pdfConfig' => [ 'orientation' => 'portrait', 'filename' => 'User_' . $id . '.pdf' ] ]);
我查看调试历史并说“GET 200 application / pdf” 但正如您在上面所见,我下载了一个文本/文本标题。
答案 0 :(得分:0)
以下是我实现CakePdf的方法。我使用DomPdf,因为它可以通过composer安装。
步骤1.安装cakepdf插件
composer require friendsofcake/cakepdf
步骤2.安装DomPdf Engind
composer require dompdf/dompdf
步骤3.确保在AppController.php中加载了RequestHandler组件([rootdir] /src/AppController.php)
public function initialize()
{
parent::initialize();
$this->loadComponent('RequestHandler');
}
步骤4.在bootstrap.php中启用CakePdf插件
Plugin::load('CakePdf', ['bootstrap' => true]);
步骤5.在routes.php中设置适当的路线
Router::scope('/', function (RouteBuilder $routes) {
$routes->extensions(['pdf']);
/** Other route setup **/
$routes->fallbacks(DashedRoute::class);
});
步骤6.在Templates / Layouts文件夹下创建一个pdf文件夹,并创建一个pdf.ctp文件以包含以下内容
<?= $this->fetch('content'); ?>
以上作为pdf的空白布局。您可以使用适合您案例的任何标记
步骤7.在模板文件夹中,您要为用户生成pdf(我假设[rootdir] / Templates / Users /),创建一个pdf文件夹,然后在pdf文件夹中创建一个视图文件(即[rootdir] /Templates/Users/pdf/view.ctp)。这将包含视图的标记。 对于此示例,请使用
<?= $show;?>
步骤8.现在在您的控制器功能中(假设视图也是如此)。它应该包含以下
public function view () {
/** I'm only displaying "text" on my pdf file **/
$show = "text";
$this->viewBuilder()->options([
'pdfConfig' => [
'engine' => 'CakePdf.DomPdf',
'orientation' => 'portrait',
'filename' => 'Pdf view'
/** Other config options can go here**/
]
]);
$this->set(compact('show'));
$this->set('_serialize', ['show']);
}
步骤9.将浏览器指向[webpath] /users/view.pdf,你应该有一个显示“text”的pdf文件
您可以根据自己的需要进行调整
干杯。