FPDF - WriteHTML in Multicell?

前端 未结 6 1107
情书的邮戳
情书的邮戳 2021-01-03 13:12

Can WriteHTML placed in Multicell? How?

I retrieved and display the HTML output from database but want to position it in the 2nd column(let\'s say) so I put it in Mu

相关标签:
6条回答
  • 2021-01-03 13:32

    @Khaled solution works great, if you whould like to preserve left position, try this:

    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);
    }
    
    0 讨论(0)
  • 2021-01-03 13:34

    I modified the WriteHTML script to get the job done.

    This is the modified form of the script given in fpdf.org for the 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
    ?>
    

    Copy the following code into a file say FILE_NAME and use require("FILE_NAME") to include this file in to your script. Once that is done ,call the function as follows

    $pdf->WriteHTML($html,$parsed );
    $pdf->Multicell(70,3.5, $parsed );
    
    0 讨论(0)
  • 2021-01-03 13:35

    Add this method to your WriteHTML class

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

    then just call it

    $pdf->WriteHtmlCell(70, $html);
    
    0 讨论(0)
  • 2021-01-03 13:37
    Can WriteHTML placed in Multicell? How?
    

    NO.. WriteHTML outputs the data to the pdf file.It returns nothing. But MultiCell function expects a string.

    So you can try this. Modify the WriteHTML function to stop outputting the data and copy the data into a variable. Then use MultiCell to output that variable

    Hope this helps out.:-)

    0 讨论(0)
  • 2021-01-03 13:47

    I found that using writeHTML in multicell to be not the right solution. Multicell needs to know how to set the style for the tags. WriteHTML can't do the job because it's setting style information as it interprets the tagged entities, which will do nothing by the time the original multicell function is called.

    I found a method that works: use class.multicelltag.php from https://github.com/marxjohnson/moodle-local_progressreview/blob/master/fpdf/class.multicelltag.php

    Note: class.multicelltag is licensed under gnu license, free for non-commercial usage. If you need a commercial license, see http://www.interpid.eu/fpdf-components

    If you use it with another fpdf extention (such as PDF_Label), here's an example:

    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);
    
        }
    }
    

    I noticed that the class.multicelltag.php function ApplyStyle tries to use the DejaVu fonts which are not part of fpdf's core font's, so I changed this to use helvetica.

    0 讨论(0)
  • 2021-01-03 13:53

    Try this code:

    $pdf->setXY($x_pos,$y_pos);
    $pdf->Multicell(70,3.5, $pdf->WriteHTML($html));
    
    0 讨论(0)
提交回复
热议问题