【问题标题】:laravel-snappy: file was not createdlaravel-snappy:文件未创建
【发布时间】:2018-07-19 20:05:26
【问题描述】:

目前,鉴于没有发生重大变化,我正在尝试追查此问题的根源。

但目前我目前使用 laravel-snappy 生成 pdf,直到现在我突然收到以下错误:

未创建文件“C:\Users\ADMINI~1\AppData\Local\Temp\knp_snappy5a7d3011c11883.41249127.pdf”(命令:“C:\Program Files\wkhtmltopdf\bin\wkhtmltopdf”--lowquality- -images --enable-javascript --javascript-delay "10" "C:\Users\ADMINI~1\AppData\Local\Temp\knp_snappy5a7d3011b9a179.91650543.html" "C:\Users\ADMINI~1\AppData\Local \Temp\knp_snappy5a7d3011c11883.41249127.pdf")。

不幸的是,它没有告诉我为什么没有创建它。此时,错误处理程序指向返回此错误的特定行:

if (!$this->fileExists($output)) {
    throw new \RuntimeException(sprintf(
        'The file \'%s\' was not created (command: %s).',
        $output, $command
    ));
}

这一行来自这个文件:vendor\knplabs\knp-snappy\src\Knp\Snappy\AbstractGenerator.php

我的 wkhtmltopdf 二进制文件位于正确的位置,并且响应这些文件的设置没有任何变化。是的,目前这些文件在 Windows Server 平台上托管和提供。

我的 snappy 配置:

<?php

return array(

    'pdf' => array(
        'enabled' => true,
        'binary' => '"C:\Program Files\wkhtmltopdf\bin\wkhtmltopdf"',
        'timeout' => false,
        'options' => array(),
        'env'     => array(),
    ),
    'image' => array(
        'enabled' => true,
        'binary'  => '"C:\Program Files\wkhtmltopdf\bin\wkhtmltoimage"',
        'timeout' => false,
        'options' => array(),
        'env'     => array(),
    ),

);

我的文件是通过我的控制器生成的:

  public function downloadPDF(Shipment $shipment) {
      $shipment_details = $shipment->shipment_details;
      $shipment->print_date = Carbon::now();
      $shipment->save();

      $pdf = PDF::loadView('shipments.pdf', compact('shipment','shipment_details'))
                    ->setOption('images', true)
                    ->setOption('enable-javascript', true)
                    ->setOption('javascript-delay', 10);
      return $pdf->download('shipment'.$shipment->uuid.'.pdf');

      $shipment->print_date = Carbon::now();
      $shipment->save();
  }

【问题讨论】:

  • 我遇到了同样的问题...
  • 实际上,如果你在终端中粘贴命令,看起来 wkhtmltopdf 正在尝试发出 HTTP 请求而不是读取路径,我也建议你使用 vanilla snappy 而不是 laravel -snappy,它比 laravel-snappy 维护得更好,最后一次提交是在 2016 年......我今晚已经完成了足够的编程,明天我会找到 windows 的答案
  • 你也可以在 Linux 下使用 Docker,一切正常。用choco安装它

标签: php laravel laravel-5 wkhtmltopdf laravel-snappy


【解决方案1】:

发布此内容以防其他人在谷歌上搜索遇到同样的问题,并且他们不喜欢“只在 Linux 中执行”的公认答案

对我来说,这是因为没有安装 Visual C++ 2013 - 在命令行中运行该文件时出现了有关缺少包含在 redist 中的 dll 的错误。

【讨论】:

  • 感谢您的更新!事实上,公认的答案并不是最好的,但它确实有效......
【解决方案2】:

解决此问题的最简单方法是执行原始命令,wkhtmltopdf 在 Linux/Windows 上没有相同的命令行参数,这意味着 snappy 包装器仅适用于 amd64,并且在与 64 位 Windows 一起使用时会失败可执行文件。

exec("C:/path/to/wkhtmltopdf.exe path/to/my.html destination/for/my.pdf");

由于这个解决方案很糟糕,而且 wkhtmltopdf 功能在 windows 上受限,我强烈建议你使用 docker 部署,或者只在 Linux 下开发。否则你将无法使用多重功能,如 pdf 页脚、pdf 编码 utf-8 等等......

这里有一个tutorial,关于如何在 laravel 中使用 docker compose!

【讨论】:

    猜你喜欢
    • 2019-03-08
    • 2016-01-23
    • 2018-07-20
    • 1970-01-01
    • 2016-01-27
    • 1970-01-01
    • 1970-01-01
    • 2019-07-19
    • 1970-01-01
    相关资源
    最近更新 更多