2

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

但是目前我目前使用 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();
  }
4

2 回答 2

2

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

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

于 2020-03-12T04:55:00.570 回答
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 等等......

这是一个关于如何使用 docker compose for laravel的教程!

于 2018-02-17T23:39:22.680 回答