2015-05-13 38 views
5

我使用的是Concrete5,我試圖顯示各種上傳文件的縮略圖。雖然其中一些可能是圖像,但大多數是PDF。具體5:將文件縮略圖設置爲生成的圖像(例如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中是我不確定的事情。

+0

我不知道C5是否支持這個有趣的問題。如果不能解決問題,您可以考慮自己處理縮略圖生成,生成並將它們存儲在單獨的目錄中。 –

+0

@Pekka我確實認爲這有點..我注意到有一個'on_file_add'事件掛鉤。你會如何建議將縮略圖與文件相關聯?根據文件ID創建一個目錄結構?或者我可以以某種方式設置自定義縮略圖類型的位置?感謝您提出這個! – Joost

回答

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')); 
    } 
1

這似乎是可能的內部C5畢竟,使用file inspectors

一個文件導入到Concrete5(其通過文件進口商類的實例發生的),可能通過可選的運行的任何時間文件檢查器,這是一個PHP類,可當他們上載或重新掃描文件上督察

的更多信息,並實現示例對特定類型的文件執行其他操作,可以發現in the C5 documentation.

this Concrete5 forum discussion中,有人似乎已經使用此功能來精確構建您想要構建的內容,即使用ImageMagick生成PDF的縮略圖生成器。

該用戶的示例代碼有兩件事。首先,它會註冊一個新的自定義文件檢查器和正在運行的C5實例。然後,您的自定義檢查器庫被添加到項目中。

+1

不錯,看起來很整齊!謝謝。我會試試看,並會回報:) – Joost

+0

我結束了使用這個掛鉤到file_add_version事件,並且工作正常。不過,問題仍然在於實際_storing_生成的縮略圖。這似乎並沒有在那裏解決。 – Joost