不能提供PDF文件,获取PDF格式的文本文件

时间:2017-09-10 12:05:01

标签: php cakephp-3.0

在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            &nbsp;
        </dd>

        <dt>Username</dt>
        <dd>
            tutor666            &nbsp;
        </dd>
        <dt>Created</dt>
        <dd>
            8/5/16, 7:34 PM            &nbsp;
        </dd>
        <dt>Modified</dt>
        <dd>
            8/5/16, 7:34 PM            &nbsp;
        </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”  但正如您在上面所见,我下载了一个文本/文本标题。

1 个答案:

答案 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文件

您可以根据自己的需要进行调整

干杯。