laravel-snappy: файл не был создан

В данный момент я пытаюсь выяснить, откуда возникла эта проблема, учитывая, что ничего существенного не изменилось.

Но в настоящее время я использую 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();
  }

1 ответ

Решение

Самый простой способ обойти это - выполнить необработанную команду: wkhtmltopdf не имеет того же параметра командной строки в Linux/Windows, это означает, что оболочка snappy работает только с amd64 и перестает работать, когда она используется с исполняемым файлом 64-битных окон.

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

Поскольку это решение ужасно и функциональность wkhtmltopdf ограничена в Windows, я настоятельно рекомендую вам развернуть его с помощью Docker или просто разрабатывать под Linux. В противном случае вы не сможете использовать несколько функций, таких как нижний колонтитул pdf, кодировка pdf utf-8 и многое другое...

Вот учебник о том, как использовать docker compose для laravel!

Публикация этого сообщения на случай, если у кого-то еще при поиске в Google возникнет такая же проблема, и им не нравится принятый ответ "просто сделай это в Linux"

Для меня это было из-за того, что Visual C++ 2013 не был установлен - запуск файла в командной строке дал мне ошибку об отсутствующих dll, которые были включены в redist.

Другие вопросы по тегам