CELLFPDF.PHP クラスモジュール

クラスのファイル名

cellfpdf.php Ver 1.3

説明

header_text ヘッダー文字列を印字する。
footer_mode フッターにページを印字する。
CellList() 指定するセル幅内で折り返し印字する。
HyoList() 表を作成する。
などの場合に設定します。

パラメータ

使用するPHPスクリプトでの設定
  require_once 'cellfpdf.php';       を先頭に設定します。
  $pdf=new CELLFPDF("P","mm","A4");  などとしてクラスを生成します。

PDFを生成する次のクラスをオーバライドします。
  mbfpdf.php Version: 1.0b
  fpdf.php Version: 1.53

参照

header_text, CellList(), LowCount(), HyoList(), Cell(), GetX(), GetY(), SetX(), SetY(), SetXY().

目次

<?
#-------------------------------------------------------------------------------
# code39pdf.php Ver 1.3 2007-09-17 by K-Tsubota
#
# 2007-09-17 : GyoKakou() の最終文字の種類で改行なしとした。
# 2007-09-16 : CellList() 及び HyoList() の行間を調整した。
# hex2number() 関数を削除した。
#
#-------------------------------------------------------------------------------
# cellfpdf.php Ver 1.0 2007-05-27 by K-Tsubota
#
# 使用するPHPスクリプトでの設定
#   require_once 'cellfpdf.php';       を先頭に設定すること
#   $pdf=new CELLFPDF("P","mm","A4");  を生成すること
#
# 必要とするPDF生成するクラスファイル
#   mbfpdf.php Version: 1.0b
#   fpdf.php Version: 1.53
#-------------------------------------------------------------------------------
require('mbfpdf.php');
#-------------------------------------------------------------------------------
class CELLFPDF extends MBFPDF{
var $footer_mode   = 0;  # フッターのモード
var $header_text   = ""; # ヘッダー文字
var $header_family = "";
var $header_style  = "";
var $header_size   = 14;
var $header_x      = 0;
var $header_y      = 10;
var $header_align  = "C";
var $header_color  = "000000";
#-------------------------------------------------------------------------------
# 指定されたセル幅で折り返し印字する
#
# CellList($wid,$hei,$str,$lin,$lcr,$fil,$cnt,$mode)
#
# 戻り値     :行数
# $wid       :セル幅
# $hei       :1行のセルの高さ
# $str       :表示する文字列
# $lin       :境界線の有無(0:なし,1:あり,L:LEFT,T:TOP,R:RIGHT,B:BOTTOM)
# $lcr       :文字列の位置(L:左寄せ,C:中央,R:右寄せ)
# $fil       :背景色(1:有,0:無)
# $cnt       :行数のみ取得(1:行数のみ)
# $mode      :行幅モード(0:固定行幅,1:境界線を含む行幅調整)
#-------------------------------------------------------------------------------
 function CellList($wid,$hei=5,$str,$lin=0,$lcr="L",$fil=0,$cnt=0,$mode=0){
   $low_cnt=0;
   $str=trim($this->GyoKakou($str,$wid));
   $strG=explode("\n",$str); $low_cnt=count($strG);
   if($cnt == 1){return $low_cnt;}
#---
   if($this->y+$hei*$low_cnt>$this->PageBreakTrigger && !$this->InFooter && $this->AcceptPageBreak()){
      $this->AddPage($this->CurOrientation);
   }
#---
   $x=$this->GetX(); $y=$this->GetY();
   if($low_cnt == 1){
       $this->Cell($wid, $hei, $str, $lin, 0, $lcr, $fil);
       $this->SetXY($x,$y+$hei);
       return $low_cnt;
   }
#------------------------------------------
   $j=$low_cnt;
   if($mode == 1){
#      境界線を含む行幅調整
       $hm=round($this->FontSize,2);
       $hy=($hei-$hm)/2;
       $hg=round($hei-($hy*2)/$j,3);
       $this->SetXY($x,$y+$hy);
       for($k=0; $k<$j; $k++){
           $this->Cell($wid, $hg, $strG[$k], 0, 2, $lcr, $fil);
       }
       $this->SetXY($x,$y);
       $this->Cell($wid, $hei*$low_cnt, '', $lin, 0, $lcr, 0);
       $this->SetXY($x,$y+$hei*$low_cnt);
   }else{
#      固定行幅(ノーマルモード)
       for($k=0; $k<$j; $k++){
           $this->Cell($wid, $hei, $strG[$k], 0, 2, $lcr, $fil);
           $this->SetX($x);
       }
       $this->SetXY($x,$y);
       $this->Cell($wid, $hei*$low_cnt, '', $lin, 0, $lcr, 0);
       $this->SetXY($x,$y+$hei*$low_cnt);
   }
   return $low_cnt;
 }
#-------------------------------------------------------------------------------
# 指定されたセル幅における文字列の行数を返す
#
# 戻り値     :行数
# $wid       :セル幅
# $str       :文字列
#-------------------------------------------------------------------------------
 function LowCount($wid,$str){
   $str=trim($this->GyoKakou($str,$wid));
   if($str == ""){return 0;}
   $strG=explode("\n",$str);
   return count($strG);
 }
#-------------------------------------------------------------------------------
# 表リスト作成(複数行対応)
#
# 戻り値     :行数
# $wid(array):各セル幅
# $hei       :1行の高さ
# $str(array):各セルの文字列
# $line      :境界線の有無
# $lcr(array):セル内文字列の位置
# $fill      :背景色の有無
# $mode      :行幅モード(0:固定行幅,1:均等行幅,2:最大行均等行幅,3:右合せ例外)
#-------------------------------------------------------------------------------
 function HyoList($wid, $hei, $str, $line, $lcr, $fill=0, $mode=0){
   $low_max=1; $low_cnt=array();
   for($i=0; $i<count($str); $i++){
       $str[$i]=$this->GyoKakou($str[$i],$wid[$i]);
       $strG=explode("\n",$str[$i]); $low_cnt[$i]=count($strG);
       if($low_cnt[$i] > $low_max){$low_max=$low_cnt[$i];}
   }
#---
   if($this->y+$hei*$low_max>$this->PageBreakTrigger && !$this->InFooter && $this->AcceptPageBreak()){
      $this->AddPage($this->CurOrientation);
   }
#---
   $x2=$this->GetX(); $y2=$this->GetY();
#--- 全セル1行のケース ---
   if($low_max == 1){
     for($i=0; $i<count($str); $i++){
         $x=$this->GetX(); $y=$this->GetY();
         $this->Cell($wid[$i], $hei, $str[$i], $line, 0, $lcr[$i], $fill);
         $this->SetXY($x,$y);
         $this->Cell($wid[$i], $hei, '', $line, 0, $lcr[$i], $fill);
         $this->SetXY($x+$wid[$i],$y);
     }
     $this->SetXY($x2,$y2+$hei);
     return 1;
   }
#--- 固定行幅モード ---
   if($mode == 0){
     for($i=0; $i<count($str); $i++){
         $x=$this->GetX(); $y=$this->GetY();
         if($low_cnt[$i] == 1){
            $this->Cell($wid[$i], $hei*$low_max/$low_cnt[$i], $str[$i], $line, 0, $lcr[$i], $fill);
         }else{
            $strG=explode("\n",$str[$i]); $j=count($strG);
            $this->SetXY($x,$y);
            for($k=0; $k<$j; $k++){
                $this->Cell($wid[$i], $hei*$low_max/$low_cnt[$i], $strG[$k], 0, 2, $lcr[$i], 0);
            }
            $this->SetXY($x,$y);
            $this->Cell($wid[$i], $hei*$low_max, '', $line, 0, $lcr[$i], $fill);
         }
         $this->SetXY($x+$wid[$i],$y);
     }
     $this->SetXY($x2,$y2+$hei*$low_max);
     return $low_max;
   }
#--- 境界線を含む行幅調整モード ---
/*
   if($mode == 1){
*/
     for($i=0; $i<count($str); $i++){
#-----------------------
         if($mode == 2){
          for($z=$low_cnt[$i]; $z<$low_max; $z++){
              $low_cnt[$i]++; $str[$i] .= "\n";
          }
         }elseif($mode == 3){
          for($z=$low_cnt[$i]; $z<$low_max; $z++){
              if($lcr[$i] != "R"){$low_cnt[$i]++; $str[$i] .= "\n";}
          }
         }
#-----------------------
         $x=$this->GetX(); $y=$this->GetY();
         if($low_cnt[$i] == 1){
            $this->Cell($wid[$i], $hei*$low_max/$low_cnt[$i], $str[$i], $line, 0, $lcr[$i], $fill);
         }else{
            $strG=explode("\n",$str[$i]); $j=count($strG);
#--- 行間均等処理 ------------------
            $hm=round($this->FontSize,2);
            $hei2=$hei*$low_max/$low_cnt[$i];
            $hy=($hei2-$hm)/2;
            $hg=round($hei2-($hy*2)/$j,3);
            $this->SetXY($x,$y+$hy);
#-----------------------------------
            for($k=0; $k<$j; $k++){
                $this->Cell($wid[$i], $hg, $strG[$k], 0, 2, $lcr[$i], 0);
            }
            $this->SetXY($x,$y);
            $this->Cell($wid[$i], $hei*$low_max, '', $line, 0, $lcr[$i], $fill);
         }
         $this->SetXY($x+$wid[$i],$y);
     }
     $this->SetXY($x2,$y2+$hei*$low_max);
     return $low_max;
/*
   }
*/
 }
#-------------------------------------------------------------------------------
 function GyoKakou($str,$w){
   $w=$w-(2*$this->cMargin);
   if(strlen($str) == 0){return $str;}
   $str2=""; $i=1; $j=1; $cnt=0; $k=mb_strlen($str);
   while($k >= $j){
     if(mb_substr($str,$j-1,1) == "\n"){
        $cnt++; $str2.=mb_substr($str,$i-1,$j-$i+1); $j++; $i=$j;
     }elseif($this->GetStringWidth(mb_substr($str,$i-1,$j-$i+1)) <= $w){
        if(mb_strlen($str) == $j){$cnt++; $str2.=mb_substr($str,$i-1,$j-$i+1);}
        $j++;
     }else{
        $cnt++; $str2.=mb_substr($str,$i-1,$j-$i)."\n"; $i=$j;
     }
  }
#------------------
  $i=strlen($str2);
      if(substr($str2,$i-3,3) == "\n。"){$str2=substr($str2,0,$i-3)."。";}
  elseif(substr($str2,$i-3,3) == "\n、"){$str2=substr($str2,0,$i-3)."、";}
  elseif(substr($str2,$i-3,3) == "\n)"){$str2=substr($str2,0,$i-3).")";}
  elseif(substr($str2,$i-2,2) == "\n." ){$str2=substr($str2,0,$i-2)."."; }
  elseif(substr($str2,$i-2,2) == "\n," ){$str2=substr($str2,0,$i-2).","; }
  elseif(substr($str2,$i-2,2) == "\n)" ){$str2=substr($str2,0,$i-2).")"; }
#------------------
  return $str2;
 }
#-------------------------------------------------------------------------------
# フッターの設定
#-------------------------------------------------------------------------------
function Footer(){
    if($this->footer_mode == 0){return;}
    $this->SetY(-15);              // 下端から1.5 cm に移動
    $this->SetFont(PMINCHO,'',9);  // フォントを設定
    // 現在のページ番号を出力
    if($this->footer_mode == 1){$this->Cell(0,10,"- ".$this->PageNo()." -",0,0,'C');}
    // 現在のページ番号と総ページ数を出力
    if($this->footer_mode == 2){$this->Cell(0,10,$this->PageNo().' / {nb}',0,0,'C');}
}
#-------------------------------------------------------------------------------
# ヘッダーの設定
#-------------------------------------------------------------------------------
function Header(){
   if($this->header_text == ""){return;}
   $x = $this->x; $y = $this->y;
   if($this->header_family == ""){$this->header_family = PMINCHO;}
   $this->SetFont($this->header_family,$this->header_style,$this->header_size);
   if(strlen($this->header_color) != 6){$r=0;$g=0;$b=0;}
   else{
      $r=hexdec(substr($this->header_color,0,2));
      $g=hexdec(substr($this->header_color,2,2));
      $b=hexdec(substr($this->header_color,4,2));
   }
   $this->SetTextColor($r,$g,$b);
   $this->SetXY($this->rMargin+$this->header_x,$this->header_y);
   $margin = $this->w - $this->rMargin - $this->lMargin;
   $this->Cell($margin,10,$this->header_text,0,0,$this->header_align);
   $this->x = $x; $this->y = $y;
}
#-------------------------------------------------------------------------------
// end class
}
?>