laravel-snappy:未创建文件

时间:2018-02-09 05:30:34

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

目前,我正试图追踪这个问题出现的原因,因为没有任何重大改变。

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

  

未创建文件'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();
  }

2 个答案:

答案 0 :(得分:2)

将其发布以防其他人使用谷歌搜索存在相同的问题,并且他们不喜欢“仅在Linux中完成”的公认答案

对我来说,这是因为未安装Visual C ++ 2013-在命令行中运行文件给我有关重做程序中包含的缺少dll的错误。

答案 1 :(得分:1)

最简单的解决方法是执行一个原始命令,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关于如何使用docker compose for laravel!