【问题标题】:How to render pdf from HTML using CakePdf? I followed the instructions given in github but getting an error 'Failed to load PDF document'?如何使用 CakePdf 从 HTML 渲染 pdf?我按照 github 中给出的说明进行操作,但收到错误“无法加载 PDF 文档”?
【发布时间】:2023-03-21 20:55:02
【问题描述】:

我使用 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.phpRouter::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'
    ]
]);

我还在src/Templates/abc/pdf/view.ctp 内部创建了view.ctp,并在src/Templates/Layout/pdf/default.ctp 内部创建了default.pdf 布局。

现在当我转到 localhost/abc/view/1.pdf 时,我收到一条错误消息 Failed to load PDF document

Failed to load the PDF document

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

【问题讨论】:

  • 你有'filename' => 'Invoice_' . $id.'.pdf',但你正在寻找localhost/abc/view/1.pdf
  • @Tigger 我不能有我想要的文件名吗!
  • 您可以将文件名设置为您想要的任何有效字符。重新阅读我写的内容。您设置的文件名(作为示例)Invoice_1.pdf,但与1.pdf(您要查找的内容)完全不同。
  • 不,选项是正确的,filename 选项将用于响应的 Content-Disposition 标头中,它与请求 URL 无关。确保您已启用调试模式,并检查您的日志中是否存在可能的错误。还要下载无效的 PDF 并查看其源代码以确定正在生成的输出。
  • 这就是我想知道的'filename'!调试模式已启用,但没有错误日志。下载pdf并在记事本中打开它,它是普通的Html。 @ndm

标签: php pdf cakephp-3.0 wkhtmltopdf cakephp-3.6


【解决方案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。

【讨论】:

  • 你用的是什么版本的 cakephp?我猜是3?它似乎不适用于 4
  • 是的,我使用的是 3.x,不记得是哪一个。我不确定 AdminLTE 包是否与 4.x 兼容
  • 感谢@kuvukala 我正在使用 cakePHP 4 和 AdminLTE 主题,但无法渲染 PDF。使用您的想法,目前我所做的是在我想要打印 PDF 的控制器中重置视图构建器类名称(在我的应用程序中,它只是一个提供 PDF 的控制器),如下所示: public function beforeRender (\Cake\Event\EventInterface $event) { parent::beforeRender($event); if ( $this->getRequest()->getParam('_ext','') === 'pdf' ) { $this->viewBuilder()->setClassName('CakePdf.Pdf'); } }
猜你喜欢
  • 1970-01-01
  • 2018-05-24
  • 2020-03-25
  • 2018-10-05
  • 1970-01-01
  • 1970-01-01
  • 2020-01-20
  • 2016-04-09
  • 1970-01-01
相关资源
最近更新 更多