FPDF – WriteHTML в Multicell?

Может ли WriteHTML размещаться в Multicell? Как?

Я получил и отобразил вывод HTML из базы данных, но хочу поместить его во второй столбец (допустим), поэтому я поместил его в Multicell, но без эффекта.

ниже не работает:

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

EDITED: я нашел WriteHTMLCell, как использовать?

Кто угодно?

Благодаря!

Я изменил скрипт WriteHTML, чтобы выполнить работу.

Это измененная форма сценария, приведенная в fpdf.org для WriteHTML

 <?php require('fpdf.php'); //function hex2dec //returns an associative array (keys: R,G,B) from //a hex html code (eg #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 ); 

Добавьте этот метод в класс 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); 

Решение @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); } 
 Can WriteHTML placed in Multicell? How? 

NO .. WriteHTML выводит данные в файл pdf. Он ничего не возвращает. Но функция MultiCell ожидает строку.

Поэтому вы можете попробовать это. Измените функцию WriteHTML, чтобы остановить вывод данных и скопировать данные в переменную. Затем используйте 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 пытается использовать шрифты DejaVu, которые не являются частью основного шрифта fpdf, поэтому я изменил это, чтобы использовать helvetica.

Попробуйте этот код:

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