【a-blog cms】アップロードしたPDFのサムネイルを作成する

はじめに

a-blog cmsではカスタムフィールドやユニットとしてファイルがアップロード出来るようになっているのですが、 PDFのサムネイルが標準で表示できるようになっていません。

デフォルトでは以下ような画像が用意されている



でもやっぱりサムネイルを表示したいという要望は多いと思いますので、今回はHookを使ってサムネイルを登録してみようと思います。

下準備

PDFを画像に変換する為に以下の環境を用意します。インストール方法などは環境により様々なので今回は省略。

imagickはPHPからImageMagickを操作するためのPHP拡張モジュール。
ghostscriptはアドビシステムズのPostSccriptのインタプリタらしい。これがないとPDFを画像に変換できないので注意。


テンプレートのカスタマイズ

今回はエントリーのカスタムフィールドに登録するので
/themes/自分のテーマ/admin/entry/field.html に以下を追記します。 普通のファイルのカスタムフィールドの書き方ですが、一点 {pdfthumbnail} が追加されてます。 これは今回生成するサムネイル画像のパスの変数になります。


<!-- BEGIN pdffile@path:veil -->
<input type="hidden" name="pdffile@old" value="{pdffile@path}" />
<input type="hidden" name="pdffile@secret" value="{pdffile@secret}" />
<input type="hidden" name="pdffile@baseName" value="{pdffile@baseName}" />
<input type="hidden" name="pdffile@fileSize" value="{pdffile@fileSize}" />
 
<label for="input-checkbox-pdffile@edit">
<input type="checkbox" name="pdffile@edit" value="delete" id="input-checkbox-pdffile@edit" /> 削除
</label>
<a href="%{HTTP_ARCHIVES_DIR}{pdffile@path}"><img src="%{HTTP_ARCHIVES_DIR}{pdfthumbnail}" width="100%" /></a><!-- END pdffile@path:veil -->

<input type="file" name="pdffile" />
<input type="hidden" name="field[]" value="pdffile" />
<input type="hidden" name="pdffile:extension" value="file" />
<input type="hidden" name="pdffile@extension" value="pdf" />

ここまで出来るとPDFのアップロードまで出来るようになりました。

Hookを使ってPDFのサムネイル生成

ではPDFのサムネイルを作りたいとおもいます。まずHookを利用できるようにconfig.server.phpを設定します。


define('HOOK_ENABLE', 1);

次に/php/ACMS/User/Hook.phpを開き処理を書いていきます。 使うメソッドはPOSTする前にフックするbeforePostFireを使います。コードは以下のような感じ。


/**
 * POSTモジュール処理前
 * $thisModuleのプロパティを参照・操作するなど
 *
 * @param ACMS_POST $thisModule
 */
public function beforePostFire($thisModule)
{
    if ( !sessionWithContribution() ) return false; // 権限チェック

    $class      = get_class($thisModule);   // モジュールのクラス名取得
    $destDir    = 'thumbnail/';             // サムネイルを保存するディレクトリ名
    $fieldName  = 'pdffile';                // アップロードするPDFのフィールド名
    $thumbnailFieldName = 'pdfthumbnail';   // サムネイル画像の変数名

    // エントリーの作成or更新のみ
    if ( !in_array($class, array(
        'ACMS_POST_Entry_Insert',
        'ACMS_POST_Entry_Update'
    )) ) {
        return false;
    }

    $Post   =& $thisModule->Post;   // POSTデータを取得
    $bid    = $Post->get('bid');
    $cid    = $Post->get('cid');

    if ( !isset($_FILES[$fieldName]['tmp_name']) ) return false;
     
    $source = $_FILES[$fieldName]['tmp_name'];
    if ( !is_readable($source) ) return false;

    $myurl  = $source.'[0]';    // PDFの1ページを指定

    try {
        $image  = new Imagick();
        $image->setResolution(140, 140);    // 解像度を指定
        $image->readimage($myurl);          // PDFの読み込み
        $image->setImageFormat('png');

        ACMS_POST::setupDir(ARCHIVES_DIR.$destDir, intval(config('permission_dir')));                 // 保存先ディレクトリの作成
        $file   = uniqueString().'.png';        // 保存ファイル名
        $dest   = ARCHIVES_DIR.$destDir.$file;  // 保存先

        $image->writeImage($dest);
        $image->destroy();

        // カスタムフィールドに登録する為、POSTデータにサムネイル画像のパスを登録
        $Post->add('field', $thumbnailFieldName);
        $Post->add($thumbnailFieldName, $destDir.$file);
    } catch(Exception $e) {
        echo $e->getMessage();
    }
}


これでPDFをアップロードしてみると上記のようにサムネイルが表示されると思います。 今回はPDFからサムネイルを生成してみましたが、Hookを使うと色々なことが出来ますので是非お試しください。


関連記事

Document Outliner

アウトライン生成ライブラリ、document-outliner をリリースしました

a-blog cmsでSVGを画像プレイスホルダーとして使う

a-blog cms + Varnish 触ってみる

a-blog cms テンプレート解体新書

a-blog cmsで画像のロスレス圧縮をする

Docker + a-blog cms

最新記事

カテゴリー

ハッシュタグ