| 1 | <?php |
|---|
| 2 | /* |
|---|
| 3 | * This file is part of EC-CUBE |
|---|
| 4 | * |
|---|
| 5 | * Copyright(c) 2000-2007 LOCKON CO.,LTD. All Rights Reserved. |
|---|
| 6 | * |
|---|
| 7 | * http://www.lockon.co.jp/ |
|---|
| 8 | * |
|---|
| 9 | * This program is free software; you can redistribute it and/or |
|---|
| 10 | * modify it under the terms of the GNU General Public License |
|---|
| 11 | * as published by the Free Software Foundation; either version 2 |
|---|
| 12 | * of the License, or (at your option) any later version. |
|---|
| 13 | * |
|---|
| 14 | * This program is distributed in the hope that it will be useful, |
|---|
| 15 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
|---|
| 16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|---|
| 17 | * GNU General Public License for more details. |
|---|
| 18 | * |
|---|
| 19 | * You should have received a copy of the GNU General Public License |
|---|
| 20 | * along with this program; if not, write to the Free Software |
|---|
| 21 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
|---|
| 22 | */ |
|---|
| 23 | |
|---|
| 24 | /*---------------------------------------------------------------------- |
|---|
| 25 | * [名称] GC_Pdf |
|---|
| 26 | * [概要] Pdfファイルを表示する。(PDFLib必須) |
|---|
| 27 | *---------------------------------------------------------------------- |
|---|
| 28 | */ |
|---|
| 29 | |
|---|
| 30 | // グリッドと文字の間隔 |
|---|
| 31 | define("GRID_SPACE", 4); |
|---|
| 32 | |
|---|
| 33 | class SC_Pdf { |
|---|
| 34 | var $arrText; |
|---|
| 35 | var $arrImage; |
|---|
| 36 | var $license_key; |
|---|
| 37 | var $block_option; |
|---|
| 38 | var $src_code; |
|---|
| 39 | var $dst_code; |
|---|
| 40 | var $pdiwarning; |
|---|
| 41 | var $pdfpath; |
|---|
| 42 | var $page_close; |
|---|
| 43 | |
|---|
| 44 | function SC_Pdf($width = 595, $height = 842, $fontsize = 10) { |
|---|
| 45 | $this->license_key = "B600602-010400-714251-5851C1"; |
|---|
| 46 | $this->src_code = CHAR_CODE; |
|---|
| 47 | // UTF-8でないとブロック内で改行できない。 |
|---|
| 48 | $this->dst_code = "UTF-8"; |
|---|
| 49 | // PDF BLOCKのプロパティ |
|---|
| 50 | $this->block_option = "encoding=UniJIS-UCS2-H textformat=utf8 fontname=HeiseiMin-W3 textflow=true"; |
|---|
| 51 | // 警告表示 |
|---|
| 52 | $this->pdiwarning = "true"; |
|---|
| 53 | // ページサイズ設定 |
|---|
| 54 | $this->width = $width; |
|---|
| 55 | $this->height = $height; |
|---|
| 56 | // PDF初期化 |
|---|
| 57 | $this->pdf = PDF_new(); |
|---|
| 58 | PDF_set_parameter($this->pdf, "license", $this->license_key); |
|---|
| 59 | PDF_set_parameter($this->pdf, "pdiwarning", $this->pdiwarning); |
|---|
| 60 | // ドキュメント開始 |
|---|
| 61 | PDF_begin_document($this->pdf, NULL, NULL); |
|---|
| 62 | // ページの状態 |
|---|
| 63 | $this->page_open = false; |
|---|
| 64 | // テーブルの色設定 |
|---|
| 65 | $this->setTableColor(); |
|---|
| 66 | // フォントサイズの設定 |
|---|
| 67 | $this->fontsize = $fontsize; |
|---|
| 68 | // グリッド描画の特殊指定 |
|---|
| 69 | $this->arrLines = array(); |
|---|
| 70 | // テーブルタイトルのスタイル |
|---|
| 71 | $this->arrHeaderColSize = array(); |
|---|
| 72 | $this->arrHeaderAlign = array(); |
|---|
| 73 | // テーブル補正値 |
|---|
| 74 | $this->table_left = 0; |
|---|
| 75 | // タイトル行の出力 |
|---|
| 76 | $this->title_enable = true; |
|---|
| 77 | // グリッドの出力 |
|---|
| 78 | $this->grid_enable = true; |
|---|
| 79 | } |
|---|
| 80 | |
|---|
| 81 | // タイトルを出力するか否か |
|---|
| 82 | function setTitleEnable($flag) { |
|---|
| 83 | $this->title_enable = $flag; |
|---|
| 84 | } |
|---|
| 85 | |
|---|
| 86 | // グリッドを出力するか否か |
|---|
| 87 | function setGridEnable($flag) { |
|---|
| 88 | $this->grid_enable = $flag; |
|---|
| 89 | } |
|---|
| 90 | |
|---|
| 91 | |
|---|
| 92 | // キー:ブロック名、値:表示テキストのハッシュ配列をセットする。 |
|---|
| 93 | function setTextBlock($list) { |
|---|
| 94 | unset($this->arrText); |
|---|
| 95 | $this->arrText[] = $list; |
|---|
| 96 | } |
|---|
| 97 | |
|---|
| 98 | // キー:ブロック名、値:ファイルパスのハッシュ配列をセットする。 |
|---|
| 99 | // ※パスはドキュメントルート以下 |
|---|
| 100 | function setImageBlock($list) { |
|---|
| 101 | unset($this->arrImage); |
|---|
| 102 | $this->arrImage[] = $list; |
|---|
| 103 | } |
|---|
| 104 | |
|---|
| 105 | // 表示背景となるテンプレートファイルパス |
|---|
| 106 | // ※パスはドキュメントルート以下 |
|---|
| 107 | function setTemplate($pdfpath) { |
|---|
| 108 | if(file_exists($pdfpath)) { |
|---|
| 109 | $this->pdfpath = $pdfpath; |
|---|
| 110 | } else { |
|---|
| 111 | print("指定したPDFテンプレートは存在しません:".$pdfpath); |
|---|
| 112 | exit; |
|---|
| 113 | } |
|---|
| 114 | } |
|---|
| 115 | |
|---|
| 116 | // テーブル位置補正値 |
|---|
| 117 | function setTableLeft($table_left) { |
|---|
| 118 | $this->table_left = $table_left; |
|---|
| 119 | } |
|---|
| 120 | |
|---|
| 121 | // グリッド描画の特殊指定 |
|---|
| 122 | function setGridLines($list) { |
|---|
| 123 | $this->arrLines = $list; |
|---|
| 124 | } |
|---|
| 125 | |
|---|
| 126 | // テーブルタイトルのスタイル設定 |
|---|
| 127 | function setTableHeaderStyle($arrColSize, $arrAlign) { |
|---|
| 128 | $this->arrHeaderColSize = $arrColSize; |
|---|
| 129 | $this->arrHeaderAlign = $arrAlign; |
|---|
| 130 | } |
|---|
| 131 | |
|---|
| 132 | // ブロックデータの書き込み(closeすると次回新規ページ) |
|---|
| 133 | function writeBlock() { |
|---|
| 134 | // テンプレートを使用する |
|---|
| 135 | if(!file_exists($this->pdfpath)) { |
|---|
| 136 | return; |
|---|
| 137 | } |
|---|
| 138 | // 既存PDFのドキュメントを取得 |
|---|
| 139 | $doc = pdf_open_pdi($this->pdf, $this->pdfpath, NULL, 0 ); |
|---|
| 140 | // 既存PDFのドキュメントから指定ページを取得 |
|---|
| 141 | $page = pdf_open_pdi_page($this->pdf, $doc, 1, NULL ); |
|---|
| 142 | // ページを開く |
|---|
| 143 | $this->openPage(); |
|---|
| 144 | |
|---|
| 145 | // 既存PDFのページを割り当てる |
|---|
| 146 | PDF_fit_pdi_page($this->pdf, $page, 0, 0, "adjustpage"); |
|---|
| 147 | |
|---|
| 148 | // テキストブロックの書き込み |
|---|
| 149 | $max = count($this->arrText); |
|---|
| 150 | for($i = 0;$i < $max; $i++) { |
|---|
| 151 | foreach($this->arrText[$i] as $key => $val) { |
|---|
| 152 | if($val != "") { |
|---|
| 153 | // 文字コードの変換 |
|---|
| 154 | mb_convert_variables($this->dst_code, $this->src_code, $val); |
|---|
| 155 | // 書き込み |
|---|
| 156 | $ret = PDF_fill_textblock($this->pdf, $page, $key, $val, $this->block_option); |
|---|
| 157 | } |
|---|
| 158 | } |
|---|
| 159 | } |
|---|
| 160 | |
|---|
| 161 | // イメージブロックの書き込み |
|---|
| 162 | $max = count($this->arrImage); |
|---|
| 163 | for($i = 0;$i < $max; $i++) { |
|---|
| 164 | foreach($this->arrImage[$i] as $key => $val) { |
|---|
| 165 | if($val != "") { |
|---|
| 166 | $img = PDF_load_image($this->pdf, "auto", $val, NULL ); |
|---|
| 167 | $ret = PDF_fill_imageblock($this->pdf, $page, $key, $img, NULL); |
|---|
| 168 | } |
|---|
| 169 | } |
|---|
| 170 | } |
|---|
| 171 | |
|---|
| 172 | // 割り当てたページを閉じる |
|---|
| 173 | PDF_close_pdi_page($this->pdf, $page); |
|---|
| 174 | // 割り当てたドキュメントを閉じる |
|---|
| 175 | PDF_close_pdi($this->pdf, $doc); |
|---|
| 176 | } |
|---|
| 177 | |
|---|
| 178 | // ページを閉じる |
|---|
| 179 | function closePage() { |
|---|
| 180 | if($this->page_open) { |
|---|
| 181 | // ページを閉じる |
|---|
| 182 | PDF_end_page_ext($this->pdf, NULL); |
|---|
| 183 | $this->page_open = false; |
|---|
| 184 | } |
|---|
| 185 | } |
|---|
| 186 | |
|---|
| 187 | // ページを開く |
|---|
| 188 | function openPage() { |
|---|
| 189 | if(!$this->page_open) { |
|---|
| 190 | // 新しいページを開く |
|---|
| 191 | PDF_begin_page_ext($this->pdf, $this->width, $this->height, NULL); |
|---|
| 192 | $this->page_open = true; |
|---|
| 193 | } |
|---|
| 194 | } |
|---|
| 195 | |
|---|
| 196 | // 新しいページを開く |
|---|
| 197 | function newPage() { |
|---|
| 198 | PDF_end_page_ext($this->pdf, NULL); |
|---|
| 199 | PDF_begin_page_ext($this->pdf, $this->width, $this->height, NULL); |
|---|
| 200 | } |
|---|
| 201 | |
|---|
| 202 | // アクティブなページのサイズを取得する |
|---|
| 203 | function getSize() { |
|---|
| 204 | $this->openPage(); |
|---|
| 205 | $x = PDF_get_value($this->pdf, 'pagewidth', 0); |
|---|
| 206 | $y = PDF_get_value($this->pdf, 'pageheight', 0); |
|---|
| 207 | return array($x, $y); |
|---|
| 208 | } |
|---|
| 209 | |
|---|
| 210 | // 座標を入れ替えて取得する(左下(0,0)を左上(0,0)に変換) |
|---|
| 211 | function posTopDown($x, $y) { |
|---|
| 212 | $width = 0; |
|---|
| 213 | $height = 0; |
|---|
| 214 | list($width, $height) = $this->getSize(); |
|---|
| 215 | // x座標は、変更の必要なし |
|---|
| 216 | $pdf_x = $x; |
|---|
| 217 | $pdf_y = $height - $y; |
|---|
| 218 | return array($pdf_x, $pdf_y); |
|---|
| 219 | } |
|---|
| 220 | |
|---|
| 221 | // テーブルカラーの設定 |
|---|
| 222 | function setTableColor($frame_color = "000000", $title_color = "F0F0F0", $line_color = "D1DEFE", $last_color = "FDCBFE") { |
|---|
| 223 | $this->frame_color = $frame_color; |
|---|
| 224 | $this->title_color = $title_color; |
|---|
| 225 | $this->line_color = $line_color; |
|---|
| 226 | $this->last_color = $last_color; |
|---|
| 227 | } |
|---|
| 228 | |
|---|
| 229 | // テーブルのグリッドを表示する。 |
|---|
| 230 | function writeGrid($x, $y, $arrCol, $line_max, $last_color_flg = true) { |
|---|
| 231 | // テーブル幅 |
|---|
| 232 | $max = count($arrCol); |
|---|
| 233 | $width = 0; |
|---|
| 234 | for($i = 0; $i < $max; $i++) { |
|---|
| 235 | $width += $arrCol[$i]; |
|---|
| 236 | } |
|---|
| 237 | |
|---|
| 238 | if($this->title_enable) { |
|---|
| 239 | // タイトルグリッド描画 |
|---|
| 240 | $this->writeFrameRect($x, $y + GRID_SPACE, $width + GRID_SPACE, $this->fontsize + GRID_SPACE, $this->title_color, $this->frame_color); |
|---|
| 241 | } |
|---|
| 242 | |
|---|
| 243 | // グリッド特殊指定あり |
|---|
| 244 | if(count($this->arrLines) > 0) { |
|---|
| 245 | $count = count($this->arrLines); |
|---|
| 246 | $pos = 0; |
|---|
| 247 | for($i = 0; $i < $count; $i++) { |
|---|
| 248 | if(($i % 2) != 0) { |
|---|
| 249 | // 行の間隔 |
|---|
| 250 | $down = ($pos + 1) * $this->fontsize * 1.5; |
|---|
| 251 | // 描画する縦幅を求める |
|---|
| 252 | $height = ($this->fontsize + GRID_SPACE) * $this->arrLines[$i] + ($this->arrLines[$i] - 1); |
|---|
| 253 | // 行グリッド描画 |
|---|
| 254 | $this->writeRect($x, $y + GRID_SPACE + $down, $width + GRID_SPACE, $height, $this->line_color); |
|---|
| 255 | } |
|---|
| 256 | $pos += $this->arrLines[$i]; |
|---|
| 257 | } |
|---|
| 258 | } else { |
|---|
| 259 | for($i = 1; $i <= $line_max; $i++) { |
|---|
| 260 | if(($i % 2) == 0) { |
|---|
| 261 | // 行の間隔 |
|---|
| 262 | $down = $i * $this->fontsize * 1.5; |
|---|
| 263 | // 行グリッド描画 |
|---|
| 264 | $this->writeRect($x, $y + GRID_SPACE + $down, $width + GRID_SPACE, $this->fontsize + GRID_SPACE, $this->line_color); |
|---|
| 265 | } |
|---|
| 266 | } |
|---|
| 267 | // 最終行に色をつける場合 |
|---|
| 268 | if($last_color_flg) { |
|---|
| 269 | // 行の間隔 |
|---|
| 270 | $down = $line_max * $this->fontsize * 1.5; |
|---|
| 271 | // 行グリッド描画 |
|---|
| 272 | $this->writeRect($x, $y + GRID_SPACE + $down, $width + GRID_SPACE, $this->fontsize + GRID_SPACE, $this->last_color); |
|---|
| 273 | } |
|---|
| 274 | } |
|---|
| 275 | } |
|---|
| 276 | |
|---|
| 277 | // グリッド用のアンダーラインを引く |
|---|
| 278 | /* |
|---|
| 279 | $x :テーブル開始位置X軸 |
|---|
| 280 | $y :テーブル開始位置Y軸 |
|---|
| 281 | $arrCol :カラムサイズの配列 |
|---|
| 282 | $line :アンダーラインを引く行 |
|---|
| 283 | $start_col :アンダーライン開始カラム(0:開始カラム) |
|---|
| 284 | */ |
|---|
| 285 | function writeUnderLine($x, $y, $arrCol, $line, $start_col = 0) { |
|---|
| 286 | // テーブル幅 |
|---|
| 287 | $max = count($arrCol); |
|---|
| 288 | $width = 0; |
|---|
| 289 | for($i = 0; $i < $max; $i++) { |
|---|
| 290 | $width += $arrCol[$i]; |
|---|
| 291 | } |
|---|
| 292 | |
|---|
| 293 | $start_x = 0; |
|---|
| 294 | for($i = 0; $i < $start_col; $i++) { |
|---|
| 295 | $start_x += $arrCol[$i]; |
|---|
| 296 | } |
|---|
| 297 | |
|---|
| 298 | // アンダーラインのY座標を求める |
|---|
| 299 | $down = ($line + 1) * $this->fontsize * 1.5; |
|---|
| 300 | // 行グリッド描画 |
|---|
| 301 | $sx = $x + $start_x + GRID_SPACE + $this->table_left; |
|---|
| 302 | $sy = $y + GRID_SPACE + $down - 1; |
|---|
| 303 | $ex = $x + $width + GRID_SPACE; |
|---|
| 304 | $ey = $sy; |
|---|
| 305 | |
|---|
| 306 | $this->writeLine($sx, $sy, $ex, $ey); |
|---|
| 307 | } |
|---|
| 308 | |
|---|
| 309 | // 真ん中横位置を求める |
|---|
| 310 | function getXCenter($width) { |
|---|
| 311 | $page_width = 0; |
|---|
| 312 | $page_height = 0; |
|---|
| 313 | list($page_width, $page_height) = $this->getSize(); |
|---|
| 314 | $x = ($page_width - $width) / 2; |
|---|
| 315 | return $x; |
|---|
| 316 | } |
|---|
| 317 | |
|---|
| 318 | // 自動中央よせ |
|---|
| 319 | function writeTableCenter($table, $y, $arrCol, $arrAlign, $line_max = 256, $start_no = 1, $last_color_flg = false) { |
|---|
| 320 | // テーブルサイズ取得 |
|---|
| 321 | $width = 0; |
|---|
| 322 | foreach($arrCol as $val) { |
|---|
| 323 | $width += $val; |
|---|
| 324 | } |
|---|
| 325 | // 中央よせ位置取得 |
|---|
| 326 | $x = $this->getXCenter($width) + $this->table_left; |
|---|
| 327 | list($ret_x, $ret_y) = $this->writeTable($table, $x, $y, $arrCol, $arrAlign, $line_max, $start_no, $last_color_flg); |
|---|
| 328 | // X軸の座標を返す |
|---|
| 329 | return array($ret_x, $ret_y); |
|---|
| 330 | } |
|---|
| 331 | |
|---|
| 332 | // データの書き込み(closeすると次回新規ページ) |
|---|
| 333 | // $start_no:1行目(タイトル)を0とする。 |
|---|
| 334 | // $line_max:タイトルを含まない行数 |
|---|
| 335 | function writeTable($table, $x, $y, $arrCol, $arrAlign, $line_max = 256, $start_no = 1, $last_color_flg = false) { |
|---|
| 336 | $this->openPage(); |
|---|
| 337 | |
|---|
| 338 | $table = ereg_replace("\n$", "", $table); |
|---|
| 339 | |
|---|
| 340 | $arrRet = split("\n", $table); |
|---|
| 341 | |
|---|
| 342 | if($line_max > (count($arrRet) - $start_no)) { |
|---|
| 343 | $line_max = count($arrRet) - $start_no; |
|---|
| 344 | } |
|---|
| 345 | |
|---|
| 346 | // タイトル有効 |
|---|
| 347 | if($this->grid_enable) { |
|---|
| 348 | // グリッドの描画 |
|---|
| 349 | $this->writeGrid($x, $y, $arrCol, $line_max, $last_color_flg); |
|---|
| 350 | } |
|---|
| 351 | |
|---|
| 352 | // UnicodeエンコーディングとしてUTF-8を設定 |
|---|
| 353 | PDF_set_parameter($this->pdf, "textformat", "utf8"); |
|---|
| 354 | |
|---|
| 355 | // タイトル有効 |
|---|
| 356 | if($this->title_enable) { |
|---|
| 357 | if(count($this->arrHeaderColSize) > 0 && count($this->arrHeaderAlign) > 0 ) { |
|---|
| 358 | list($linecol, $aligncol, $width) = $this->getTableOption($this->arrHeaderColSize, $this->arrHeaderAlign); |
|---|
| 359 | } else { |
|---|
| 360 | list($linecol, $aligncol, $width) = $this->getTableOption($arrCol, $arrAlign); |
|---|
| 361 | } |
|---|
| 362 | |
|---|
| 363 | // タイトル行の書き込み |
|---|
| 364 | $option = "ruler {" . $linecol . "} "; |
|---|
| 365 | $option.= "tabalignment {" . $aligncol . "} "; |
|---|
| 366 | $fontsize = $this->fontsize; |
|---|
| 367 | $option.= "hortabmethod ruler leading=150% fontname=HeiseiKakuGo-W5 fontsize=$fontsize encoding=UniJIS-UCS2-H"; |
|---|
| 368 | |
|---|
| 369 | $this->writeTableData($table, $x, $y, $width, 0, 0, $option); |
|---|
| 370 | } |
|---|
| 371 | |
|---|
| 372 | list($linecol, $aligncol, $width) = $this->getTableOption($arrCol, $arrAlign); |
|---|
| 373 | |
|---|
| 374 | // データ行の書き込み |
|---|
| 375 | $option = "ruler {" . $linecol . "} "; |
|---|
| 376 | $option.= "tabalignment {" . $aligncol . "} "; |
|---|
| 377 | $option.= "hortabmethod ruler leading=150% fontname=HeiseiMin-W3 fontsize=$this->fontsize encoding=UniJIS-UCS2-H"; |
|---|
| 378 | |
|---|
| 379 | if($start_no <= 0) { |
|---|
| 380 | $start_no = 1; |
|---|
| 381 | $end_no = $line_max; |
|---|
| 382 | } else { |
|---|
| 383 | $end_no = $start_no + $line_max - 1; |
|---|
| 384 | } |
|---|
| 385 | |
|---|
| 386 | $y += $this->fontsize * 1.5; |
|---|
| 387 | |
|---|
| 388 | list($ret_x, $ret_y) = $this->writeTableData($table, $x, $y, $width, $start_no, $end_no, $option); |
|---|
| 389 | |
|---|
| 390 | return array($ret_x, $ret_y); |
|---|
| 391 | } |
|---|
| 392 | |
|---|
| 393 | function getTableOption($arrCol, $arrAlign) { |
|---|
| 394 | // カラムサイズ |
|---|
| 395 | $max = count($arrCol); |
|---|
| 396 | $width = 0; |
|---|
| 397 | for($i = 0; $i < $max; $i++) { |
|---|
| 398 | $width += $arrCol[$i]; |
|---|
| 399 | $linecol.= $width . " "; |
|---|
| 400 | } |
|---|
| 401 | |
|---|
| 402 | // カラム位置 |
|---|
| 403 | $max = count($arrAlign); |
|---|
| 404 | for($i = 0; $i < $max; $i++) { |
|---|
| 405 | $aligncol.= $arrAlign[$i] . " "; |
|---|
| 406 | } |
|---|
| 407 | |
|---|
| 408 | return array($linecol, $aligncol, $width); |
|---|
| 409 | } |
|---|
| 410 | |
|---|
| 411 | // テーブルデータの書き込み |
|---|
| 412 | function writeTableData($table, $x, $y, $table_width, $start_no, $end_no, $option) { |
|---|
| 413 | $arrLine = split("\n", $table); |
|---|
| 414 | for($i = $start_no; $i <= $end_no; $i++) { |
|---|
| 415 | $line.=$arrLine[$i] . "\n"; |
|---|
| 416 | } |
|---|
| 417 | |
|---|
| 418 | // テーブル位置を求める |
|---|
| 419 | list($pdf_x, $pdf_y) = $this->posTopDown($x, $y); |
|---|
| 420 | |
|---|
| 421 | // テーブル高さを求める |
|---|
| 422 | $table_height = $this->fontsize * 1.5 * ($end_no - $start_no + 1); |
|---|
| 423 | // テーブル右下のy座標を求める |
|---|
| 424 | $end_y = $pdf_y - $table_height; |
|---|
| 425 | if($end_y < 0) { |
|---|
| 426 | $end_y = 0; |
|---|
| 427 | } |
|---|
| 428 | $enc_table = mb_convert_encoding($line, "utf-8", CHAR_CODE); |
|---|
| 429 | |
|---|
| 430 | $tf = PDF_create_textflow($this->pdf, $enc_table, $option); |
|---|
| 431 | |
|---|
| 432 | PDF_fit_textflow($this->pdf, $tf, $pdf_x, $pdf_y, $pdf_x + $table_width, $end_y, NULL); |
|---|
| 433 | PDF_delete_textflow($this->pdf, $tf); |
|---|
| 434 | |
|---|
| 435 | // テーブル左下座標を返す |
|---|
| 436 | return array($x, $y + $table_height); |
|---|
| 437 | } |
|---|
| 438 | |
|---|
| 439 | // 色の設定 |
|---|
| 440 | function setColor($rgb) { |
|---|
| 441 | if($rgb != "") { |
|---|
| 442 | list($r, $g, $b) = sfGetPdfRgb($rgb); |
|---|
| 443 | PDF_setcolor($this->pdf, "fillstroke", "rgb", $r, $g, $b, 0); |
|---|
| 444 | } |
|---|
| 445 | } |
|---|
| 446 | |
|---|
| 447 | // 短形を描画 |
|---|
| 448 | function writeRect($x, $y, $width, $height, $rgb = "") { |
|---|
| 449 | $this->openPage(); |
|---|
| 450 | list($pdf_x, $pdf_y) = $this->posTopDown($x, $y); |
|---|
| 451 | $this->setColor($rgb); |
|---|
| 452 | PDF_rect($this->pdf, $pdf_x,$pdf_y,$width,-$height); |
|---|
| 453 | PDF_fill($this->pdf); |
|---|
| 454 | } |
|---|
| 455 | |
|---|
| 456 | // 枠付の短形を描画 |
|---|
| 457 | function writeFrameRect($x, $y, $width, $height, $rgb, $frgb) { |
|---|
| 458 | $this->openPage(); |
|---|
| 459 | list($pdf_x, $pdf_y) = $this->posTopDown($x, $y); |
|---|
| 460 | $this->setColor($frgb); |
|---|
| 461 | PDF_rect($this->pdf, $pdf_x,$pdf_y,$width,-$height); |
|---|
| 462 | PDF_fill($this->pdf); |
|---|
| 463 | |
|---|
| 464 | $this->setColor($rgb); |
|---|
| 465 | PDF_rect($this->pdf, $pdf_x+1,$pdf_y-1,$width-2,-$height+2); |
|---|
| 466 | PDF_fill($this->pdf); |
|---|
| 467 | } |
|---|
| 468 | |
|---|
| 469 | // 直線を描画 |
|---|
| 470 | function writeLine($sx, $sy, $ex, $ey, $rgb = "000000") { |
|---|
| 471 | $this->openPage(); |
|---|
| 472 | list($pdf_sx, $pdf_sy) = $this->posTopDown($sx, $sy); |
|---|
| 473 | list($pdf_ex, $pdf_ey) = $this->posTopDown($ex, $ey); |
|---|
| 474 | $this->setColor($rgb); |
|---|
| 475 | PDF_setlinewidth($this->pdf, 1.0); |
|---|
| 476 | PDF_moveto($this->pdf, $pdf_sx, $pdf_sy); |
|---|
| 477 | PDF_lineto($this->pdf, $pdf_ex, $pdf_ey); |
|---|
| 478 | PDF_stroke($this->pdf); |
|---|
| 479 | } |
|---|
| 480 | |
|---|
| 481 | // ファイルのダウンロード |
|---|
| 482 | function output($filekey = "") { |
|---|
| 483 | if(isset($this->pdf)) { |
|---|
| 484 | // ページを閉じる |
|---|
| 485 | $this->closePage(); |
|---|
| 486 | // PDFの終了 |
|---|
| 487 | PDF_end_document($this->pdf, NULL); |
|---|
| 488 | // 出力用データの取得 |
|---|
| 489 | $buf = PDF_get_buffer($this->pdf); |
|---|
| 490 | $filename = $filekey . date("ymdHis").".pdf"; |
|---|
| 491 | |
|---|
| 492 | header("Content-disposition: attachment; filename=$filename"); |
|---|
| 493 | header("Content-type: application/octet-stream; name=$filename"); |
|---|
| 494 | |
|---|
| 495 | /* |
|---|
| 496 | * session_start()を事前に呼び出している場合に出力される以下のヘッダは、 |
|---|
| 497 | * URL直接呼び出し時にエラーを発生させるので空にしておく。 |
|---|
| 498 | * |
|---|
| 499 | * Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 |
|---|
| 500 | * Progma: no-cache |
|---|
| 501 | * |
|---|
| 502 | */ |
|---|
| 503 | header("Cache-Control: "); |
|---|
| 504 | header("Pragma: "); |
|---|
| 505 | print $buf; |
|---|
| 506 | |
|---|
| 507 | // PDF解放 |
|---|
| 508 | PDF_delete($this->pdf); |
|---|
| 509 | } else { |
|---|
| 510 | print("PDFが生成されていません。"); |
|---|
| 511 | } |
|---|
| 512 | exit; |
|---|
| 513 | } |
|---|
| 514 | |
|---|
| 515 | // ファイルの表示 |
|---|
| 516 | function display() { |
|---|
| 517 | if(isset($this->pdf)) { |
|---|
| 518 | // ページを閉じる |
|---|
| 519 | $this->closePage(); |
|---|
| 520 | // PDFの終了 |
|---|
| 521 | PDF_end_document($this->pdf, NULL); |
|---|
| 522 | |
|---|
| 523 | // 出力用データの取得 |
|---|
| 524 | $buf = PDF_get_buffer($this->pdf); |
|---|
| 525 | $len = strlen($buf); |
|---|
| 526 | header("Content-type: application/pdf"); |
|---|
| 527 | header("Content-Length: $len"); |
|---|
| 528 | header("Content-Disposition: inline; filename=". date("YmdHis").".pdf"); |
|---|
| 529 | |
|---|
| 530 | /* |
|---|
| 531 | * session_start()を事前に呼び出している場合に出力される以下のヘッダは、 |
|---|
| 532 | * URL直接呼び出し時にエラーを発生させるので空にしておく。 |
|---|
| 533 | * |
|---|
| 534 | * Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 |
|---|
| 535 | * Progma: no-cache |
|---|
| 536 | * |
|---|
| 537 | */ |
|---|
| 538 | header("Cache-Control: "); |
|---|
| 539 | header("Pragma: "); |
|---|
| 540 | print $buf; |
|---|
| 541 | |
|---|
| 542 | // PDF解放 |
|---|
| 543 | PDF_delete($this->pdf); |
|---|
| 544 | } else { |
|---|
| 545 | print("PDFが生成されていません。"); |
|---|
| 546 | } |
|---|
| 547 | exit; |
|---|
| 548 | } |
|---|
| 549 | } |
|---|
| 550 | |
|---|
| 551 | ?> |
|---|