我将spatie/pdf-to-image与laravel结合使用来创建已上传pdf文件的缩略图。奇怪的是,代码现在只在某一时刻起作用了,现在却没有。无论pdf包含多少页,$pdf->getNumberOfPages();
始终返回0
。
这是Spatie Pdf类中的构造函数。如您所见,它只是使用imagick的getNumberImages();
public function __construct($pdfFile)
{
if (! filter_var($pdfFile, FILTER_VALIDATE_URL) && ! file_exists($pdfFile)) {
throw new PdfDoesNotExist();
}
$this->imagick = new Imagick($pdfFile);
$this->numberOfPages = $this->imagick->getNumberImages();
$this->pdfFile = $pdfFile;
}
这是我控制器的简化版本:
public function uploadDocument(Request $request) {
$doc = $request->file('document');
$pdf = new \Spatie\PdfToImage\Pdf($doc);
$pages = $pdf->getNumberOfPages();
dd($pdf);
转储的输出为:
Pdf {#315 ▼
#pdfFile: UploadedFile {#236 ▶}
#resolution: 144
#outputFormat: "jpg"
#page: 1
+imagick: Imagick {#407}
#numberOfPages: 0
#validOutputFormats: array:3 [▼
0 => "jpg"
1 => "jpeg"
2 => "png"
]
#layerMethod: 14
#colorspace: null
#compressionQuality: null
}
我知道这一事实在某一点上是有效的,我倾向于将imagick作为罪魁祸首。没有错误,也没有例外。有没有简单的方法可以验证这一理论?
答案 0 :(得分:0)
我知道这很老了,但我认为我发现了问题。我遇到了同样的问题,但仅当我是Illuminate \ Http \ UploadedFile的实例时才会发生。
要解决此问题,实际上我必须将文件保存到本地磁盘(而不是S3或任何其他远程磁盘),然后操作保存的PDF。完美地工作!
这是我的代码示例(注意:由于应用程序中的业务规则,我手动进行了循环。
* generates a PNG preview from a PDF file
* @param UploadedFile $file PDF file to be converted
* @param $historyID integer asset_file_history_id
* @return bool whether or not the preview was successfully created
*/
function generatePreviewImage(UploadedFile $file,$historyID)
{
$file = storage_path('app/'.$file->store('temp'));
try {
$pdf = new Pdf($file);
$pdf->setCompressionQuality(85);
$pdf->setOutputFormat('png');
$pdf->setColorspace(1);
$pageLimit = $pdf->getNumberOfPages() > 10 ? 10: $pdf->getNumberOfPages();
if($pdf->getNumberOfPages() >1) {
//using if to account for possible count of 0, rather than just relying on the loop
for ($i = 1; $i <=$pageLimit; $i++) {
$name = md5(time()) . ".png";
$tempPath = sys_get_temp_dir() . "/" . $name;
//
$pdf->setPage($i)
->saveImage($tempPath);
//
Storage::disk('s3')->put("/preview/{$name}", file_get_contents($tempPath), 'public');
$page = new PreviewImagePage();
$page->url = "preview/{$name}";
$page->asset_file_history_id = $historyID;
$page->save();
}//loop through the pages
}//if
else
{
$name = md5(time()) . ".png";
$tempPath = sys_get_temp_dir() . "/" . $name;
//
$pdf->saveImage($tempPath);
//
Storage::disk('s3')->put("/preview/{$name}", file_get_contents($tempPath), 'public');
$page = new PreviewImagePage();
$page->url = "preview/{$name}";
$page->asset_file_history_id = $historyID;
$page->save();
}//else
}
catch(\Exception $e)
{
dd($e);
// return false;
}
然后,当然,请重新检查并清理所有不需要保存的文件。