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.