[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)
[2023/03/14] PHP TCPDFの二次元バーコード(QR-CODE)の表示方法について(write2DBarcodeメソッド) (No.311)
[2023/03/13] PHP TCPDFの一次元バーコードの表示方法について(write1DBarcodeメソッド) (No.310)
-
×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
-
今回は 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番目の「保護」をクリックします。
保護の設定がなされていることが分かると思います。
PR -
今回は 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ファイルの結果は以下の通りです。
-
今回は write2DBarcode メソッドを使って 二次元バーコード(QR-CODE) を表示する方法について説明します。
二次元バーコード といえばあの車部品メーカーで有名な DENSO が開発したバーコードです。 実際はバーコードでは無く2次元的な四角い領域に白黒のマスを描画して比較的長いテキストを表現できるものです。
開発した DENSO は QR-CODE の特許をオープンしたため最初は工場などの管理のためのものでしたが、 最近はいろんなところで利用されています。 コードの中に URL を埋め込んでおいて、スマホからそれを読み取ってアクセスする等の利用が増えています。
ここで write2DBarcode メソッドの引数について説明を記します。// write2DBarcodeメソッド public function write2DBarcode($code, $type, $x=null, $y=null, $w=null, $h=null, $style=array(), $align='', $distort=false) // $code : 印刷するコード // $type : バーコードのタイプ("C39", "C93", "C138", "EAN13", "EAN8"など) // $x : X位置(指定されたユーザの単位)(NULL:カレントのX位置) // $y : Y位置(指定されたユーザの単位)(NULL:カレントのY位置) // $w : 横幅(指定されたユーザの単位)(NULL:カレントのX位置から用紙出力の横幅MAXまで) // $h : 縦幅(指定されたユーザの単位)(NULL:カレントのX位置から用紙出力の縦幅MAXまで) // $style : 出力オプションを配列で指定 // $style['border']:boolean:trueでボーダー出力 // $style['padding']:int:バーコード周囲の余白('auto':自動設定) // $style['hpadding']:int:水平方向の余白('auto':自動設定) // $style['vpadding']:int:垂直方向の余白('auto':自動設定) // $style['fgcolor']:color array:バーと文字色 // $style['bgcolor']:color mixed:背景色(falseであれば、透明) // $style['module_width']: width of a single module in points // $style['module_height']: height of a single module in points // $style['position']:string:ページにおけるバーコードの位置: // ['L']: 左マージン // ['C']: 中央揃え // ['R']: 右マージン // ['S']: ストレッチ // $align :string:ページにおけるバーコードの位置: // ['T']: top-right // ['M']: middle-right // ['B']: bottom-right // ['N']: next line // $distort :boolean:trueで幅と高さをフィットとさせる // (それ以外はアスペクト比を維持する)
それでは write2DBarcode メソッドを使用したバーコードの表示の簡単な例を以下に記します。
■write2DBarcode メソッドを使用したバーコードの表示
以下の例では QRCODE の レベル L, レベル M, レベル Q, レベル H のバーコードを表示しています。
<?php require_once('../tcpdf/tcpdf.php'); // クラス生成 $pdf = new TCPDF(); // デフォルトで用意されている日本語フォント[小塚ゴシックPro M] $strFont = "kozgopromedium"; // ヘッダ・フッタ出力設定(特にいらないが) $pdf->setPrintHeader(false); $pdf->setPrintFooter(false); // 本文の日本語フォント[小塚ゴシックPro M] $pdf->SetFont($strFont, "", 10); // 新しいpdfページを追加 $pdf->AddPage(); $pdf->Write(0, '二元バーコード表示テスト', '', false, '', true); $pdf->Ln(); // set style for barcode $style = array( 'border' => true, //ボーダー有 'vpadding' => 'auto', //縦パディングAUTO 'hpadding' => 'auto', //水平パディングAUTO 'fgcolor' => array(0,0,0),//テキスト・バー色(黒) 'bgcolor' => false, //背景色指定無し 'module_width' => 1, // width of a single module in points 'module_height' => 1 // height of a single module in points ); // 出力URL $strURL = "https://www.yahoo.co.jp/"; // QRCODE,L : QR-CODE Low error correction $pdf->write2DBarcode($strURL, 'QRCODE,L', 20, 30, 50, 50, $style, 'N'); $pdf->Text(20, 25, 'QRCODE L'); // QRCODE,M : QR-CODE Medium error correction $pdf->write2DBarcode($strURL, 'QRCODE,M', 80, 30, 50, 50, $style, 'N'); $pdf->Text(80, 25, 'QRCODE M'); // QRCODE,Q : QR-CODE Better error correction $pdf->write2DBarcode($strURL, 'QRCODE,Q', 20, 90, 50, 50, $style, 'N'); $pdf->Text(20, 85, 'QRCODE Q'); // QRCODE,H : QR-CODE Best error correction $pdf->write2DBarcode($strURL, 'QRCODE,H', 80, 90, 50, 50, $style, 'N'); $pdf->Text(80, 85, 'QRCODE H'); // pdf表示設定 $pdf->Output('pdf-barcode-qr-1.pdf', 'I'); ?>
これの実行結果は以下の通りです。
レベル L, レベル M, レベル Q, レベル H は読み取り時の誤り訂正レベルを表しています。
「誤り訂正」とはQR-CODEに汚れや破損があっも正しく読み取れるように間違いを補正することをいいます。
なお、以下に訂正率を記します。- レベル L:コード語の約7%が訂正可能
- レベル M:コード語の約15%が訂正可能
- レベル Q:コード語の約25%が訂正可能
- レベル H:コード語の約30%が訂正可能
- レベル S:コード語の約50%が訂正可能
QR-CODEの仕様には レベル S までありますが、TCPDF では レベル H までが実装されています。
また、バージョンが1~40までありますが、TCPDF の内部では出力データの容量に応じてバージョンを計算している様です。 (私がソースを読んでみてのことなので正しいかどうかは分かりませんが…)
各種データの種類ごとの最大容量は以下の通りです。
データ種別 最大容量 備考 数字のみ 7,089文字 英数字(ASCII) 4,296文字 バイナリ(8ビット) 2,953バイト 漢字・かな (Shift_JIS) 4,296文字 全角英数字 (2バイト文字)を含み、半角カタカナ (1バイト文字)を含まない ※最大容量はバージョンを最大(40)、誤り訂正レベルを最低(L) にした場合
-
今回は write1DBarcode メソッドを使って 一次元バーコード を表示する方法について説明します。
一次元バーコード といえば商品などに付いている「JAN」「CODE39」「CODE128」のバーコードです。 ちなみに「JAN」は日本のみの呼称で「EAN」または「UPC」と呼ばれるそうです。
ここで write1DBarcode メソッドの引数について説明を記します。// write1DBarcodeメソッド public function write1DBarcode($code, $type, $x=null, $y=null, $w=null, $h=null, $xres=null, $style=array(), $align='') // $code : 印刷するコード // $type : バーコードのタイプ("C39", "C93", "C138", "EAN13", "EAN8"など) // $x : X位置(指定されたユーザの単位)(NULL:カレントのX位置) // $y : Y位置(指定されたユーザの単位)(NULL:カレントのY位置) // $w : 横幅(指定されたユーザの単位)(NULL:カレントのX位置から用紙出力の横幅MAXまで) // $h : 縦幅(指定されたユーザの単位)(NULL:カレントのX位置から用紙出力の縦幅MAXまで) // $xres : バーの最小幅(NULL:デフォルトで「0.4mm」) // $style : 出力オプションを配列で指定 // $style['border']:boolean:trueでボーダー出力 // $style['padding']:int:バーコード周囲の余白('auto':自動設定) // $style['hpadding']:int:水平方向の余白('auto':自動設定) // $style['vpadding']:int:垂直方向の余白('auto':自動設定) // $style['fgcolor']:color array:バーと文字色 // $style['bgcolor']:color array:背景色 // $style['text']:boolean:trueでバーコードの下にテキスト出力 // $style['label']:string:デフォルトのラベル // $style['font']:string:テキストのフォント名 // $style['fontsize']:int:テキストのフォントサイズ // $style['stretchtext']:int:出力テキストの伸縮(ストレッチ)モード // [0]: 不可 // [1]: 水平方向(必要な場合) // [2]: 水平方向(強制的) // [3]: 空白文字(必要な場合) // [4]: 空白文字(強制的) // $style['position']:string:横幅で指定されるセル上での水平配置 // ['L']: 左寄せ // ['C']: 中央揃え // ['R']: 右寄せ // $style['align']:string:横幅で指定されるセル上での水平配置 // ['L']: 左寄せ // ['C']: 中央揃え // ['R']: 右寄せ // $style['stretch']:boolean:trueでバー最小幅を計算上のMAXにする // $style['fitwidth']:boolean:trueでバーコードと余白幅を含めてフィットとさせる // (この指定がtrueの場合は$style['stretch']がfalseとなる) // $style['cellfitalign']:バーコードセルの位置指定 // ($style['fitwidth']がtrueで$style['position']が未設定の場合のみ有効) // ['L']: 左寄せ // ['C']: 中央揃え // ['R']: 右寄せ // $align : 出力後のカーソルの移動方法を指定 // [T]: 右上へ移動 // [M]: 右中央へ移動(既定) // [B]: 右下へ移動 // [N]: 次の行へ移動
それでは write1DBarcode メソッドを使用したバーコードの表示の簡単な例を以下に記します。
■write1DBarcode メソッドを使用したバーコードの表示
以下の例では CODE39, CODE39 + CHECKSUM, CODE128, EAN8, EAN13, CODABAR のバーコードを表示しています。
<?php require_once('../tcpdf/tcpdf.php'); // クラス生成 $pdf = new TCPDF(); // デフォルトで用意されている日本語フォント[小塚ゴシックPro M] $strFont = "kozgopromedium"; // ヘッダ・フッタ出力設定(特にいらないが) $pdf->setPrintHeader(false); $pdf->setPrintFooter(false); // 本文の日本語フォント[小塚ゴシックPro M] $pdf->SetFont($strFont, "", 10); // 新しいpdfページを追加 $pdf->AddPage(); $pdf->Write(0, '一元バーコード表示テスト', '', false, '', true); $pdf->Ln(); // define barcode style $style = array( 'border' => true, //枠線有 'hpadding' => 'auto', //水平空白埋め自動 'vpadding' => 'auto', //垂直空白埋め自動 'fgcolor' => array(0,0,0), //テキスト色黒 'bgcolor' => false, //背景色指定無し 'text' => true, //テキスト表示 'font' => 'helvetica', // 'fontsize' => 8, // 'stretchtext' => 4 , // 'position' => '', //位置は現在位置 'align' => 'C', //中央揃え 'stretch' => false, //ストレッチ無し 'fitwidth' => true, //横幅にフィット 'cellfitalign' => '', //バーコードセルの位置指定無し ); // 各種の代表的なバーコード出力 // CODE 39 $pdf->Cell(0, 0, '[CODE39]のテスト : CODE39 TEST', 0, 1); $pdf->write1DBarcode('CODE39 TEST', 'C39', '', '', '', 18, 0.4, $style, 'N'); $pdf->Ln(); // CODE 39 + CHECKSUM $pdf->Cell(0, 0, '[CODE39チェックサム付]のテスト : CODE39 CHECKSUM', 0, 1); $pdf->write1DBarcode('CODE39 CHECKSUM', 'C39+', '', '', '', 18, 0.4, $style, 'N'); $pdf->Ln(); // CODE 128 $pdf->Cell(0, 0, '[CODE128]のテスト : CODE128 TEST', 0, 1); $pdf->write1DBarcode('CODE128 TEST', 'C128', '', '', '', 18, 0.4, $style, 'N'); $pdf->Ln(); // EAN 8 $pdf->Cell(0, 0, 'EAN8 : 4901234', 0, 1); $pdf->write1DBarcode('4901234', 'EAN8', '', '', '', 18, 0.4, $style, 'N'); $pdf->Ln(); // EAN 13 $pdf->Cell(0, 0, 'EAN13 : 490123456789', 0, 1); $pdf->write1DBarcode('490123456789', 'EAN13', '', '', '', 18, 0.4, $style, 'N'); $pdf->Ln(); // CODABAR $pdf->Cell(0, 0, 'CODABAR : 123456789', 0, 1); $pdf->write1DBarcode('123456789', 'CODABAR', '', '', '', 18, 0.4, $style, 'N'); $pdf->Ln(); // pdf表示設定 $pdf->Output('pdf-barcode-1.pdf', 'I'); ?>
これの実行結果は以下の通りです。
バーコードの種類は TCPDF のソースから以下のものが在ることが分かります。C39 : CODE 39 - ANSI MH10.8M-1983 - USD-3 - 3 of 9. C39+ : CODE 39 with checksum C39E : CODE 39 EXTENDED C39E+ : CODE 39 EXTENDED + CHECKSUM C93 : CODE 93 - USS-93 S25 : Standard 2 of 5 S25+ : Standard 2 of 5 + CHECKSUM I25 : Interleaved 2 of 5 I25+ : Interleaved 2 of 5 + CHECKSUM C128 : CODE 128 C128A : CODE 128 A C128B : CODE 128 B C128C : CODE 128 C EAN2 : 2-Digits UPC-Based Extension EAN5 : 5-Digits UPC-Based Extension EAN8 : EAN 8 EAN13 : EAN 13 UPCA : UPC-A UPCE : UPC-E MSI : MSI (Variation of Plessey code) MSI+ : MSI + CHECKSUM (modulo 11) POSTNET : POSTNET PLANET : PLANET RMS4CC : RMS4CC (Royal Mail 4-state Customer Code) - CBC (Customer Bar Code) KIX : KIX (Klant index - Customer index) IMB : Intelligent Mail Barcode - Onecode - USPS-B-3200 CODABAR : CODABAR CODE11 : CODE 11 PHARMA : PHARMACODE PHARMA2T: PHARMACODE TWO-TRACKS