Concrete5: установить миниатюру файла для сгенерированного изображения (например, для PDF)

Я использую Concrete5, и я пытаюсь отобразить эскизы для различных загруженных файлов. Хотя некоторые из них могут быть изображениями, большинство из них являются PDF-файлами.

В настоящее время я использую:

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

Я бы предпочел создать миниатюру PDF-файлов меньшего размера, например, используя ghostscript в фоновом режиме. Во встроенном файловом менеджере отображается как минимум значок PDF. Это было бы неоптимальным вариантом, но все же лучше, чем ничего не показывать, чтобы показать, что мы имеем дело с PDF.

Как я могу получить доступ к встроенным эскизам? И, что более важно, как я могу правильно перезаписать их для определенных типов файлов, когда они загружены?

РЕДАКТИРОВАТЬ:

Я наткнулся $file->getThumbnailURL('type'); и создал тип для моих собственных целей. Как бы вы автоматически создали такой эскиз при загрузке файла? Я, вероятно, могу понять, как сгенерировать файл на простом PHP, но я не уверен в его сохранении в Concrete5.

2 ответа

Решение

В итоге вот как я это сделал.

Я начал с создания нового типа миниатюр в методе настройки контроллера моего пакета следующим образом:

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

Затем я создал класс mypackage/src/document_processing/pdfthumbnails.php со следующим содержанием:

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

И тогда я подключился к on_file_version_add событие в контроллере моего пакета:

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

...

    public function on_start() {
        Events::addListener('on_file_version_add', array(new Pdfthumbnails(), 'processPDFThumbnails'));
    }

В конце концов, это возможно в C5, используя файловые инспекторы:

Каждый раз, когда файл импортируется в Concrete5 (что происходит через экземпляр класса File Importer), его можно запускать с помощью необязательного инспектора файлов, который является классом PHP, который может выполнять дополнительные операции с файлами определенного типа, когда они загружен или повторно проверен

Дополнительную информацию и примеры реализации файловых инспекторов можно найти в документации C5.

В этом обсуждении на форуме Concrete5 кто-то, кажется, использовал эту функцию, чтобы создать именно то, что вы хотите создать, генератор миниатюр для PDF-файлов с использованием ImageMagick.

Пример кода этого пользователя делает две вещи. Во-первых, он регистрирует новый пользовательский инспектор файлов с запущенным экземпляром C5. Затем ваша пользовательская библиотека инспекторов добавляется в проект.

Другие вопросы по тегам