草庐IT

php - 使用 fpdf 从数组输出项目符号列表

coder 2024-04-30 原文

我一直在寻找一种方法来向我的 pdf 输出文件添加项目符号或列表编号。

假设我有来自数据库的三行文本:

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<><>

• 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

最佳答案

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

//-------------
// 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

关于php - 使用 fpdf 从数组输出项目符号列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25676316/

有关php - 使用 fpdf 从数组输出项目符号列表的更多相关文章

  1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

    我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

  2. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  3. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  4. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  5. ruby - 在 Ruby 中使用匿名模块 - 2

    假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于

  6. ruby - 使用 ruby​​ 和 savon 的 SOAP 服务 - 2

    我正在尝试使用ruby​​和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我

  7. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  8. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  9. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  10. ruby-on-rails - 在 Ruby 中循环遍历多个数组 - 2

    我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代

随机推荐