Imagick」タグアーカイブ

CentOSでのphp-imagickインストール

CentOSでのphp-imagickのインストールに少々手こずったので、備忘録として。

  • phpのバージョン: 5.3.x
  • ImageMagickのバージョン: 6.7.2.x
  • php-imagickのバージョン: 3.3.0

yumから、下記のパッケージはインストール済みです。

  • ImageMagick
  • ImageMagick-devel
  • ImageMagick-perl

PECLからphp-imagickをインストールしようとすると以下。

# pecl install imagick
downloading imagick-3.3.0.tgz ...
Starting to download imagick-3.3.0.tgz (179,978 bytes)
......................................done: 179,978 bytes
17 source files, building
...
/var/tmp/imagick/imagick.c:3299: error: ‘ZEND_MOD_END’ undeclared here (not in a function)

検索すると、「pcreなどがPHPcoreに統合されたために」、などが見つかる。
ソースコードの該当の箇所を修正する必要があると考え、別の方法をとることに。

PECLでローカルにダウンロードして、makeすると同様のエラーが出ることを確認する。

$ mkdir ~/imagick
$ cd ~/imagick
$ sudo pecl download imagick
Starting to download imagick-3.3.0.tgz (179,978 bytes)
......................................done: 179,978 bytes
File /home/***/imagick/imagick-3.3.0.tgz downloaded
$ tar xvfz imagick-3.3.0.tgz
$ cd imagick-3.3.0
$ sudo phpize
$ sudo ./configure
$ sudo make
...
/home/***/imagick/imagick-3.3.0/imagick.c:3299: error: ‘ZEND_MOD_END’ undeclared here (not in a function)
make: *** [imagick.lo] エラー 1

そして、imagick.cの、該当行を修正。
(“ZEND_MOD_END”は存在しない参照なので、”{NULL, NULL, NULL}”とする)

3298 #endif
3299         // ZEND_MOD_END
3300         {NULL, NULL, NULL}
3301 };
3302 #endif

改めて、makeからインストールを続行。
php.iniには「extension=imagick.so」を追加する。

$ sudo make
...
----------------------------------------------------------------------

Build complete.
Don't forget to run 'make test'.
$ sudo make test
$ sudo make install
$ sudo vi /etc/php.ini
$ sudo service httpd restart
httpd を停止中:                                            [  OK  ]
httpd を起動中:                                            [  OK  ]

インストールの確認として、以下で「imagick」の行を探す。

$ php -m | grep imagick
imagick

見つかれば、インストールは無事に完了している。

画像をA4のPDFファイルに変換するPHPスクリプト

任意の画像をA4サイズのPDFに変換するPHPスクリプトのメモです。

ブラウザ上で、アップロードした画像をPDFに変換するスクリプトを作成する必要があり、その一部分をメモとして残します。
解像度は100dpiや150dpiを超える値は時間が非常にかかり、サーバにも負荷をかけるので注意が必要です。

以下では、’output.pdf’というPDFファイルに出力しています。

// ファイルの書き出し
$image->writeImage('output.pdf');

または、以下のようなコードで、作成したPDFファイルをそのまま表示することも可能です。

// ファイルの表示
header('Content-type: application/pdf');
echo $image;

以下が、コードの全体です。

<?php
// JPG画像のPDFへの変換

// 初期値の設定
$img  = 'lenna.jpg'; // 読み込む画像
$dpi  = 100;         // PDFの解像度 [dpi]
$w    = 210.0;       // PDFの横幅 [mm]
$h    = 297.0;       // PDFの縦幅 [mm]

// mm -> px
$pw  = intval($w/25.4*$dpi);
$ph  = intval($h/25.4*$dpi);

// 画像の読み込み
$image = new Imagick();
$image->setResolution($dpi, $dpi);
$image->setPage($pw, $ph, 0, 0);
$image->readImage($img);

// 画像の再サンプル
$image->resampleImage($pw, $ph, imagick::FILTER_UNDEFINED, 1);
$image->setImageFormat('pdf');

// ファイルの書き出し
$image->writeImage('output.pdf');

// ファイルの表示
/*
header('Content-type: application/pdf');
echo $image;
*/
?>