目前,我正试图追踪这个问题出现的原因,因为没有任何重大改变。
但是目前我正在使用laravel-snappy生成pdfs,直到现在我突然收到以下错误时才发现问题:
未创建文件'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();
}
答案 0 :(得分:2)
将其发布以防其他人使用谷歌搜索存在相同的问题,并且他们不喜欢“仅在Linux中完成”的公认答案
对我来说,这是因为未安装Visual C ++ 2013-在命令行中运行文件给我有关重做程序中包含的缺少dll的错误。
答案 1 :(得分: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等等......
这里有tutorial关于如何使用docker compose for laravel!