代码之家  ›  专栏  ›  技术社区  ›  nonononono

FPDF-在Multicell中写入HTML?

  •  3
  • nonononono  · 技术社区  · 13 年前

    WriteHTML可以放在Multicell中吗?怎样

    我检索并显示了数据库中的HTML输出,但想把它放在第二列(比方说),所以我把它放进了Multicell,但没有效果。

    以下内容无效:

    $pdf->Multicell(70,3.5, $pdf->WriteHTML($html));
    

    编辑:我找到了WriteHTMLCell,如何使用?

    任何人

    谢谢

    6 回复  |  直到 13 年前
        1
  •  4
  •   Kld    11 年前

    将此方法添加到您的 WriteHTML

    function WriteHtmlCell($cellWidth, $html){        
        $rm = $this->rMargin;
        $this->SetRightMargin($this->w - $this->GetX() - $cellWidth);
        $this->WriteHtml($html);
        $this->SetRightMargin($rm);
    }
    

    那就直呼吧

    $pdf->WriteHtmlCell(70, $html);
    
        2
  •  4
  •   m7913d    7 年前

    @狭河道解决方案效果很好,如果你想保留左侧位置,可以试试这个:

    function WriteHtmlCell($cellWidth, $html){
        $rm = $this->rMargin;
        $lm = $this->lMargin;
        $this->SetRightMargin($this->w - $this->GetX() - $cellWidth);
    
        $this->SetLeftMargin($this->GetX());
    
        $this->WriteHtml($html);
        $this->SetRightMargin($rm);
        $this->SetLeftMargin($lm);
    }
    
        3
  •  2
  •   yunzen    12 年前

    我修改了WriteHTML脚本来完成这项工作。

    这是fpdf.org中为WriteHTML提供的脚本的修改形式

    <?php
    require('fpdf.php');
    //function hex2dec
    //returns an associative array (keys: R,G,B) from
    //a hex html code (e.g. #3FE5AA)
    function hex2dec($couleur = "#000000"){
        $R = substr($couleur, 1, 2);
        $rouge = hexdec($R);
        $V = substr($couleur, 3, 2);
        $vert = hexdec($V);
        $B = substr($couleur, 5, 2);
        $bleu = hexdec($B);
        $tbl_couleur = array();
        $tbl_couleur['R']=$rouge;
        $tbl_couleur['V']=$vert;
        $tbl_couleur['B']=$bleu;
        return $tbl_couleur;
    }
    
    //conversion pixel -> millimeter at 72 dpi
    function px2mm($px){
        return $px*25.4/72;
    }
    
    function txtentities($html){
        $trans = get_html_translation_table(HTML_ENTITIES);
        $trans = array_flip($trans);
        return strtr($html, $trans);
    }
    ////////////////////////////////////
    
    class PDF_HTML extends FPDF
    {
    //variables of html parser
    var $B;
    var $I;
    var $U;
    var $HREF;
    var $fontList;
    var $issetfont;
    var $issetcolor;
    
    function PDF_HTML($orientation='P', $unit='mm', $format='A4')
    {
        //Call parent constructor
        $this->FPDF($orientation,$unit,$format);
        //Initialization
        $this->B=0;
        $this->I=0;
        $this->U=0;
        $this->HREF='';
        $this->fontlist=array('arial', 'times', 'courier', 'helvetica', 'symbol');
        $this->issetfont=false;
        $this->issetcolor=false;
    }
    
    function WriteHTML($html,&$parsed)
    {
        //HTML parser
        $html=strip_tags($html,"<b><u><i><a><img><p><br><strong><em><font><tr><blockquote>"); //supprime tous les tags sauf ceux reconnus
        $html=str_replace("\n",' ',$html); //remplace retour à la ligne par un espace
        $a=preg_split('/<(.*)>/U',$html,-1,PREG_SPLIT_DELIM_CAPTURE); //éclate la chaîne avec les balises
        foreach($a as $i=>$e)
        {
            if($i%2==0)
            {
                //Text
                if($this->HREF)
                    $this->PutLink($this->HREF,$e);
                else
                    $parsed.=stripslashes(txtentities($e));
            }
            else
            {
                //Tag
                if($e[0]=='/')
                    $this->CloseTag(strtoupper(substr($e,1)));
                else
                {
                    //Extract attributes
                    $a2=explode(' ',$e);
                    $tag=strtoupper(array_shift($a2));
                    $attr=array();
                    foreach($a2 as $v)
                    {
                        if(preg_match('/([^=]*)=["\']?([^"\']*)/',$v,$a3))
                            $attr[strtoupper($a3[1])]=$a3[2];
                    }
                    $this->OpenTag($tag,$attr);
                }
            }
        }
    }
    
    function OpenTag($tag, $attr)
    {
        //Opening tag
        switch($tag){
            case 'STRONG':
                $this->SetStyle('B',true);
                break;
            case 'EM':
                $this->SetStyle('I',true);
                break;
            case 'B':
            case 'I':
            case 'U':
                $this->SetStyle($tag,true);
                break;
            case 'A':
                $this->HREF=$attr['HREF'];
                break;
            case 'IMG':
                if(isset($attr['SRC']) && (isset($attr['WIDTH']) || isset($attr['HEIGHT']))) {
                    if(!isset($attr['WIDTH']))
                        $attr['WIDTH'] = 0;
                    if(!isset($attr['HEIGHT']))
                        $attr['HEIGHT'] = 0;
                    $this->Image($attr['SRC'], $this->GetX(), $this->GetY(), px2mm($attr['WIDTH']), px2mm($attr['HEIGHT']));
                }
                break;
            case 'TR':
            case 'BLOCKQUOTE':
            case 'BR':
                $this->Ln(5);
                break;
            case 'P':
                $this->Ln(10);
                break;
            case 'FONT':
                if (isset($attr['COLOR']) && $attr['COLOR']!='') {
                    $coul=hex2dec($attr['COLOR']);
                    $this->SetTextColor($coul['R'],$coul['V'],$coul['B']);
                    $this->issetcolor=true;
                }
                if (isset($attr['FACE']) && in_array(strtolower($attr['FACE']), $this->fontlist)) {
                    $this->SetFont(strtolower($attr['FACE']));
                    $this->issetfont=true;
                }
                break;
        }
    }
    
    function CloseTag($tag)
    {
        //Closing tag
        if($tag=='STRONG')
            $tag='B';
        if($tag=='EM')
            $tag='I';
        if($tag=='B' || $tag=='I' || $tag=='U')
            $this->SetStyle($tag,false);
        if($tag=='A')
            $this->HREF='';
        if($tag=='FONT'){
            if ($this->issetcolor==true) {
                $this->SetTextColor(0);
            }
            if ($this->issetfont) {
                $this->SetFont('arial');
                $this->issetfont=false;
            }
        }
    }
    
    function SetStyle($tag, $enable)
    {
        //Modify style and select corresponding font
        $this->$tag+=($enable ? 1 : -1);
        $style='';
        foreach(array('B','I','U') as $s)
        {
            if($this->$s>0)
                $style.=$s;
        }
        $this->SetFont('',$style);
    }
    
    function PutLink($URL, $txt)
    {
        //Put a hyperlink
        $this->SetTextColor(0,0,255);
        $this->SetStyle('U',true);
        $this->Write(5,$txt,$URL);
        $this->SetStyle('U',false);
        $this->SetTextColor(0);
    }
    
    }//end of class
    ?>
    

    将以下代码复制到file_NAME文件中,然后使用 require("FILE_NAME") 将此文件包含到脚本中。 完成后,按如下方式调用函数

    $pdf->WriteHTML($html,$parsed );
    $pdf->Multicell(70,3.5, $parsed );
    
        4
  •  0
  •   funtime    13 年前
    Can WriteHTML placed in Multicell? How?
    

    否。WriteHTML将数据输出到pdf文件。它什么也不返回。但MultiCell函数需要一个字符串。

    所以你可以试试这个。 修改WriteHTML函数以停止输出数据,并将数据复制到变量中。 然后使用MultiCell输出该变量

    希望这能有所帮助。:-)

        5
  •  0
  •   geeknw    11 年前

    我发现在multicell中使用writeHTML不是正确的解决方案。Multicell需要知道如何设置标签的样式。WriteHTML无法完成这项工作,因为它在解释标记的实体时设置了样式信息,而在调用原始多单元函数时,这些信息将不起任何作用。

    我找到了一个有效的方法:使用class.multicelltag.php https://github.com/marxjohnson/moodle-local_progressreview/blob/master/fpdf/class.multicelltag.php

    注意:class.multicelltag是根据gnu许可证授权的,免费用于非商业用途。如果您需要商业许可证,请参阅 http://www.interpid.eu/fpdf-components

    如果您将它与另一个fpdf扩展(如PDF_Label)一起使用,这里有一个示例:

    require_once("class.multicelltag.php"); 
    // note: you will also need class.string_tags.php for an include to class.multicelltag.php
    // note: class.multicelltag.php already includes fpdf.php
    class PDF_Label extends FPDF_MULTICELLTAG {
        ...
        // define what the tag will do with style information for the font family
        // this defines bold html tag to use current font, "B" style, current character size incremented by 1, and black for the color
        $this->SetStyle2('b',$this->_Font_Name,"B",$this->_Char_Size+1,"0,0,0");
    
        function Add_PDF_Label($texte,$align,$border,$imageFile='',$imageWidth=0,$imageHeight=0) {
            ...
            $this->ext_MultiCellTag($this->_Width, $this->_Line_Height, $texte,$border,$align,$fill);
    
        }
    }
    

    我注意到class.multicelltag.php函数ApplyStyle试图使用不属于fpdf核心字体的DejaVu字体,所以我将其更改为使用helvetica。

        6
  •  -2
  •   iurii_n    13 年前

    尝试此代码:

    $pdf->setXY($x_pos,$y_pos);
    $pdf->Multicell(70,3.5, $pdf->WriteHTML($html));