PHP」タグアーカイブ

ImageMagickを用いたA4サイズのPDF出力

ImageMagickを用いて、画像をA4のPDFに変換する方法を備忘録として。

コマンドconvertに、
・convert -density “解像度(dpi)” -geometry “横幅(px)”x”縦幅(px)” “入力画像名” “出力PDFファイル名”
と指定すると、対応したサイズのPDFファイルが出力される。
PDFファイルは210×297[mm]なので、150dpiであれば、
・横幅:210*150/25.4 ≒ 1240 [px]
・縦幅:297*150/25.4 ≒ 1754 [px]
となり、縦横比を保持する場合のコマンド例は以下となる。

$ convert -density 150 -geometry 1240x1754 input.jpg output.pdf

縦横比を保持しない場合は以下。

$ convert -density 150 -geometry 1240x1754! input.jpg output.pdf

解像度を度々変更し、縦横のpxの算出が面倒な場合には、以下のようなPHPスクリプトを用いる。
(PHPの場合はphp-imagickを用いることも可能だが、ここでは外部プログラムを実行)

<?php
// 指定解像度&サイズのPDF出力

/* -------------------------------------- */
// パラメータ設定
/* -------------------------------------- */
// 画像ファイル名
$f = 'input.jpg';
// 解像度 [dpi]
$dpi = 100;
// 横幅の指定 [mm]
$w = 210;
// 縦幅の指定 [mm]
$h = 297;
/* -------------------------------------- */

/* -------------------------------------- */
// PDFファイルの出力
/* -------------------------------------- */
// [mm] -> [px]
$w = round($w*$dpi/25.4);
$h = round($h*$dpi/25.4);
// コマンド
$cmd = sprintf('convert -density %d -geometry %dx%d! %s output.pdf', $dpi, $w, $h, $f);
// コマンドの実行
exec($cmd);
/* -------------------------------------- */
?>

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;
*/
?>