Add-On Inter-letter justification
Informations
Author:MaesiusLicense: FPDF
Description
This script allows to justify text by extending the space between letters and not words. This produces homogen paragraphs, without the spaces usually found when justifying.Source
<?php
require('fpdf.php');
class PDF extends FPDF
{
function Justify($text, $w, $h)
{
$tab_paragraphe = explode("\n", $text);
$nb_paragraphe = count($tab_paragraphe);
$j = 0;
while ($j<$nb_paragraphe) {
$paragraphe = $tab_paragraphe[$j];
$tab_mot = explode(' ', $paragraphe);
$nb_mot = count($tab_mot);
// Handle strings longer than paragraph width
$tab_mot2 = array();
$k = 0;
$l = 0;
while ($k<$nb_mot) {
$len_mot = strlen ($tab_mot[$k]);
if ($len_mot<($w-5) )
{
$tab_mot2[$l] = $tab_mot[$k];
$l++;
} else {
$m=0;
$chaine_lettre='';
while ($m<$len_mot) {
$lettre = substr($tab_mot[$k], $m, 1);
$len_chaine_lettre = $this->GetStringWidth($chaine_lettre.$lettre);
if ($len_chaine_lettre>($w-7)) {
$tab_mot2[$l] = $chaine_lettre . '-';
$chaine_lettre = $lettre;
$l++;
} else {
$chaine_lettre .= $lettre;
}
$m++;
}
if ($chaine_lettre) {
$tab_mot2[$l] = $chaine_lettre;
$l++;
}
}
$k++;
}
// Justified lines
$nb_mot = count($tab_mot2);
$i=0;
$ligne = '';
while ($i<$nb_mot) {
$mot = $tab_mot2[$i];
$len_ligne = $this->GetStringWidth($ligne . ' ' . $mot);
if ($len_ligne>($w-5)) {
$len_ligne = $this->GetStringWidth($ligne);
$nb_carac = strlen ($ligne);
$ecart = (($w-2) - $len_ligne) / $nb_carac;
$this->_out(sprintf('BT %.3F Tc ET', $ecart*$this->k));
$this->MultiCell($w, $h, $ligne);
$ligne = $mot;
} else {
if ($ligne)
{
$ligne .= ' ' . $mot;
} else {
$ligne = $mot;
}
}
$i++;
}
// Last line
$this->_out('BT 0 Tc ET');
$this->MultiCell($w, $h, $ligne);
$j++;
}
}
}
?>
Example
<?php
require('justification.php');
$pdf=new PDF();
$pdf->AddPage();
$pdf->SetFont('Arial', '', 9);
$pdf->Cell(85, 4, "EXAMPLE OF FUNCTION USAGE", 1, 1, 'C');
$pdf->Write(4, "\nSource: http://www.swg-fr.com\n\n");
$text=file_get_contents('ex.txt');
$pdf->Justify($text, 85, 4);
$pdf->Output();
?>