1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Docker PHP:8.1 ImageMagick で PDFを画像に変換

Last updated at Posted at 2023-11-02

やろうとしていること

・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

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?