Posted on

Imagickを利用するにあたって

PDFファイルの1ページ目をイメージファイルjpgに変換するサンプルです。
imagickのサーバーへのインストールは、このブログからは除きます。
当初

  1. $im = new Imagick();  
  2. //画像を生成したいPDFを読み込む  
  3. $im->readImage('hoge.pdf');  
  4. //特定のPDFのページ 0が表紙  
  5. $im->setImageIndex(0);  
  6. //サムネイルサイズ 640pxに収める  
  7. $im->thumbnailImage(640, 640, true);  
  8. //シャープ  
  9. $im->sharpenImage(0, 1);  
  10. //生成  
  11. $im->writeImage('out.jpg');  
  12.   
  13. $im->destroy();  

を元に関数を作成したのですが、
この記述では、階層が深いPDFを指定した場合は、エラーになるという致命的な問題が
潜んでいます。
そこで、ソースを

  1. $im = new Imagick();  
  2. //画像を生成したいPDFを読み込む  
  3. $image = file_get_contents('/var/www/xxxx/xxxx/hoge.pdf');  
  4. $im->readImageBlob($image);  
  5. //特定のPDFのページ 0が表紙  
  6. $im->setImageIndex(0);  
  7. //サムネイルサイズ 640pxに収める  
  8. $im->thumbnailImage(640, 640, true);  
  9. //シャープ  
  10. $im->sharpenImage(0, 1);  
  11. //生成  
  12. $im->writeImage('/var/www/xxxx/xxxx/out.jpg');  
  13.   
  14. $im->destroy();  

