
前提・実現したいこと
xamppで Windows 10 Proのパソコンを自宅サーバ化し、そのサーバでpdfファイルをjpgなどの画像ファイルに変換するphpプログラムを動かしたく、ImageMagickやGhostScriptをダウンロードしました。
手順は、GitHubのリポジトリ に示した通りで行いました。
発生している問題・エラーメッセージ
phpinfo();
による出力で、imagickが有効になっていることまでは確認できているのですが、
実際にimagickを利用すると、readImgや他の関数を使ってpdfファイルやjpgファイルを読み込む実験をしても、また、file_get_contents('画像ファイルのパス(フルパスも相対パスも試しました)')の出力を読み込んでも、例えば次のようなエラーを返すばかりです。
<br /> <b>Fatal error</b>: Uncaught ImagickException: Failed to read the file in C:\xampp\htdocs\test3.php:5 Stack trace: #0 C:\xampp\htdocs\test3.php(5): Imagick->readimage('http://localhos...') #1 {main} thrown in <b>C:\xampp\htdocs\test3.php</b> on line <b>5</b><br />
GitHubのリポジトリで「反省」にも示した通り、ImageMagickのバージョンの問題かなとも思っているのですが、実際どうなのでしょうか?
VC15だと、バージョン7未満のImageMagickが公開されていないようで、バージョンダウンもできない状態です。
どうか、どなたかお知恵を貸してください。よろしくお願いいたします。
1. 以下、GitHubのレポジトリのREADME.mdのコピーです。
2.使用環境、ソフト
・Windows 10 Pro
・xampp (PHP 7.2.12) (Control Panelのバージョンはv3.2.2であった)
・ImageMagick-7.0.7-11-vc15-x86
・php_imagick-3.4.3-7.2-ts-vc15-x86
・Ghostscript 9.26 for Windows (32 bit) AGPL licence
・Microsoft Word 2016
3.実験と結果
実験日: 2018/11/25
3-1-1.実験1 端末のサーバ化[1]
①参考サイト[1]に従ってXAMPPをインストールした。
但し、すべてのソフトを選択してインストールした。
また、xamppをインストールしたディレクトリはc:\xampp
である。
②http://localhost/ にアクセスした。
3-1-2.実験1の結果
図3-1-2のようなページが表示された。
図3-1-2
図3-1-2 実験1の結果
3-2-1 実験2 拡張モジュールの確認
①次のようなファイルtest.php[2]を作成し、C:\xampp\htdocs
にコピーした。このディレクトリにコピーすることは、サーバへのアップロードに相当する。
php:3
1<?php 2 3$im = new Imagick(); 4//画像を生成したいPDFを読み込む 5$im->readImage('hoge.pdf'); 6//ページ数を取得する 7$totalPage = $im->getImageScene(); 8 9for ($i = 0; $i <= $totalPage; $i++) { 10 //PDFのページ 11 $im->setImageIndex($i); 12 //サムネイルサイズ 640pxに収める 13 $im->thumbnailImage(640, 640, true); 14 //シャープ 15 $im->sharpenImage(0, 1); 16 //生成 17 $im->writeImage('out_' . $i . '.jpg'); 18} 19 20$im->destroy(); 21 22?> 23
②Microsoft Word 2016で「hoge.pdf」とだけ書いた文章hoge.pdfを作成し、C:\xampp\htdocs
にコピーした。
③WWWブラウザで、サーバにアップロードしたtest.phpを閲覧した。
3-2-2.実験2の結果
実験2の結果、次のようにFatal errorが表示された。
> <br /> > <b>Fatal error</b>: Uncaught Error: Class 'Imagick' not found in C:\xampp\htdocs\test.php:3 > Stack trace: > #0 {main} > thrown in <b>C:\xampp\htdocs\test.php</b> on line <b>3</b><br />
このことから、xamppによって作られたサーバにはImageckというクラスが用意されていない、即ちImageMagickがインストールされていないということが分かった。
3-3-1.実験3 ImageMagickを利用可能化[2]
①次のようなisTs.php[3]を作成し、c:\xampp\htdocs
にコピーし、 http://localhost/isTs.php にアクセスし、
・php versionを確認した。
・Compiler versionを確認した。
・Architectureを確認した。
・thread safeが有効か否かを確認した。
php:3
1<?php 2print phpinfo(); 3?>
②GhostScriptをC:\xampp\gs\gs9.26
にインストールした。
③ImageMagickの公式ダウンロードページにアクセスし、ImageMagick-7.0.7-11-vc15-x86.zip をダウンロードした。
vc15はxamppに入っているphpのコンパイラのバージョンであり、x86は、xamppに入っているソフトはみな32 bitで動作するものであるからである。(表3-3-2-1を確認されたい)
そして展開し、中身をc:\xampp\ImageMagick
にすべてコピーした。
④Imagickの公式ダウンロードページにアクセスし、3.4.3
ディレクトリを選択し、php_imagick-3.4.3-7.2-ts-vc15-x86.zip
を探した。
7.2は、phpのバージョンが7.2.nであることを、tsはthread safeが有効であること、vc15はコンパイラのバージョン、x86は32 bitを意味する。
表3-3-2-1と対応させて正しい名前のzipファイルを選ばないと、実験が正常に行えない。
参考サイト[2]に示されたダウンロードページにphp_imagick-3.4.3-7.2-ts-vc15-x86.zip
は存在しなかった。しかし、別のページ[4]には存在したので、それをダウンロードした。
展開後php_imagick.dll
をC:\xampp\php\ext
へコピーし、
CORE_RL_
で始まるファイルをすべてC:\xampp\ImageMagick\bin\
に上書きコピーした。
⑤C:\xampp\php\php.ini
の
;;;;;;;;;;;;;;;;;;;;;;
; Dynamic Extensions ;
;;;;;;;;;;;;;;;;;;;;;;
のところにextension=
が並んでいるところがあるので、そこにextension=php_imagick.dll
を加筆した。
⑥図3-3-1のように環境変数を指定した。
図3-3-1 環境変数の設定
3-3-2.実験3の結果
①の結果、表3-3-2-1のようなことが分かった。
<Div Align="center">表3-3-2-1 インストールされたphpの仕様</Div>PHP Version | 7.2.12 |
---|---|
Compiler | MSVC15 (Visual C++ 2017) |
Architecture | x86 |
Thread Safety | enabled |
②~⑥をしたうえでhttp://localhost/isTs.php
にアクセスした結果、①の段階では表示されなかった、表3-3-2-2(省略します。リポジトリを見てください)が表示された。
これは、ImageMagickのモジュールが正常に読み込まれたことを意味する。
そしてhttp://localhost/test.php
にアクセスすると、
> <br /> > <b>Fatal error</b>: Uncaught ImagickException: UnableToOpenBlob 'hoge.pdf': No such file or directory @ error/blob.c/OpenBlob/3315 > in C:\xampp\htdocs\test.php:5 > Stack trace: > #0 C:\xampp\htdocs\test.php(5): Imagick->readimage('hoge.pdf') > #1 {main} > thrown in <b>C:\xampp\htdocs\test.php</b> on line <b>5</b><br />
のように表示され、エラーの内容が実験2のときとは異なるものとなった。
このことにより、phpプログラム自体は書き直さなくてはいけないが、モジュール自体は動作しているということが改めて確認された。
3-4 実験4 phpファイルの読み込み とその結果
ImageMagickをphpで動かし、pdfファイルを読み込むことのできるphpプログラムのコードがネットのどこかに落ちていないか探した。
しかし、どの関数を使ってpdfファイルやjpgファイルを読み込む実験をしても、file_get_contents()の出力を読み込んでも、エラーを返すばかりであった。
4.反省
参考サイト[5][6]によると、ImageMagickをダウンロードしたら、適切な方法でコンパイルしてconfigure.exeなるファイルを作る必要があり、しかも今回インストールしたImageMagick7ではだめで、バージョン6で行わないといけないようである。
次回再挑戦する場合は、ImageMagick6をインストールすることにする。
但し、この変更により、現状がさらに悪化して、なおかつ復旧不可能になるようではもったいないので、C:\xampp\ImageMagickをGitHubに保管、公開しておくことにする。
5.参考サイト
[1]http://www.kent-web.com/www/chap1.html
[2]https://qiita.com/_xider/items/73c29d79eb4e252e64f7
[3]https://mumu.jpn.ph/forest/computer/2017/03/19/8093/
[4]https://windows.php.net/downloads/pecl/snaps/imagick/3.4.3/
[5]https://oxynotes.com/?p=10474
[6]https://qiita.com/tsukachin999/items/f955b77095ec8502ab9b


回答1件
あなたの回答
tips
プレビュー