0

我使用 composer 安装了 CakePdf 的插件。所以在我的供应商文件夹中,我有 CakePdf 插件和其他依赖项。

我下载了 wkhtmltopdf 并将其安装在一个目录中。目录是C:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe

接下来通过运行./bin/cake plugin load CakePdf -b我添加插件的命令src/application.php

$this->addPlugin('CakePdf', ['bootstrap' => true]);

然后我在config/routes.php之前写了下面的行Router::scope

Router::extensions(['pdf']);

而在config/bootstrap.php

Configure::write('CakePdf', [
    'engine' => [
        'className' => 'CakePdf.WkHtmlToPdf',
        'binary' => 'C:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe',
        'options' => [
            'print-media-type' => false,
            'outline' => true,
            'dpi' => 96
        ],
    ],
]);

现在在我的abc控制器view动作中我写了

$this->viewBuilder()->options([
        'pdfConfig' => [
            'orientation' => 'portrait',
            'filename' => 'Invoice_' . $id.'.pdf'
    ]
]);

我还创建了view.ctpinsidesrc/Templates/abc/pdf/view.ctp和里面的default.pdf布局src/Templates/Layout/pdf/default.ctp

现在当我去的时候localhost/abc/view/1.pdf,我得到一个错误说Failed to load PDF document

未能加载 PDF 文档

我真的很想知道可能出了什么问题以及如何修复它以使其正常工作?

4

1 回答 1

1

就我而言,我在 AppController 的 beforeRender 方法中设置了 AdminLTE 布局和模板文件,因此它在提供视图之前覆盖了我的布局和模板。

我将 AppController 类的 beforeRender 方法更改为如下内容:

    public function beforeRender(Event $event)
    {
        switch ($this->request->params['_ext']) {
          case 'pdf':
            break;
          default:
            $this->viewBuilder()->setTheme('AdminLTE');
            $this->viewBuilder()->setClassName('AdminLTE.AdminLTE');
            break;
        }
    }

CakePdf 插件开始像它应该的那样生成 PDF。

于 2019-07-07T10:06:37.790 回答