2015-05-13 9 views
5

Ich benutze Concrete5, und ich versuche, Thumbnails für verschiedene hochgeladene Dateien anzuzeigen. Während einige dieser Bilder Bilder sind, sind die meisten PDFs.Concrete5: Datei thumbnail to generated image (z. B. für PDFs)

Ich bin derzeit mit:

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

Ich würde viel lieber eine kleinere Miniatur von PDF-Dateien irgendwie zu schaffen, beispielsweise durch ghost im Hintergrund mit. Im integrierten Dateimanager wird mindestens ein PDF-Symbol angezeigt. Das wäre eine nicht optimale Option, aber immer noch besser, als nichts anzuzeigen, um anzuzeigen, dass es sich um eine PDF handelt.

Wie kann ich auf die integrierten Thumbnails zugreifen? Und, noch wichtiger, wie kann ich sie beim Hochladen für bestimmte Dateitypen richtig überschreiben?

EDIT:

Ich kam in $file->getThumbnailURL('type'); und einen Typ für meine eigenen Zwecke erstellt. Wie würden Sie automatisch solch ein Vorschaubild erstellen, wenn eine Datei hochgeladen wird? Ich kann wahrscheinlich herausfinden, wie man die Datei mit einfachem PHP erzeugt, aber das Speichern in Concrete5 ist etwas, über das ich mir nicht sicher bin.

+0

Ich habe keine Ahnung, ob C5 diese interessante Frage unterstützt. Wenn es nicht klappt, können Sie die Thumbnail-Generierung selbst in Erwägung ziehen, indem Sie sie in einem separaten Verzeichnis generieren und speichern. –

+0

@Pekka Ich habe das für ein bisschen in Betracht gezogen .. Ich habe festgestellt, dass es ein 'on_file_add'-Ereignis gibt. Wie empfehlen Sie, Miniaturansichten mit Dateien zu verknüpfen? Erstellen Sie eine Verzeichnisstruktur basierend auf der Datei-ID? Oder kann ich den Speicherort für benutzerdefinierte Miniaturansichtstypen festlegen?Danke, dass du das gemacht hast! – Joost

Antwort

2

Am Ende, hier ist, wie ich es gemacht habe.

begann ich durch die Schaffung einer neuen Miniaturtyp in der configure Methode meines Pakets Regler aus, wie folgt:

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

Dann habe ich eine Klasse mypackage/src/document_processing/pdfthumbnails.php mit folgendem Inhalt:

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

Und dann hakte ich in das on_file_version_add Ereignis in der Steuerung meines Pakets ein:

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

... 

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

Dies erscheint innerhalb C5 schließlich möglich zu sein, mit file inspectors:

Jedes Mal, wenn eine Datei in Concrete5 importiert wird (die durch eine Instanz der Datei-Importer Klasse geschieht) es über ein optionales ausgeführt werden kann Datei-Inspektor, die eine PHP-Klasse ist, die zusätzliche Operationen auf Dateien eines bestimmten Typs durchführen können, wenn sie hochgeladen sind oder neu gescannt

Weitere Informationen und Beispiele für die Implementierung auf Datei-Inspektoren können gefunden werden in the C5 documentation.

In this Concrete5 forum discussion scheint jemand diese Funktion verwendet zu haben, um genau das zu erstellen, was Sie erstellen möchten, einen Miniaturbildgenerator für PDFs mit ImageMagick.

Der Beispielcode dieses Benutzers macht zwei Dinge. Zuerst wird ein neuer benutzerdefinierter Dateiinspektor mit der ausgeführten C5-Instanz registriert. Dann wird Ihre benutzerdefinierte Inspektorbibliothek zum Projekt hinzugefügt.

+1

Schön, das sieht ziemlich ordentlich aus! Vielen Dank. Ich probiere es aus und melde mich wieder :) – Joost

+0

Ich benutze dies, um das Ereignis file_add_version einzubinden, und das funktioniert gut. Das Problem besteht jedoch weiterhin darin, das generierte Thumbnail zu speichern. Dies scheint dort nicht angesprochen zu werden. – Joost