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.

Моя конфигурация для мгновенного:

<?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();
  }

person Matthew    schedule 09.02.2018    source источник
comment
У меня такая же проблема ...   -  person MathieuAuclair    schedule 16.02.2018
comment
На самом деле, если вы вставляете команду в терминал, похоже, что wkhtmltopdf пытается сделать HTTP-запрос вместо чтения пути, также я рекомендую вам использовать vanilla snappy вместо laravel-snappy, он намного лучше поддерживается, чем laravel-snappy, последний коммит которого был сделан в 2016 году ... Сегодня вечером я сделал достаточно программирования, завтра Найду ответ для windows   -  person MathieuAuclair    schedule 16.02.2018
comment
вы также можете работать с Docker под Linux, все работает нормально. установите его с помощью choco   -  person MathieuAuclair    schedule 16.02.2018


Ответы (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 и многое другое ...

Вот руководство по использованию docker compose для laravel!

person MathieuAuclair    schedule 17.02.2018

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

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

person Healyhatman    schedule 12.03.2020
comment
Спасибо за обновления! Действительно, принятый ответ был не лучшим, но он сработал ... - person MathieuAuclair; 24.05.2020