質問: 0; $i <= $totalPage; $i++) { //PDFのページ $im->setImageIndex($i); //サムネイルサイズ 640pxに収める $im->thumbnailImage(640, 640, true); //シャープ $im->sharpenImage(0, 1); //生成 $im->writeImage('out_' . $i . '.jpg'); } $im->destroy(); ?> ``` 2Microsoft Word 2016で「hoge.pdf」とだけ書いた文章hoge.pdfを作成し、`C:\xampp\htdocs`にコピーした。 3WWWブラウザで、サーバにアップロードしたtest.phpを閲覧した。 #### 3-2-2.実験2の結果 実験2の結果、次のようにFatal errorが表示された。 ``` > > Fatal error: Uncaught Error: Class 'Imagick' not found in C:\xampp\htdocs\test.php:3 > Stack trace: > #0 {main} > thrown in C:\xampp\htdocs\test.php on line 3 ``` このことから、xamppによって作られたサーバにはImageckというクラスが用意されていない、即ちImageMagickがインストールされていないということが分かった。 #### 3-3-1.実験3 ImageMagickを利用可能化[2] 1次のようなisTs.php[3]を作成し、`c:\xampp\htdocs` にコピーし、 http\://localhost/isTs.php にアクセスし、 ・php versionを確認した。 ・Compiler versionを確認した。 ・Architectureを確認した。 ・thread safeが有効か否かを確認した。 ``` ``` 2GhostScriptを`C:\xampp\gs\gs9.26`にインストールした。 3ImageMagickの公式ダウンロードページにアクセスし、ImageMagick-7.0.7-11-vc15-x86.zip をダウンロードした。 vc15はxamppに入っているphpのコンパイラのバージョンであり、x86は、xamppに入っているソフトはみな32 bitで動作するものであるからである。(表3-3-2-1を確認されたい) そして展開し、中身を`c:\xampp\ImageMagick`にすべてコピーした。 4Imagickの公式ダウンロードページにアクセスし、`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\` に上書きコピーした。 5`C:\xampp\php\php.ini` の > > ;;;;;;;;;;;;;;;;;;;;;; > > ; Dynamic Extensions ; > > ;;;;;;;;;;;;;;;;;;;;;; > > > のところに`extension=` が並んでいるところがあるので、そこに`extension=php_imagick.dll` を加筆した。 6図3-3-1のように環境変数を指定した。 図3-3-1 図3-3-1 環境変数の設定 #### 3-3-2.実験3の結果 1の結果、表3-3-2-1のようなことが分かった。 表3-3-2-1 インストールされたphpの仕様 | PHP Version | 7.2.12 | | --- | --- | | Compiler | MSVC15 (Visual C++ 2017) | | Architecture | x86 | | Thread Safety | enabled | 2~6をしたうえで`http://localhost/isTs.php` にアクセスした結果、1の段階では表示されなかった、表3-3-2-2(省略します。リポジトリを見てください)が表示された。 これは、ImageMagickのモジュールが正常に読み込まれたことを意味する。 そして`http://localhost/test.php` にアクセスすると、 ``` > > Fatal error: 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 C:\xampp\htdocs\test.php on line 5 ``` のように表示され、エラーの内容が実験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
回答: phpからファイルにアクセスできるかできないかを確認したくて、 質問への追記・修正の依頼を出しておりました。 2つ確認していただきたいです。 1つ、 phpからファイルオープンができるかどうか。 例えばPHP: fopen - Manualを使って。 このとき、単純な英数字で構成されたファイル名はオープンできれば、 アクセス権にまつわる問題ではないと確認できます。 もう1つ、 アップロードされたファイルのファイル名を 仮のテキストファイルにでも出力して、 それがどういうエンコードなのかを確認してください。 ファイル名のエンコーディングがSJISで php内部エンコーディングがUTF-8だったりすると、 ファイル名が適切に扱えてないこともあるので、 念のためにPHP: mb_convert_encoding - Manualを駆使して管理することも試してみてください。