FPDF - WriteHTML in Multicell?

回眸只為那壹抹淺笑 提交于 2019-11-30 16:14:01

问题


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 Multicell but no effect.

below not works:

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

EDITED: i found WriteHTMLCell, how to use?

Anyone?

Thanks!


回答1:


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



回答2:


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



回答3:


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



回答4:


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.:-)




回答5:


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.




回答6:


Try this code:

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


来源:https://stackoverflow.com/questions/15471532/fpdf-writehtml-in-multicell

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!