[2023/03/20] PHP TCPDFのブックマーク(しおり)の設定方法について(Bookmarkメソッド) (No.315)
[2023/03/16] PHP TCPDFで出力されるPDFファイルに保護設定(パスワード設定)する方法について(setProtectionメソッド) (No.314)
[2023/03/15] PHP TCPDFの内部クラスを利用して「QR-CODE」をHTMLとしてブラウザに表示する方法について(TCPDF2DBarcodeクラス) (No.313)
[2023/03/14] PHP TCPDFの内部クラスを利用して「QR-CODE」をPNGファイルに出力する方法について(TCPDF2DBarcodeクラス) (No.312)
-
今回はPHPでグラフ描画をファイルに出力できるライブラリである pChart の紹介を行いたいと思います。
この pChart ですが結構前から在る様で、名前は知ってはいたのですが、PHPでグラフを描画する処理の仕事も無かったので、使用することはありませんでした。
実は今回、ちょっとPHPでPDF出力の中にグラフ表示を行うができないかとの依頼があり、調べてみることになりました。
グラフ用のライブラリは JpGraph , phpChart , pChart などがありますが、商用で無料で使えるのは pChart ぐらいしかなかったので これを使用することにしました。
pChart ですがバージョンが pChart-1.X と pChart-2.X が在る様です。
pChart-1.X は古そうで PHP7 以降には動きそうになかったので pChart-2.X の方を選択しました。
このライブラリのサイトは以下ですが、このサイトの中の DOWNLOAD のページから最新と思われる pChart 2.1.4 (zip) をダウンロードしてみました。
pChartのサイト
pChart 2.1.4 (zip) の簡単なテストを行う為に以下のソースを実行させてみます。 (ソースの内容はネットに載っていたものを少し変えましたが)■pChart クラスを使用したPNGファイルのブラウザ出力
以下の例では4個のデータを持つバーグラフをPNGファイルとしてブラウザ出力しています。
<?php require_once("../class/pData.class.php"); require_once("../class/pDraw.class.php"); require_once("../class/pImage.class.php"); $data = new pData(); $data->addPoints([1, 2, 3, 4], 'data1'); $data->addPoints(['A', 'B', 'C', 'D'], 'labels'); $data->setAbscissa('labels'); $image = new pImage(800, 400, $data); $image->setGraphArea(50, 30, 700, 360); $image->setFontProperties(['FontName' => '../fonts/calibri.ttf', 'FontSize' => 15]); $image->drawScale(['Mode' => SCALE_MODE_ADDALL]); $image->drawStackedBarChart(); $image->autoOutput('graph.png'); ?>
これを実行してもエラーが次々と表示されて上手くいきませんでした。
ライブラリのソースを見ると array() 変数の初期化に $data = "" などとなっていて、 これが原因で PHP7 では動かない様です。
ソースをみると上記の様な記述が結構な数があったので、ライブラリを触るのはあきらめて、 他にいい方法がないかネットで調べてみました。
調べていると以下のサイトを見つけました。どうも上記のバグ?を修正したものを公開している様です。
pChart2.2.0のソース公開場所
この中の pChart2.2.0 のソースをダウンロードして上記のソースを実行すると以下の様になりました。
このライブラリですが GPL3.0 でのライセンスになっているので、なんとも言えませんが商用でも使えそうです。
今更感はありますが、このグラフ描画のライブラリの機能を調べていきたいと思います。
PR -
今回は TCPDF で出力するPDFファイルにブックマーク(しおり)を設定する方法について説明します。
ブックマーク設定を行う為には、ブックマークを付加したいところで Bookmark メソッドの呼出を行います。
ここであらためて、Bookmark メソッドの引数について説明を記します。// Bookmarkメソッド public function Bookmark($txt, $level=0, $y=-1, $page='', $style='', $color=array(0,0,0), $x=-1, $link='') // $txt : ブックマークの文言 // $level : ブックマークレベル(最小値は「0」) // $y : ブックマークのY位置(現在選択されているページでPDFの設定単位での指定) // ([-1]:デフォルトで現在位置、[0]:ページ先頭) // $page : 対象ページ('':現在ページ) // $style : フォントスタイル('B':Bold, 'I':Italic, 'BI':Bold + Italic) // $color : RGB color array (values from 0 to 255) // $x : ブックマークのX位置(現在選択されているページでPDFの設定単位での指定) // ( [-1]:デフォルトで現在位置) // $link : URL、数値リンクID、名前付け識別子、 // 埋込ファイルの指定("*"+ファイル名:一般ファイル、"%"+ファイル名:PDFファイル)
■Bookmark メソッドを使用したブックマークの出力
<?php require_once('../tcpdf/tcpdf.php'); // クラス生成 $pdf = new TCPDF(); // 日本語フォント $pdf->setFont('kozgopromedium', '', 16); // ブックマークレベルのX座標位置 $arrLevelXPos = [10, 20, 30]; // ブックマークレベルの表示文字列の色 $arrLevelColor = [ [ 0, 64,128], [ 64,128, 0], [ 64, 0,128] ]; // 新規ページ $pdf->AddPage(); // ブックマーク設定 $pdf->Bookmark('第1章', 0, 10, '', 'B', $arrLevelColor[0]); // ブックマーク設定位置にテキスト表示 $pdf->MultiCell( 0, 10, '第1章テスト...', 0, 'L', false, 0, $arrLevelXPos[0], 10); $pdf->Bookmark('第1節', 1, 50, '', 'B', $arrLevelColor[1]); $pdf->MultiCell( 0, 10, '第1節テスト...', 0, 'L', false, 0, $arrLevelXPos[1], 50); $pdf->Bookmark('第1項', 2, 100, '', 'B', $arrLevelColor[2]); $pdf->MultiCell( 0, 10, '第1項テスト...', 0, 'L', false, 0, $arrLevelXPos[2], 100); $pdf->Bookmark('第2項', 2, 150, '', 'B', $arrLevelColor[2]); $pdf->MultiCell( 0, 10, '第2項テスト...', 0, 'L', false, 0, $arrLevelXPos[2], 150); // 新規ページ $pdf->AddPage(); $pdf->Bookmark('第2節', 1, 10, '', 'B', $arrLevelColor[1]); $pdf->MultiCell( 0, 10, '第2節テスト...', 0, 'L', false, 0, $arrLevelXPos[1], 10); $pdf->Bookmark('第1項', 2, 50, '', 'B', $arrLevelColor[2]); $pdf->MultiCell( 0, 10, '第1項テスト...', 0, 'L', false, 0, $arrLevelXPos[2], 50); // 新規ページ $pdf->AddPage(); $pdf->Bookmark('第2章', 0, 10, '', 'B', $arrLevelColor[0]); $pdf->MultiCell( 0, 10, '第2章テスト...', 0, 'L', false, 0, $arrLevelXPos[0], 10); $pdf->Bookmark('第1節', 1, 100, '', 'B', $arrLevelColor[1]); $pdf->MultiCell( 0, 10, '第1節テスト...', 0, 'L', false, 0, $arrLevelXPos[1], 100); $pdf->Bookmark('第2節', 1, 150, '', 'B', $arrLevelColor[1]); $pdf->MultiCell( 0, 10, '第2節テスト...', 0, 'L', false, 0, $arrLevelXPos[1], 150); // PDFファイル出力 $pdf->Output('pdf-bookmark-1.pdf', 'D'); ?>
特にソースは難しくはありません。 ブックマークを設置したいところで Bookmark メソッドを実行し、その後で同じ場所にテキストなどを表示します。 これを実行した時に「pdf-bookmark-1.pdf」ファイルが登録されます。
そのファイルを Acrobat Reader で開くと、以下の様な表示がされます。 画面左に「ブックマーク」を表示させて全ての「ブックマーク」を開いたところです。
この表示の中で「第1章」「第1節」「第1項」をクリックすると、当然ですが表示位置が移動します。■Annotation メソッドで埋め込んだファイルのブックマーク
<?php require_once('../tcpdf/tcpdf.php'); // クラス生成 $pdf = new TCPDF(); // 日本語フォント $pdf->setFont('kozgopromedium', '', 16); // ブックマークレベルのX座標位置 $arrLevelXPos = [10, 20, 30]; // ブックマークレベルの表示文字列の色 $arrLevelColor = [ [ 0, 64,128], [ 64,128, 0], [ 64, 0,128] ]; // 新規ページ $pdf->AddPage(); // ブックマークTEST $pdf->Bookmark('第1章', 0, 10, '', 'B', $arrLevelColor[0]); $pdf->MultiCell( 0, 10, '第1章テスト...', 0, 'L', false, 0, $arrLevelXPos[0], 10); $pdf->Bookmark('第1節', 1, 50, '', 'B', $arrLevelColor[1]); $pdf->MultiCell( 0, 10, '第1節テスト...', 0, 'L', false, 0, $arrLevelXPos[1], 50); // テキストファイルのアタッチ $pdf->Annotation(20, 50, 5, 5, 'TEXT file', array( 'Subtype'=>'FileAttachment', 'Name' => 'PushPin', 'FS' => 'test.txt')); // 埋め込みファイルのブックマーク(先頭"*"は一般ファイル) $pdf->Bookmark('TXT file', 0, 0, '', 'B', $arrLevelColor[2], -1, '*test.txt'); // PDFファイルのアタッチ $pdf->Annotation(50, 50, 5, 5, 'PDF file', array( 'Subtype'=>'FileAttachment', 'Name' => 'PushPin', 'FS' => 'pdf-bookmark-1.pdf')); // 埋め込みファイルのブックマーク(先頭"%"はPDF) $pdf->Bookmark('PDF file', 0, 0, '', 'B', $arrLevelColor[2], -1, '%pdf-bookmark-1.pdf'); // PDFファイル出力 $pdf->Output('pdf-bookmark-2.pdf', 'D'); ?>
ファイルのブックマークを作成する場合は Annotation メソッドでファイルを埋め込み指定を行い、 その後で Bookmark メソッドを実行する様です。
以下に実行結果のPDFファイルを開いたところを示します。 なお、ブックマークの「TXT file」をクリックするとテキストファイルとしてエディタソフトで表示されます。
-
今回は TCPDF で出力するPDFファイルに保護設定を行い、PDFリーダーでオープンする時にパスワードを要求する様に処理します。
保護設定を行う為には setProtection メソッドの呼出を TCPDF クラスの生成直後に行います。
ここであらためて、setProtection メソッドの引数について説明を記します。// setProtectionメソッド public function setProtection($permissions, $user_pass='', $owner_pass=null, $mode=0, $pubkeys=null) // $permissions : 権限の組み合わせ // 権限 array('print', 'modify', 'copy', 'annot-forms', // 'fill-forms', 'extract', 'assemble', 'print-high') // $user_pass : ユーザー・パスワード // $owner_pass : マスタ・パスワード(指定しない場合ランダム値が設定される) // $mode : 暗号化強度([0]:RC4 40 bit, [1]:RC4 128 bit, [2]:AES 128 bit, [3]:AES 256 bit) // $pubkeys : array of recipients containing public-key certificates ('c') and permissions ('p'). // For example: array(array('c' => 'file://../examples/data/cert/tcpdf.crt', // 'p' => array('print'))
以下に簡単な例を記します。<?php require_once('../tcpdf/tcpdf.php'); // クラス生成 $pdf = new TCPDF(); // 暗号化の設定 $pdf->setProtection(array('print', 'copy'), '0123', null, 0, null); // 日本語フォント $pdf->setFont('kozgopromedium', '', 16); // 新規ページ $pdf->AddPage(); // テキスト出力 $pdf->Write(0, 'PDFファイル暗号化テスト...', '', false, '', true); // PDFファイル出力 $pdf->Output('pdf-encryption-1.pdf', 'D'); ?>
特にソースは難しくはありません。これの実行した時に「pdf-encryption-1.pdf」ファイルが登録されます。
そのファイルを Acrobat Reader で開くと、以下の様にパスワード入力が表示されますので setProtection メソッドで指定した「0123」を入力します。
パスワード入力後に Acrobat Reader に「pdf-encryption-1.pdf」ファイルの内容が表示されます。
キャプションのところに「pdf-encryption-1.pdf(保護)」と「保護」の文字があるのが分かります。
さらに Acrobat Reader の左側のメニューアイコンの1番目の「保護」をクリックします。
保護の設定がなされていることが分かると思います。
-
今回は TCPDF の内部クラスである TCPDF2DBarcode クラスを使って 二次元バーコード(QR-CODE) を直接ブラウザに(HTML出力)表示する方法について説明します。
以下の記事では TCPDF の内部的に画像データを生成する関数を直接呼出すことで、 二次元バーコード(QR-CODE) を画像ファイルとして出力ができることを記しました。
PHP TCPDFの内部クラスを利用して「QR-CODE」をPNGファイルに出力する方法について(TCPDF2DBarcodeクラス)
この時使用した getBarcodePngData メソッドとはことなり 二次元バーコード(QR-CODE) の白黒状態をHTMLのソースを 直接「div」タグの「style」の塗潰しで表現したものを返す getBarcodePngData メソッドを使用します。
言葉で説明しても良くわかりませんので、実際の例を以下に記します。<?php //include 2D barcode class require_once('../tcpdf/tcpdf_barcodes_2d.php'); //二次元バーコードクラス生成 $str = "https://www.yahoo.co.jp/"; $barcodeobj = new TCPDF2DBarcode($str, 'QRCODE,H'); // output the barcode as HTML object $barcodehtml = $barcodeobj->getBarcodeHTML(10, 10, 'black'); ?> <html> <head> <meta charset="utf-8"> <title>PDF barcode - 3</title> </head> <body> <h2>PDF 出力</h2> <div> <?php echo($barcodehtml); ?> </div> </body> </html>
特にソースは難しくはありません。これの実行した時のブラウザの結果は以下の通りです。
ブラウザに表示された結果のソースを見てみると、以下の様に「div」タグの羅列となっています。 背景色を黒にしてその幅を設定し塗潰すことでQR-CODEを表現しています。
getBarcodePngData メソッドの引数の最初の2個はQR-CODEの一番小さい素子の幅をピクセル値で指定しています。 この場合は「10px」なので画面上でみると一番小さい正方形の幅が「10px」になっています。<html> <head> <meta charset="utf-8"> <title>PDF barcode - 3</title> </head> <body> <h2>PDF 出力</h2> <div> <div style="font-size:0;position:relative;width:290px;height:290px;"> <div style="background-color:black;width:10px;height:10px;position:absolute;left:0px;top:0px;"> </div> <div style="background-color:black;width:10px;height:10px;position:absolute;left:10px;top:0px;"> </div> <div style="background-color:black;width:10px;height:10px;position:absolute;left:20px;top:0px;"> </div> <div style="background-color:black;width:10px;height:10px;position:absolute;left:30px;top:0px;"> </div> <div style="background-color:black;width:10px;height:10px;position:absolute;left:40px;top:0px;"> </div> <div style="background-color:black;width:10px;height:10px;position:absolute;left:50px;top:0px;"> </div> <div style="background-color:black;width:10px;height:10px;position:absolute;left:60px;top:0px;"> </div> <div style="background-color:black;width:10px;height:10px;position:absolute;left:90px;top:0px;"> </div> <div style="background-color:black;width:10px;height:10px;position:absolute;left:110px;top:0px;"> </div> <div style="background-color:black;width:10px;height:10px;position:absolute;left:120px;top:0px;"> </div> <div style="background-color:black;width:10px;height:10px;position:absolute;left:140px;top:0px;"> </div> <div style="background-color:black;width:10px;height:10px;position:absolute;left:150px;top:0px;"> </div> <div style="background-color:black;width:10px;height:10px;position:absolute;left:160px;top:0px;"> </div> <div style="background-color:black;width:10px;height:10px;position:absolute;left:180px;top:0px;"> </div> <div style="background-color:black;width:10px;height:10px;position:absolute;left:200px;top:0px;"> </div> <div style="background-color:black;width:10px;height:10px;position:absolute;left:220px;top:0px;"> </div> <div style="background-color:black;width:10px;height:10px;position:absolute;left:230px;top:0px;"> </div> <div style="background-color:black;width:10px;height:10px;position:absolute;left:240px;top:0px;"> </div> <div style="background-color:black;width:10px;height:10px;position:absolute;left:250px;top:0px;"> </div> <div style="background-color:black;width:10px;height:10px;position:absolute;left:260px;top:0px;"> </div> <div style="background-color:black;width:10px;height:10px;position:absolute;left:270px;top:0px;"> </div> <div style="background-color:black;width:10px;height:10px;position:absolute;left:280px;top:0px;"> </div> // 全体として418行ありますので、この間は割愛 <div style="background-color:black;width:10px;height:10px;position:absolute;left:100px;top:280px;"> </div> <div style="background-color:black;width:10px;height:10px;position:absolute;left:120px;top:280px;"> </div> <div style="background-color:black;width:10px;height:10px;position:absolute;left:150px;top:280px;"> </div> <div style="background-color:black;width:10px;height:10px;position:absolute;left:190px;top:280px;"> </div> <div style="background-color:black;width:10px;height:10px;position:absolute;left:200px;top:280px;"> </div> <div style="background-color:black;width:10px;height:10px;position:absolute;left:210px;top:280px;"> </div> <div style="background-color:black;width:10px;height:10px;position:absolute;left:220px;top:280px;"> </div> <div style="background-color:black;width:10px;height:10px;position:absolute;left:240px;top:280px;"> </div> <div style="background-color:black;width:10px;height:10px;position:absolute;left:250px;top:280px;"> </div> <div style="background-color:black;width:10px;height:10px;position:absolute;left:270px;top:280px;"> </div> </div> </div> </body> </html>
-
今回は TCPDF の内部クラスである TCPDF2DBarcode クラスを使って 二次元バーコード(QR-CODE) をPNGファイルに出力する方法について説明します。
以下の記事では 二次元バーコード(QR-CODE) をPDFファイルに描画してブラウザに表示させていましたが、 TCPDF の内部的に画像データを生成する部分のみを直接呼出すことで、その画像データからファイル出力ができます。
PHP TCPDFの二次元バーコード(QR-CODE)の表示方法について(write2DBarcodeメソッド)
上の記事では結果として以下の表示がされますが、この中の右下のQR-CODEをPNGファイルとして出力させてみます。■TCPDF2DBarcode クラスを使用したPNGファイルの出力
以下の例では QRCODE の レベル H のバーコードをPNGファイルとして出力しています。
<?php //include 2D barcode class require_once('../tcpdf/tcpdf_barcodes_2d.php'); //二次元バーコードクラス生成 $str = "https://www.yahoo.co.jp/"; $barcodeobj = new TCPDF2DBarcode($str, 'QRCODE,H'); //QR-CODEのPNGイメージの生成 $data = $barcodeobj->getBarcodePngData(5, 5, array(0,0,0)); //生成されたPNGイメージのデータ文字列をリソースに戻す $image = imagecreatefromstring($data); //背景を白に設定 //「getBarcodePngData」の出力が背景が「transparent」になっているので強制的に白設定 $trans = imagecolorallocate($image, 255, 255, 255); imagecolortransparent($image, $trans); //画像の保存 imagepng($image, "barcode2d-test.png"); ?>
これの実行し、PNGファイルの結果は以下の通りです。