2

we are making a report in PDF by using FPDF. we are getting text in our pdf report by using $pdf->WriteHTML(utf8_decode($main));, now we want to justify text in report, but we are not able to do the same.

Please suggest solution for this.

Thanks!

Harinarayan
  • 121
  • 1
  • 2
  • 12

2 Answers2

1

Use Tag-based formatting script. I don't use class PDF_HTML, that way only "dirty" solution:

<?php
require('fpdf.php');
class PDF_HTML extends FPDF {
...
    elseif($this->ALIGN == 'center')
        $this->Cell(0,5,$e,0,1,'C');
    elseif($this->ALIGN == 'justify') {
        //$this->SetStyle("p","arial","N",7,"0,0,0"); //TODO
        $this->WriteTag(180, 11, $e, 0, "J");// TODO parameters
    } else
...
}
class PDF_WriteTag extends PDF_HTML {
...
}

ob_start(); // TODO delete after correcting any errors (only for demo)
$pdf = new PDF_WriteTag();
$pdf->AddPage();
$pdf->SetFont('Arial');
$pdf->WriteHTML('You can<br><p align="center">center a line</p>and add a horizontal rule:<br><hr>');
$pdf->WriteHTML('You can<br><p align="justify">Et magnis dis parturient montes, nascetur ridiculus mus. Pellentesque vitae erat. Vivamus porttitor cursus lacus. Pellentesque tellus. Nunc aliquam interdum felis. Nulla imperdiet leo. Mauris hendrerit, sem at mollis pharetra, leo sapien pretium elit, a faucibus sapien dolor vel pede. Vestibulum et enim ut nulla sollicitudin adipiscing. Suspendisse malesuada venenatis mauris. Curabitur ornare mollis velit. Sed vitae metus. Morbi posuere mi id odio. Donec elit sem, tempor at, pharetra eu, sodales sit amet, elitCurabitur urna tellus, aliquam vitae, ultrices eget, vehicula nec, diam.  Integer elementum, felis non faucibus euismod, erat massa dictum eros, eu ornare ligula tortor et mauris. Cras molestie.
</p>and add a horizontal rule:<br><hr>');
ob_clean(); //TODO delete after correcting any errors
$pdf->Output();
user4762971
  • 126
  • 4
  • text justify is working for cell(), multicell(), write(), but not working for writeHTML(). please suggest some idea to extend writeHTML(). – Harinarayan Mar 03 '17 at 08:18
  • For example, you can add 2 special-html tags (for style and for justified area) in your class PDF_HTML and for area tag use the new class – user4762971 Mar 03 '17 at 08:44
1

This tutorial shows you how to justify with WriteHTML.

http://www.fpdf.org/en/script/script41.php

demo

Code:

<?php
require('fpdf.php');

class PDF_HTML extends FPDF
{
    var $B=0;
    var $I=0;
    var $U=0;
    var $HREF='';
    var $ALIGN='';

    function WriteHTML($html)
    {
        //HTML parser
        $html=str_replace("\n",' ',$html);
        $a=preg_split('/<(.*)>/U',$html,-1,PREG_SPLIT_DELIM_CAPTURE);
        foreach($a as $i=>$e)
        {
            if($i%2==0)
            {
                //Text
                if($this->HREF)
                    $this->PutLink($this->HREF,$e);
                elseif($this->ALIGN=='center')
                    $this->Cell(0,5,$e,0,1,'C');
                else
                    $this->Write(5,$e);
            }
            else
            {
                //Tag
                if($e[0]=='/')
                    $this->CloseTag(strtoupper(substr($e,1)));
                else
                {
                    //Extract properties
                    $a2=explode(' ',$e);
                    $tag=strtoupper(array_shift($a2));
                    $prop=array();
                    foreach($a2 as $v)
                    {
                        if(preg_match('/([^=]*)=["\']?([^"\']*)/',$v,$a3))
                            $prop[strtoupper($a3[1])]=$a3[2];
                    }
                    $this->OpenTag($tag,$prop);
                }
            }
        }
    }

    function OpenTag($tag,$prop)
    {
        //Opening tag
        if($tag=='B' || $tag=='I' || $tag=='U')
            $this->SetStyle($tag,true);
        if($tag=='A')
            $this->HREF=$prop['HREF'];
        if($tag=='BR')
            $this->Ln(5);
        if($tag=='P')
            $this->ALIGN=$prop['ALIGN'];
        if($tag=='HR')
        {
            if( !empty($prop['WIDTH']) )
                $Width = $prop['WIDTH'];
            else
                $Width = $this->w - $this->lMargin-$this->rMargin;
            $this->Ln(2);
            $x = $this->GetX();
            $y = $this->GetY();
            $this->SetLineWidth(0.4);
            $this->Line($x,$y,$x+$Width,$y);
            $this->SetLineWidth(0.2);
            $this->Ln(2);
        }
    }

    function CloseTag($tag)
    {
        //Closing tag
        if($tag=='B' || $tag=='I' || $tag=='U')
            $this->SetStyle($tag,false);
        if($tag=='A')
            $this->HREF='';
        if($tag=='P')
            $this->ALIGN='';
    }

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

Usage:

<?php
require('WriteHTML.php');

$pdf=new PDF_HTML();
$pdf->AddPage();
$pdf->SetFont('Arial');
$pdf->WriteHTML('You can<br><p align="center">center a line</p>and add a horizontal rule:<br><hr>');
$pdf->Output();
?>
Raphael Rafatpanah
  • 19,082
  • 25
  • 92
  • 158
  • 1
    Even though your answer might be helpful, but once that link changes or website owner deletes it your answer becomes less useful, rather copy the important parts from the link to your answer then reference the link – Masivuye Cokile Mar 03 '17 at 13:57
  • 1
    @MasivuyeCokile, you're right. I've updated the answer to include the code. – Raphael Rafatpanah Mar 03 '17 at 14:00
  • 2
    Thanks for your reply. But I want to justify text. from your code it's center align. – Harinarayan Mar 06 '17 at 05:39