php FPDF - 在多单元格中写入 HTML?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/15471532/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-25 09:18:08  来源:igfitidea点击:

FPDF - WriteHTML in Multicell?

phphtmlpdffpdf

提问by nonononono

Can WriteHTML placed in Multicell? How?

WriteHTML 可以放在 Multicell 中吗?如何?

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.

我从数据库中检索并显示了 HTML 输出,但想将它放在第二列中(假设),所以我将它放在 Multicell 中,但没有效果。

below not works:

下面不起作用:

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

EDITED: i found WriteHTMLCell, how to use?

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

Anyone?

任何人?

Thanks!

谢谢!

采纳答案by funtime

I modified the WriteHTML script to get the job done.

我修改了 WriteHTML 脚本以完成工作。

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

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

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

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

回答by Kld

Add this method to your WriteHTMLclass

将此方法添加到您的WriteHTML课程中

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

回答by David

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

@Khaled 解决方案效果很好,如果您想保留左侧位置,请尝试以下操作:

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

回答by funtime

Can WriteHTML placed in Multicell? How?

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

NO.. WriteHTML 将数据输出到 pdf 文件。它不返回任何内容。但是 MultiCell 函数需要一个字符串。

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

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

Hope this helps out.:-)

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

回答by geeknw

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.

我发现在多单元格中使用 writeHTML 不是正确的解决方案。Multicell 需要知道如何设置标签的样式。WriteHTML 不能完成这项工作,因为它在解释标记实体时设置样式信息,在调用原始多单元函数时它什么也不做。

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

我找到了一种有效的方法:使用https://github.com/marxjohnson/moodle-local_progressreview/blob/master/fpdf/class.multicelltag.php 中的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

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

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

如果您将它与另一个 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);

    }
}

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.

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

回答by iurii_n

Try this code:

试试这个代码:

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