で動くようになりました。
しかし、透明の箇所が真っ黒になるという不具合がありなおかつ
複数ページあるPDFと1ページのみのPDFでは動きが違うという問題にも直面
この難題を解決するのに、3時間程度要しました。
解決済みのサンプルがこちらです。

  1. $im = new Imagick();  
  2. //画像を生成したいPDFを読み込む  
  3. $image = file_get_contents('/var/www/xxxx/xxxx/hoge.pdf');  
  4. $im->readImageBlob($image);  
  5. $totalPage = $im->getImageScene();  
  6.   
  7. //サムネイルサイズ 640pxに収める  
  8. $im->thumbnailImage(640, 640, true);  
  9. //シャープ  
  10. $im->sharpenImage(0, 1);  
  11. // バックグラウンドを白にする。  
  12. $im->setImageBackgroundColor('white');  
  13. //特定のPDFのページ 0が表紙  
  14. if ($totalPage != 0) {  // 複数ページの場合  
  15.     $im->flattenImages()->setImageIndex(0);  
  16. else {    // 単一ページの場合  
  17.     $im = $im->flattenImages();  
  18. }  
  19. //生成  
  20. $im->writeImage('/var/www/xxxx/xxxx/out.jpg');  
  21. $im->destroy();  

以上です。

Posted on

JQueryにてJSONをPHPに送り、さらにベーシック認証の指定のURLにPOSTしてJSON形式のデータを受け取る方法

長いタイトルになってしまいましたが、ようするにJSON形式なら受け渡しが楽になりますよということです。
まず、JQueryからPHPにJSON形式のデータを渡す方法(www/index.php)

  1.     <meta charset="utf-8">  
  2.     <script src="lib/jquery/jquery-1.11.2.min.js" charset="utf-8"></script>  
  3.     <style media="screen">  
  4.         li {  
  5.             list-style: none;  
  6.         }  
  7.     </style>  
  8.     <title>Ajax Sample</title>  
  9.   
  10.   
  11. <h1>Ajax sample</h1>  
  12. <form action="index.php" method="post" enctype="multipart/form-data">  
  13. <!--    <img decoding="async" id="img" src="src/read_0001.png"> -->  
  14. <select name="data[Ajax][key]" id="AjaxKey">  
  15. <option value="10000">10000</option>  
  16. <option value="9999">9999</option>  
  17. <option value="9998">9998</option>  
  18. <option value="9997">9997</option>  
  19. <option value="9996">9996</option>  
  20. <option value="9995">9995</option>  
  21. <option value="9994">9994</option>  
  22. <option value="9993">9993</option>  
  23. <option value="9992">9992</option>  
  24. <option value="9991">9991</option>  
  25. </select>  
  26.     <button type="button" id="btn">送信</button>  
  27. </form>  
  28.   
  29.   
  30. <script type="text/javascript">  
  31.     // 各フィールドから値を取得してJSONデータを作成  
  32.     $(function () {  
  33.   
  34.         $("button#btn").click(function () {  
  35.   
  36.             var value = $("#AjaxKey").val();  
  37.   
  38.             var data = {  
  39.                 VALUE:value  
  40.             };  
  41.   
  42.             // 通信実行  
  43.             $.ajax({  
  44.                 type: "post",                // method = "POST"  
  45.                 url: "ajax_api.php",        // POST送信先のURL  
  46.                 data: JSON.stringify(data),  // JSONデータ本体  
  47.                 contentType: 'application/json'// リクエストの Content-Type  
  48.                 dataType: "json",           // レスポンスをJSONとしてパースする  
  49.                 success: function (json_data) {   // 200 OK時  
  50.                     console.log("success");  
  51.                     var str = "";  
  52.                     if (json_data.STATUS == 0) {  
  53.                         console.log("json.success");  
  54.                         str = str + json_data.STATUS + "\r\n";  
  55.                         str = str + json_data.ERROR + "\r\n";  
  56.                         if (json_data.RES != null) {  
  57.                             str = str + json_data.RES.id + "\r\n";  
  58.                             str = str + json_data.RES.name + "\r\n";  
  59.                             str = str + json_data.RES.tel + "\r\n";  
  60.                         }  
  61.                         alert(str);  
  62.                     } else {  
  63.                         console.log("json.error");  
  64.                         str = str + json_data.STATUS + "\r\n";  
  65.                         str = str + json_data.ERROR + "\r\n";  
  66.                         alert(str);  
  67.                     }  
  68.                     // 成功時処理  
  69.                     location.reload();  
  70.                 },  
  71.                 error: function () {         // HTTPエラー時  
  72.                     console.log("error");  
  73.                 },  
  74.                 complete: function () {      // 成功・失敗に関わらず通信が終了した際の処理  
  75.                 }  
  76.             });  
  77.         });  
  78.     });  
  79.   
  80. </script>  

JQueryからJSON形式のデータを受け取りPHPで連想配列にして他のURLにポストする方法(www/ajax_api.php)
ちなみに、ベーシック認証がない場合は、define(‘DEMO’, true);をdefine(‘DEMO’, false);へ

  1. <!--?php  
  2. // 登録API  
  3. define('SAMPLE_API''http://xxx.xxx.xxx.xxx/wwwapi/index.php');  
  4. // デモ環境  
  5. define('DEMO', true);  
  6. $json = file_get_contents("php://input");  
  7.   
  8. // 文字化けするかもしれないのでUTF-8に変換  
  9. $json = mb_convert_encoding($json'UTF8''ASCII,JIS,UTF-8,EUC-JP,SJIS-WIN');  
  10.   
  11. // オブジェクト毎にパース  
  12. // trueを付けると連想配列として分解して格納してくれます。  
  13. $obj = json_decode($json, true);  
  14.   
  15. // パースに失敗した時は処理終了  
  16. if ($obj === NULL) {  
  17.     $jsonResult['STATUS'] = 1;  
  18.     $jsonResult['ERROR'] = "JSON受信に失敗しました。";  
  19. else {  
  20.     $jsonResult['STATUS'] = 0;  
  21.     $jsonResult['ERROR'] = "";  
  22.     $res = json_decode(demoApi($obj['VALUE']),true);  
  23.     if (emptyempty($res)) {  
  24.         $jsonResult['STATUS'] = 1;  
  25.         $jsonResult['ERROR'] = "情報が取得できませんでした。";  
  26.     }  
  27.     $jsonResult['RES'] = $res;  
  28. }  
  29. echo json_encode($jsonResult);  
  30. /** 
  31.  * 会員情報取得API処理 
  32.  * @note 
  33.  */  
  34. function demoApi($memberId) {  
  35.   
  36.     //POSTデータ  
  37.     $data = array(  
  38.         "member_id"          =--> "{$memberId}"  
  39.     );  
  40.     $data = http_build_query($data"""&");  
  41.   
  42.     if (DEMO) {  
  43.         //header  
  44.         $header = array(  
  45.             'User-Agent: My User Agent 1.0',    //ユーザエージェントの指定  
  46.             'Authorization: Basic ' . base64_encode('account:password'),//ベーシック認証  
  47.             "Content-Type: application/x-www-form-urlencoded",  
  48.             "Content-Length: " . strlen($data)  
  49.         );  
  50.     } else {  
  51.         //header  
  52.         $header = array(  
  53.             "Content-Type: application/x-www-form-urlencoded",  
  54.             "Content-Length: " . strlen($data)  
  55.         );  
  56.     }  
  57.   
  58.     $context = array(  
  59.         "http" => array(  
  60.             "method"  => "POST",  
  61.             "header"  => implode("\r\n"$header),  
  62.             "content" => $data  
  63.         )  
  64.     );  
  65.     $res = file_get_contents(SAMPLE_API, false, stream_context_create($context));  
  66.     return $res;  
  67. }  
  68. ?>  

POSTデータを頂き、情報(連想配列のID指定にしていますが、ご利用の際には、DBから取得する方法へもバージョンアップできます。)
を取得JSON形式の返信を頂く方法(wwwapi/index.php)

  1. <!--?php  
  2. $memberArray = array(  
  3.     "10000" =--> array("id" => 10000,'name' => 'Name10000','tel' => "000100010001"),  
  4.     "9999" => array("id" => 9999,'name' => 'Name9999','tel' => "000900090009"),  
  5.     "9998" => array("id" => 9998,'name' => 'Name9998','tel' => "000900090008"),  
  6.     "9997" => array("id" => 9997,'name' => 'Name9997','tel' => "000900090007"),  
  7.     "9996" => array("id" => 9996,'name' => 'Name9996','tel' => "000900090006"),  
  8.     "9995" => array("id" => 9995,'name' => 'Name9995','tel' => "000900090005"),  
  9.     "9994" => array("id" => 9994,'name' => 'Name9994','tel' => "000900090004"),  
  10.     "9993" => array("id" => 9993,'name' => 'Name9993','tel' => "000900090003"),  
  11.     "9992" => array("id" => 9992,'name' => 'Name9992','tel' => "000900090002"),  
  12.     );  
  13.   
  14. $memberId = $_POST['member_id'];  
  15.   
  16. if(emptyempty($memberArray[$memberId])) {  
  17.     echo json_encode(array());  
  18. }  
  19. echo json_encode($memberArray[$memberId]);  
  20. ?>  

※jquery-1.11.2.min.jsは、特にふれていませんが、実行するには必要になります、ご注意ください。

Posted on

INNER JOIN と LEFT JOIN の違い

最近、CakePHPを書く仕事でjoinを使うことが多くなりました。でも、joinにも種類があって、inner join と left join をよく使っていますが、仕事始めたての頃はその違いを認識できていませんでした。最近になってようやくその違いがわかり、その重要性もある程度分かるようになってきました。今回はそのことの復習の意味もこめて、2種類のjoinについてまとめておきたいと思います。
続きを読む INNER JOIN と LEFT JOIN の違い

Posted on

オブジェクト指向について学んだこと

CakePHPで実務をやり始めて約5ヶ月、まだまだ分からない事は沢山ありますが、少しずつイメージできる部分も出てきました。今回はCakeを身に付けていくにあたり学んだオブジェクト指向について書きたいと思います。
昔プログラミングを勉強した時にはオブジェクト指向の概念もなく、今までほとんどオブジェクト指向を意識することなく過ごしてきました。そんな僕にとっては、オブジェクト指向とはどういうものか、オブジェクト指向を使うとどう便利になるのか、ほとんどイメージできませんでした。それを会社の技術リーダーに伝えたところ、1冊の参考書を持ってきてくれました。
その中で、「なるほど!そういうことか!!」と思えたのが、「ポリモーフィズム」についての解説の例えです。

続きを読む オブジェクト指向について学んだこと

Posted on

PHP小ネタ @の意味

PHPのサンプルソースをネット上で検索していると、自分が普段使わない言語機能を使っているソースに出くわすことがあります。

たとえば、以下のようなソースの@の意味、すぐに分かりますでしょうか?

  1. $val = @$data[$key];  

僕は正直、意味がまったく分かりませんでした。

ポインタのアドレス参照でもないしなー、と思ってネット上で調べようとしたところ、これがなぜだか分からない……
そもそもこの@が文法上のどのカテゴリに入るものなのかがわからなかったので、うまくヒットする検索が中々出来なかったのですね。

結果を言いますと、この@は、

続きを読む PHP小ネタ @の意味

Posted on

PHPEXCELでEXCEL1ファイルで表など記述済3シートをそれぞれコピーして業務にあったEXCELを出力する方法例

複数シートを対象にEXCEL出力したい場合の参考になれば幸いです。たとえばですが、下記ソースで、ベースとなる何も記入していないEXCELファイル(test_base.xlsx)を読込、請求書(定型フォーマット)、請求明細書(定型フォーマット)、請求書控え(定型フォーマット)各3シートのEXCELファイル(test3sheet.xlsx)を1つ読み込み、それぞれのシートを1つずつコピーして、値を出力(例:A2にtest1から3を出力)して、一番最初に読み込んだシートを削除するのを、サンプルとして記載しました。
このプログラムを動作させた環境は、phpexcel 1.8.0 cakephp 2.6.7です。

続きを読む PHPEXCELでEXCEL1ファイルで表など記述済3シートをそれぞれコピーして業務にあったEXCELを出力する方法例

Posted on

Cake2で複数ファイルをUPする

Cake2で複数ファイルをHtml5の機能を使って簡単に上げれるとあったので試してみました。

$this->Form->input(‘Model.field’, array( ‘type’ => ‘file’));
で単体のファイルが上げれるところを
$this->Form->input(‘Model.field’, array(‘type’ => ‘file’, ‘multiple’));
と書くだけで簡単に複数ファイルが上げれるということでやってみたのですが動かない・・・

何でだ!!とはまる事一時間ほど・・・
よくよく見てみるとfieldの後ろに「.」ピリオドが要るではないか!!という事で
$this->Form->input(‘Model.field.’, array(‘type’ => ‘file’, ‘multiple’));
と書いてあげるとすんなり動いてくれました。
最後のピリオドはお忘れずということでした。

Posted on

MVCモデルを勉強しました

当社に就職し、技術部でPHPプログラミングの業務をさせて頂いて早2ヶ月半が経ちました。前の勤務先では、システムを運用する側の仕事でしたので、専門的にシステム開発をするということはありませんでした。またPHP言語も入門書に触れた程度で、本格的に取り組むのは今の仕事が初めてになります。今回の記事では、こんなシステム開発初心者の僕がこんなこと勉強して便利だなと思うようになったことについて書きたいと思います。
当社では、PHP用の開発フレームワークとしてCakePHPを使っていますが、そこで出てくるのが、「MVCモデル」という開発手法です。今まで耳にする程度で理解しようともしなかったこのMVCモデルとは、どんなものなのでしょうか。今までプログラミング経験はある(といってもスクリプト程度の簡易なものですが)ものの、フレームワークを使った大規模なプログラミングの経験はなく、コードを役割ごとに分けて書く習慣が全くなかった僕としては、MVCモデルが出てきた時、逆に頭の中が混乱してしまいました。

続きを読む MVCモデルを勉強しました