laravel-snappy: 文件未创建

laravel-snappy: file was not created

目前,我正在尝试追踪此问题的来源,因为没有任何重大更改。

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

The file 'C:\Users\ADMINI~1\AppData\Local\Temp\knp_snappy5a7d3011c11883.41249127.pdf' was not created (command: "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 服务器平台上托管和提供。

我的 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 在 Linux/Windows 上没有相同的命令行参数,这意味着 snappy wrapper 仅适用于 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 的方法!

张贴这个以防其他人谷歌搜索有同样的问题,并且他们不喜欢 "just do it in Linux"

接受的答案

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