В данный момент я пытаюсь выяснить, откуда возникла эта проблема, учитывая, что ничего существенного не изменилось.
Но в настоящее время я использую 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();
}
Самый простой способ обойти это — выполнить необработанную команду: 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!
Других решений пока нет …