2014-09-04 38 views
1

我一直在尋找一種方式,項目符號子彈,或列表的編號添加到我的PDF輸出文件。使用FPDF輸出從陣列

比方說,我有三行文字來自數據庫:

Line 1 
Line 2 
Line 3 

我想是FPDF讀每一行,並把子彈在每個前。因此,輸出將如下所示:

• Line 1 
• Line 2 
• Line 3 

我發現的最佳解決方案是下面的代碼。它功能完整(如果你有fpdf上傳到你的服務器)。問題是我無法弄清楚如何從文本行的列表:

<? 
     define('FPDF_FONTPATH', 'font/'); 

include('fpdf/fpdf.php'); 

class PDF extends FPDF 

{ 




    var $wLine; 
    var $hLine; 
    var $Text; 
    var $border; 
    var $align; 
    var $fill; 
    var $Padding; 
    var $lPadding; 
    var $tPadding; 
    var $bPadding; 
    var $rPadding; 
    var $TagStyle; 
    var $Indent; 
    var $Space; 
    var $PileStyle; 
      var $Line2Print; 
    var $NextLineBegin; 
    var $TagName; 
    var $Delta; 
    var $StringLength; 
      var $LineLength; 
    var $wTextLine; 
    var $nbSpace; 
    var $Xini; 
    var $href; 
    var $TagHref; 

    function WriteTag($w, $h, $txt, $border=0, $align="J", $fill=false, $padding=0) 
    { 
     $this->wLine=$w; 
     $this->hLine=$h; 
     $this->Text=trim($txt); 
     $this->Text=preg_replace("/\n|\r|\t/","",$this->Text); 
     $this->border=$border; 
     $this->align=$align; 
     $this->fill=$fill; 
     $this->Padding=$padding; 

     $this->Xini=$this->GetX(); 
     $this->href=""; 
     $this->PileStyle=array();   
       $this->TagHref=array(); 
     $this->LastLine=false; 

     $this->SetSpace(); 
     $this->Padding(); 
     $this->LineLength(); 
     $this->BorderTop(); 

     while($this->Text!="") 
     { 
      $this->MakeLine(); 
      $this->PrintLine(); 
     } 

     $this->BorderBottom(); 
    } 


    function SetStyle($tag, $family, $style, $size, $color, $indent=-1) 
    { 
      $tag=trim($tag); 
      $this->TagStyle[$tag]['family']=trim($family); 
      $this->TagStyle[$tag]['style']=trim($style); 
      $this->TagStyle[$tag]['size']=trim($size); 
      $this->TagStyle[$tag]['color']=trim($color); 
      $this->TagStyle[$tag]['indent']=$indent; 
    } 



    function SetSpace() 
    { 
     $tag=$this->Parser($this->Text); 
     $this->FindStyle($tag[2],0); 
     $this->DoStyle(0); 
     $this->Space=$this->GetStringWidth(" "); 
    } 


    function Padding() 
    { 
     if(preg_match("/^.+,/",$this->Padding)) { 
      $tab=explode(",",$this->Padding); 
      $this->lPadding=$tab[0]; 
      $this->tPadding=$tab[1]; 
      if(isset($tab[2])) 
       $this->bPadding=$tab[2]; 
      else 
       $this->bPadding=$this->tPadding; 
      if(isset($tab[3])) 
       $this->rPadding=$tab[3]; 
      else 
       $this->rPadding=$this->lPadding; 
     } 
     else 
     { 
      $this->lPadding=$this->Padding; 
      $this->tPadding=$this->Padding; 
      $this->bPadding=$this->Padding; 
      $this->rPadding=$this->Padding; 
     } 
     if($this->tPadding<$this->LineWidth) 
      $this->tPadding=$this->LineWidth; 
    } 


    function LineLength() 
    { 
     if($this->wLine==0) 
      $this->wLine=$this->w - $this->Xini - $this->rMargin; 

     $this->wTextLine = $this->wLine - $this->lPadding - $this->rPadding; 
    } 


