Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Concrete5: set File thumbnail to generated image (e.g. for PDFs)

I'm using Concrete5, and I'm trying to display thumbnails for various uploaded files. While some of these might be images, the majority are PDFs.

I'm currently using:

<?php
$file = File::getByID($fID);
$imageHelper = Core::make('helper/image');
try {
    $imageHelper->outputThumbnail($file, 200, 200);
} catch(InvalidArgumentException $e) { ?>
    <img src='https://placehold.it/200x200'>
<?php } ?>

I'd much prefer to somehow create a smaller thumbnail of PDF files, for example by using ghostscript in the background. In the built-in file manager, at least a PDF icon is displayed. That would be a non-optimal option, but still better than not displaying anything to signify that we're dealing with a PDF..

How can I access the built-in thumbnails? And, more importantly, how can I properly overwrite them for certain file-types when they are uploaded?

EDIT:

I came across $file->getThumbnailURL('type'); and created a type for my own purposes. How would you automatically generate such a thumbnail when a file is uploaded? I can likely figure out how to generate the file with plain PHP, but storing it in Concrete5 is something I'm unsure about.

like image 379
Joost Avatar asked Oct 20 '22 11:10

Joost


1 Answers

In the end, here's how I did it.

I started off by creating a new thumbnail type in the configure method of my package's controller, as follows:

use Concrete\Core\File\Image\Thumbnail\Type\Type;

...

public function configure($pkg) {
    ...

    $thumbnailType = new Type();
    $thumbnailType->setName(tc('ThumbnailTypeName', 'PDF Thumbnails'));
    $thumbnailType->setHandle('pdfthumbnails');
    $thumbnailType->setWidth(200);
    $thumbnailType->setHeight(200);
    $thumbnailType->save();
}

Then I created a class mypackage/src/document_processing/pdfthumbnails.php with the following contents:

namespace Concrete\Package\Mypackage\Src\DocumentProcessing;

use Core;
use File;
use Concrete\Core\File\Image\Thumbnail\Type\Type;

class Pdfthumbnails {

    public function processPDFThumbnails($fv) {
        $fi = Core::make('helper/file');
        $fvObj = $fv->getFileVersionObject();
        $ext = $fi->getExtension($fvObj->getFilename());
        $file = $fvObj->getFile();
        if ($ext == 'pdf') {
            $type = Type::getByHandle('pdfthumbnails');
            $basetype = $type->getBaseVersion();
            $thumbpath = $basetype->getFilePath($fvObj);

            $fsl = $file->getFileStorageLocationObject()->getFileSystemObject();
            $fre = $fvObj->getFileResource();
            // this requires sufficient permissions..
            // depending on your setup, reconsider 0777
            mkdir('application/files'.dirname($thumbpath), 0777, true);
            exec('gs -o application/files'.escapeshellarg($thumbpath).' -dPDFFitPage -sDEVICE=png16m -g200x200 -dLastPage=1 -f application/files/'.escapeshellarg($fre->getPath()));
        }
    }
}

And then I hooked into the on_file_version_add event in my package's controller:

use Concrete\Package\Mypackage\Src\DocumentProcessing\Pdfthumbnails;

...

    public function on_start() {
        Events::addListener('on_file_version_add', array(new Pdfthumbnails(), 'processPDFThumbnails'));
    }
like image 181
Joost Avatar answered Oct 27 '22 07:10

Joost