5

我正在使用 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 中是我不确定的。

4

2 回答 2

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'));
    }
于 2015-06-08T07:20:29.807 回答
1

毕竟,这在 C5 中似乎是可能的,使用文件检查器:

任何时候将文件导入 Concrete5(通过 File Importer 类的实例发生),它都可以通过可选的文件检查器运行,这是一个 PHP 类,可以对特定类型的文件执行附加操作上传或重新扫描

有关文件检查器的更多信息和实现示例可以在 C5 文档中找到。

这个 Concrete5 论坛讨论中,似乎有人使用此功能来构建您想要构建的内容,这是一个使用 ImageMagick 的 PDF 缩略图生成器。

该用户的示例代码做了两件事。首先,它向正在运行的 C5 实例注册一个新的自定义文件检查器。然后,您的自定义检查器库将添加到项目中。

于 2015-05-14T12:11:02.520 回答