    function BorderTop() 
    { 
     $border=0; 
     if($this->border==1) 
      $border="TLR"; 
     $this->Cell($this->wLine,$this->tPadding,"",$border,0,'C',$this->fill); 
     $y=$this->GetY()+$this->tPadding; 
     $this->SetXY($this->Xini,$y); 
    } 


    function BorderBottom() 
    { 
     $border=0; 
     if($this->border==1) 
      $border="BLR"; 
     $this->Cell($this->wLine,$this->bPadding,"",$border,0,'C',$this->fill); 
    } 


    function DoStyle($tag) 
    { 
     $tag=trim($tag); 
     $this->SetFont($this->TagStyle[$tag]['family'], 
      $this->TagStyle[$tag]['style'], 
      $this->TagStyle[$tag]['size']); 

     $tab=explode(",",$this->TagStyle[$tag]['color']); 
     if(count($tab)==1) 
      $this->SetTextColor($tab[0]); 
     else 
      $this->SetTextColor($tab[0],$tab[1],$tab[2]); 
    } 


    function FindStyle($tag, $ind) 
    { 
     $tag=trim($tag); 

     if($this->TagStyle[$tag]['family']!="") 
      $family=$this->TagStyle[$tag]['family']; 
     else 
     { 
      reset($this->PileStyle); 
      while(list($k,$val)=each($this->PileStyle)) 
      { 
       $val=trim($val); 
       if($this->TagStyle[$val]['family']!="") { 
        $family=$this->TagStyle[$val]['family']; 
        break; 
       } 
      } 
     } 

     $style=""; 
     $style1=strtoupper($this->TagStyle[$tag]['style']); 
     if($style1!="N") 
     { 
      $bold=false; 
      $italic=false; 
      $underline=false; 
      reset($this->PileStyle); 
      while(list($k,$val)=each($this->PileStyle)) 
      { 
       $val=trim($val); 
       $style1=strtoupper($this->TagStyle[$val]['style']); 
       if($style1=="N") 
        break; 
       else 
       { 
        if(strpos($style1,"B")!==false) 
         $bold=true; 
        if(strpos($style1,"I")!==false) 
         $italic=true; 
        if(strpos($style1,"U")!==false) 
         $underline=true; 
       } 
        } 
      if($bold) 
       $style.="B"; 
      if($italic) 
       $style.="I"; 
      if($underline) 
       $style.="U"; 
     } 

     if($this->TagStyle[$tag]['size']!=0) 
      $size=$this->TagStyle[$tag]['size']; 
     else 
     { 
      reset($this->PileStyle); 
      while(list($k,$val)=each($this->PileStyle)) 
      { 
       $val=trim($val); 
       if($this->TagStyle[$val]['size']!=0) { 
        $size=$this->TagStyle[$val]['size']; 
        break; 
       } 
      } 
     } 

     if($this->TagStyle[$tag]['color']!="") 
      $color=$this->TagStyle[$tag]['color']; 
     else 
     { 
      reset($this->PileStyle); 
      while(list($k,$val)=each($this->PileStyle)) 
      { 
       $val=trim($val); 
       if($this->TagStyle[$val]['color']!="") { 
        $color=$this->TagStyle[$val]['color']; 
        break; 
       } 
      } 
     } 

      $this->TagStyle[$ind]['family']=$family; 
     $this->TagStyle[$ind]['style']=$style; 
     $this->TagStyle[$ind]['size']=$size; 
     $this->TagStyle[$ind]['color']=$color; 
     $this->TagStyle[$ind]['indent']=$this->TagStyle[$tag]['indent']; 
    } 


