laravel-snappy: 文件未创建
laravel-snappy: file was not created
目前,我正在尝试追踪此问题的来源,因为没有任何重大更改。
但目前我使用 laravel-snappy 生成 pdf,直到现在突然收到以下错误时我才遇到问题:
The file 'C:\Users\ADMINI~1\AppData\Local\Temp\knp_snappy5a7d3011c11883.41249127.pdf' was not created (command: "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 服务器平台上托管和提供。
我的 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 wrapper 仅适用于 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 关于如何为 laravel 使用 docker compose 的方法!
张贴这个以防其他人谷歌搜索有同样的问题,并且他们不喜欢 "just do it in Linux"
接受的答案
对我来说,这是因为未安装 Visual C++ 2013 - 运行命令行中的文件向我提供了有关缺少包含在 redist 中的 dll 的错误。
目前,我正在尝试追踪此问题的来源,因为没有任何重大更改。
但目前我使用 laravel-snappy 生成 pdf,直到现在突然收到以下错误时我才遇到问题:
The file 'C:\Users\ADMINI~1\AppData\Local\Temp\knp_snappy5a7d3011c11883.41249127.pdf' was not created (command: "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 服务器平台上托管和提供。
我的 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 wrapper 仅适用于 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 关于如何为 laravel 使用 docker compose 的方法!
张贴这个以防其他人谷歌搜索有同样的问题,并且他们不喜欢 "just do it in Linux"
接受的答案对我来说,这是因为未安装 Visual C++ 2013 - 运行命令行中的文件向我提供了有关缺少包含在 redist 中的 dll 的错误。