Riwaj Chalise
Riwaj Chalise

Reputation: 657

How to generate thumbnail from PDF upload in laravel

I am trying to generate a thumbnail of the PDF I upload in laravel the thumbnail should be the first page of the PDF. Right now I am manually uploading an image to make the thumbnail like this:

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;
            
        }

This can be tedious while entering many data I want to generate thumbnail automatically. I searched many answers but I am not able to find laravel specific. I tried to use ImageMagic and Ghost script but I couldn't find a solution and proper role to implement.

Upvotes: 1

Views: 5889

Answers (1)

Suraj Jadhav
Suraj Jadhav

Reputation: 49

Sorry, can't comment yet! You can use spatie/pdf-to-image to parse the first page as image when file is uploaded and store it in your storage and save the link in your database.

First you need to have php-imagick and ghostscript installed and configured. For issues with ghostscript installation you can refer this. Then add the package composer require spatie/pdf-to-image.

As per your code sample:

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.
}

Upvotes: 2

Related Questions