    function Parser($text) 
    { 
     $tab=array(); 
     if(preg_match("|^(</([^>]+)>)|",$text,$regs)) { 
      $tab[1]="c"; 
      $tab[2]=trim($regs[2]); 
     } 
     else if(preg_match("|^(<([^>]+)>)|",$text,$regs)) { 
      $regs[2]=preg_replace("/^a/","a ",$regs[2]); 
      $tab[1]="o"; 
      $tab[2]=trim($regs[2]); 

       if(preg_match("/(.+) (.+)='(.+)'/",$regs[2])) { 
       $tab1=preg_split("/ +/",$regs[2]); 
       $tab[2]=trim($tab1[0]); 
       while(list($i,$couple)=each($tab1)) 
       { 
        if($i>0) { 
         $tab2=explode("=",$couple); 
         $tab2[0]=trim($tab2[0]); 
         $tab2[1]=trim($tab2[1]); 
         $end=strlen($tab2[1])-2; 
         $tab[$tab2[0]]=substr($tab2[1],1,$end); 
        } 
       } 
      } 
     } 
      // Espace 
      else if(preg_match("/^()/",$text,$regs)) { 
      $tab[1]="s"; 
      $tab[2]=' '; 
     } 
     // Texte 
     else if(preg_match("/^([^< ]+)/",$text,$regs)) { 
      $tab[1]="t"; 
      $tab[2]=trim($regs[1]); 
     } 
     // Elagage 
     $begin=strlen($regs[1]); 
      $end=strlen($text); 
      $text=substr($text, $begin, $end); 
     $tab[0]=$text; 

     return $tab; // 0 : $text; 1 : type de balise (tag); 2 : élément 
    } 


    function MakeLine() 
    { 
     $this->Text.=" "; 
     $this->LineLength=array(); 
     $this->TagHref=array(); 
     $Length=0; 
     $this->nbSpace=0; 

     $i=$this->BeginLine(); 
     $this->TagName=array(); 

     if($i==0) { 
      $Length=$this->StringLength[0]; 
      $this->TagName[0]=1; 
      $this->TagHref[0]=$this->href; 
     } 

     while($Length<$this->wTextLine) 
     { 
      $tab=$this->Parser($this->Text); 
      $this->Text=$tab[0]; 
      if($this->Text=="") { 
       $this->LastLine=true; 
       break; 
      } 

      if($tab[1]=="o") { 
       array_unshift($this->PileStyle,$tab[2]); 
       $this->FindStyle($this->PileStyle[0],$i+1); 

       $this->DoStyle($i+1); 
       $this->TagName[$i+1]=1; 
       if($this->TagStyle[$tab[2]]['indent']!=-1) { 
        $Length+=$this->TagStyle[$tab[2]]['indent']; 
        $this->Indent=$this->TagStyle[$tab[2]]['indent']; 
       } 
       if($tab[2]=="a") 
        $this->href=$tab['href']; 
      } 

      if($tab[1]=="c") { 
       array_shift($this->PileStyle); 
       if(isset($this->PileStyle[0])) 
       { 
        $this->FindStyle($this->PileStyle[0],$i+1); 
        $this->DoStyle($i+1); 
       } 
       $this->TagName[$i+1]=1; 
       if($this->TagStyle[$tab[2]]['indent']!=-1) { 
        $this->LastLine=true; 
        $this->Text=trim($this->Text); 
        break; 
       } 
       if($tab[2]=="a") 
        $this->href=""; 
      } 

      if($tab[1]=="s") { 
       $i++; 
       $Length+=$this->Space; 
       $this->Line2Print[$i]=""; 
       if($this->href!="") 
        $this->TagHref[$i]=$this->href; 
      } 

      if($tab[1]=="t") { 
       $i++; 
       $this->StringLength[$i]=$this->GetStringWidth($tab[2]); 
       $Length+=$this->StringLength[$i]; 
       $this->LineLength[$i]=$Length; 
       $this->Line2Print[$i]=$tab[2]; 
       if($this->href!="") 
        $this->TagHref[$i]=$this->href; 
       } 

     } 

     trim($this->Text); 
     if($Length>$this->wTextLine || $this->LastLine==true) 
      $this->EndLine(); 
    } 


