やろうとしていること
・Docker環境内にImageMagickをインストール
・PHP(Laravel)でPDFを画像に変換
環境情報
PHP:8.1
Laravel:10.22.0
Dockerfileへの記述
Docker環境内にimagemagickをインストール
phpのモジュールにImagickを追加
RUN apt-get update \
&& apt-get install -y \
libmagickwand-dev imagemagick \
&& pecl install imagick \
&& docker-php-ext-enable imagick
Dockerの起動し直し
// 起動しているコンテナを停止
docker-compose stop
// 過去のコンテナを削除
docker rm docker ps -a -q
// dockerイメージの一覧表示
docker images
// 削除するイメージを選んで削除
docker rmi 【IMAGE ID】
// 起動し直し
docker-compose up -d
// 起動したコンテナの中に入る
docker-compose exec app bash
// ImageMagickのバージョン確認
convert -version
// imagickがphpモジュールに含まれているかチェック
php -m | grep imagick
→imagick
PHPファイルにImagickの記述
サンプルコード
↓
use Imagick;
$im = new Imagick();
$file_path = storage_path('app/public/pdf/pdf_sample.pdf');
//画像を生成したいPDFを読み込む
$im->readImage($file_path);
//ページ数を取得する
$totalPage = $im->getImageScene();
for ($i = 0; $i <= $totalPage; $i++) {
//PDFのページ
$im->setImageIndex($i);
//サムネイルサイズ 640pxに収める
$im->thumbnailImage(640, 640, true);
//シャープ
$im->sharpenImage(0, 1);
//生成
$im->writeImage('out_' . $i . '.jpg');
}
上記を試そうとすると。。。
pdf脆弱性に対応した権限エラーが発生します
attempt to perform an operation not allowed by the security policy `PDF' @ error/constitute.c/IsCoderAuthorized/421
それを次の項目で対応します。
Imagemagick の gs pdf脆弱性対応の無効化
vi /etc/ImageMagick-6/policy.xml
下記の箇所を削除する
<policy domain="coder" rights="none" pattern="PS" />
<policy domain="coder" rights="none" pattern="PS2" />
<policy domain="coder" rights="none" pattern="PS3" />
<policy domain="coder" rights="none" pattern="EPS" />
<policy domain="coder" rights="none" pattern="PDF" />
<policy domain="coder" rights="none" pattern="XPS" />
ここで権限を管理しています。コメントアウトでもOK。
// コンテナの中から出る
exit
// コンテナの停止
docker-compose stop
// コンテナの起動
docker-compose up -d
もう一度PHPファイルのImagickの挙動を確認すると。。。
↓
問題なくPDFが画像に変換されました!
終わりです。
補足
imagickでjpegに変換すると背景が黒色になるので
pngに変換してからの工夫が必要。
https://www.codelab.jp/blog/?p=2346
参考
・Imagemagick の gs pdf脆弱性対応の無効化
https://gordiustears.net/imagemagick-の-gs-pdf脆弱性対応の無効化/
・Class 'Imagick' not found Error
https://hapicode.com/php/imagick-error.html#imagick-%E3%83%A2%E3%82%B7%E3%82%99%E3%83%A5%E3%83%BC%E3%83%AB%E5%85%A5%E3%81%A3%E3%81%A6%E3%82%8B%E3%81%8B%E7%A2%BA%E8%AA%8D
・PHPのImagickで「Unable to load dynamic library ‘imagick.so’」とWarningが出て読み込まなくなった件
https://uteee.com/system/5930/
Amazon Linux 2 に ImageMagick 7 をインストールする(PHP)
https://qiita.com/qwe001/items/110bc0a12d56052aeb01