首页 > 解决方案 > 如何在 laravel 中从 PDF 上传生成缩略图

问题描述

我正在尝试生成我在 laravel 中上传的 PDF 的缩略图,缩略图应该是 PDF 的第一页。现在我正在手动上传图像以制作这样的缩略图:

if (request()->has('pdf')) {
            $pdfuploaded = request()->file('pdf');
            $pdfname = $request->book_name . time() . '.' . $pdfuploaded->getClientOriginalExtension();
            $pdfpath = public_path('/uploads/pdf');
            $pdfuploaded->move($pdfpath, $pdfname);
            $book->book_file = '/uploads/pdf/' . $pdfname;
            $pdf = $book->book_file;
        }

if (request()->has('cover')) {
            $coveruploaded = request()->file('cover');
            $covername = $request->book_name . time() . '.' . $coveruploaded->getClientOriginalExtension();
            $coverpath = public_path('/uploads/cover');
            $coveruploaded->move($coverpath, $covername);
            $book->card_image = '/uploads/cover/' . $covername;
            
        }

在输入许多我想自动生成缩略图的数据时,这可能会很乏味。我搜索了很多答案,但找不到特定的 laravel。我尝试使用 ImageMagic 和 Ghost 脚本,但找不到解决方案和适当的角色来实现。

标签: phplaravelpdflaravel-controller

解决方案


抱歉,还不能评论!您可以使用spatie/pdf-to-image在文件上传时将第一页解析为图像并将其存储在您的存储中并将链接保存在您的数据库中。

首先,您需要拥有php-imagickghostscript安装和配置。对于ghostscript安装问题,您可以参考this。然后添加包composer require spatie/pdf-to-image

根据您的代码示例:

if (request()->has('pdf')) {
  $pdfuploaded = request()->file('pdf');
  $pdfname = $request->book_name . time() . '.' . $pdfuploaded->getClientOriginalExtension();
  $pdfpath = public_path('/uploads/pdf');
  $pdfuploaded->move($pdfpath, $pdfname);
  $book->book_file = '/uploads/pdf/' . $pdfname;
  $pdf = $book->book_file;

  $pdfO = new Spatie\PdfToImage\Pdf($pdfpath . '/' . $pdfname);
  $thumbnailPath = public_path('/uploads/thumbnails');
  $thumbnail = $pdfO->setPage(1)
    ->setOutputFormat('png')
    ->saveImage($thumbnailPath . '/' . 'YourFileName.png');
  // This is where you save the cover path to your database.
}

推荐阅读