    function BeginLine() 
    { 
     $this->Line2Print=array(); 
     $this->StringLength=array(); 

     if(isset($this->PileStyle[0])) 
     { 
      $this->FindStyle($this->PileStyle[0],0); 
      $this->DoStyle(0); 
     } 

     if(count($this->NextLineBegin)>0) { 
      $this->Line2Print[0]=$this->NextLineBegin['text']; 
      $this->StringLength[0]=$this->NextLineBegin['length']; 
      $this->NextLineBegin=array(); 
      $i=0; 
     } 
     else { 
      preg_match("/^((*(<([^>]+)>)* *)*)(.*)/",$this->Text,$regs); 
      $regs[1]=str_replace(" ", "", $regs[1]); 
      $this->Text=$regs[1].$regs[5]; 
      $i=-1; 
     } 

     return $i; 
    } 


    function EndLine() 
    { 
     if(end($this->Line2Print)!="" && $this->LastLine==false) { 
      $this->NextLineBegin['text']=array_pop($this->Line2Print); 
      $this->NextLineBegin['length']=end($this->StringLength); 
      array_pop($this->LineLength); 
     } 

     while(end($this->Line2Print)==="") 
      array_pop($this->Line2Print); 

     $this->Delta=$this->wTextLine-end($this->LineLength); 

     $this->nbSpace=0; 
     for($i=0; $i<count($this->Line2Print); $i++) { 
      if($this->Line2Print[$i]=="") 
       $this->nbSpace++; 
     } 
    } 


    function PrintLine() 
    { 
     $border=0; 
     if($this->border==1) 
      $border="LR"; 
     $this->Cell($this->wLine,$this->hLine,"",$border,0,'C',$this->fill); 
     $y=$this->GetY(); 
     $this->SetXY($this->Xini+$this->lPadding,$y); 

     if($this->Indent!=-1) { 
      if($this->Indent!=0) 
       $this->Cell($this->Indent,$this->hLine); 
      $this->Indent=-1; 
     } 

     $space=$this->LineAlign(); 
     $this->DoStyle(0); 
     for($i=0; $i<count($this->Line2Print); $i++) 
     { 
      if(isset($this->TagName[$i])) 
       $this->DoStyle($i); 
      if(isset($this->TagHref[$i])) 
       $href=$this->TagHref[$i]; 
      else 
       $href=''; 
      if($this->Line2Print[$i]=="") 
       $this->Cell($space,$this->hLine,"   ",0,0,'C',false,$href); 
      else 
       $this->Cell($this->StringLength[$i],$this->hLine,$this->Line2Print[$i],0,0,'C',false,$href); 
     } 

     $this->LineBreak(); 
     if($this->LastLine && $this->Text!="") 
      $this->EndParagraph(); 
     $this->LastLine=false; 
    } 


    function LineAlign() 
    { 
     $space=$this->Space; 
     if($this->align=="J") { 
      if($this->nbSpace!=0) 
       $space=$this->Space + ($this->Delta/$this->nbSpace); 
      if($this->LastLine) 
       $space=$this->Space; 
     } 

     if($this->align=="R") 
      $this->Cell($this->Delta,$this->hLine); 

     if($this->align=="C") 
      $this->Cell($this->Delta/2,$this->hLine); 

     return $space; 
    } 


    function LineBreak() 
    { 
     $x=$this->Xini; 
     $y=$this->GetY()+$this->hLine; 
     $this->SetXY($x,$y); 
    } 


    function EndParagraph() 
    { 
     $border=0; 
     if($this->border==1) 
      $border="LR"; 
     $this->Cell($this->wLine,$this->hLine/2,"",$border,0,'C',$this->fill); 
     $x=$this->Xini; 
     $y=$this->GetY()+$this->hLine/2; 
     $this->SetXY($x,$y); 
    } 
// end add 

//bullet 
    function MultiCellBltArray($w, $h, $blt_array, $border=0, $align='J', $fill=0) 
    { 
     if (!is_array($blt_array)) 
     { 
      die('MultiCellBltArray requires an array with the following keys: bullet, margin, text, indent, spacer'); 
      exit; 
     } 

       //Save x 
     $bak_x = $this->x; 

       for ($i=0; $i<sizeof($blt_array['text']); $i++) 
     { 
      //Get bullet width including margin 
      $blt_width = $this->GetStringWidth($blt_array['bullet'] . $blt_array['margin'])+$this->cMargin*2; 

        // SetX 
      $this->SetX($bak_x); 

        //Output indent 
      if ($blt_array['indent'] > 0) 
       $this->Cell($blt_array['indent']); 

        //Output bullet 
      $this->Cell($blt_width, $h, $blt_array['bullet'] . $blt_array['margin'], 0, '', $fill); 

        //Output text 
      $this->MultiCell($w-$blt_width, $h, $blt_array['text'][$i], $border, $align, $fill); 

        //Insert a spacer between items if not the last item 
      if ($i != sizeof($blt_array['text'])-1) 
       $this->Ln($blt_array['spacer']); 

        //Increment bullet if it's a number 
      if (is_numeric($blt_array['bullet'])) 
       $blt_array['bullet']++; 
     } 

       //Restore x 
     $this->x = $bak_x; 
    } 

} 


$pdf=new PDF(); 
$pdf->AliasNbPages(); 
$pdf->AddPage(); 
$pdf->SetFont('Times', '', 12); 

$column_width = $pdf->w-30; 
$sample_text = 'This is sample text.\n This is a new line of text'; 

$test1 = array(); 
$test1['bullet'] = chr(149); 
$test1['margin'] = ' '; 
$test1['indent'] = 0; 
$test1['spacer'] = 0; 
$test1['text'] = array(); 
for ($i=0; $i<2; $i++) 
{ 
    $test1['text'][$i] = $sample_text; 

} 
$pdf->SetX(10); 
$pdf->MultiCellBltArray($column_width-$pdf->x, 6, $test1); 
$pdf->Ln(10); 


$pdf->Output(); 
?> 

的問題是輸出看起來是這樣的:

• This is bulleted text.\n This is a new line of text 
• This is bulleted text.\n This is a new line of text 

當我想要它看起來像:

• This is bulleted text. 
• This is a new line of text 

這行代碼,似乎以這樣的方式行事,重複上面的$ sample_text:

for ($i=0; $i<2; $i++) 
{ 
    $test1['text'][$i] = $sample_text; 

} 

哪裏是你改變了 '$ I < 2' 至可以說, '$ I < 4',其結果必然是:

• This is bulleted text.\n This is a new line of text 
• This is bulleted text.\n This is a new line of text 
• This is bulleted text.\n This is a new line of text 
• This is bulleted text.\n This is a new line of text 

但是,如果我有一組四個不同的變量,我會想將它們放置在樣本文本文件,然後必須通過它的代碼迭代,留下我一個子彈在每個項目前:

$sample_text = "item 1 \n item 2 \n item 3 \n item 4"; 

而結果將被:

• item 1 
• item 2 
• item 3 
• item 4 

回答

1

\n單引號與打印\n PDF與否裏面,如果你希望它被打斷,因爲你需要用雙引號一個真正的換行符。

此外請確保它期望文本,而不是html

1

我有同樣的問題。這個附加的fPDF代碼幫助了我,也可以幫助你:http://fpdf.de/downloads/addons/56/(即使它是德國的網站,說明和代碼是英文的)。

此鏈接的描述: 「該腳本允許通過對MultiCellBltArray()的單個調用輸出項目符號列表,參數通過數組傳遞。」

3

您可以使用PHP的chr()功能。

//------------- 
// bullet() - shows a bullet point (in current font) 
//------------- 
// 
// @author munkywrench development 
// @since 30/04/05 
// @url http://munkywrench.co.nz 
// 
// @param Int $cellwidth - Sets width of indent 
//-------------- 
function bullet($cellwidth = '0') { 
    //bullet point is chr(127) 
    $this->Cell($cellwidth, 5, chr(127), 0, 0, 'R'); 
} 

Reference

+0

這應該是公認的答案。 爲我工作。 – hardworker 2017-08-21 12:21:22