Small caps

Add-On Small caps

Informations

Author:Constantin Teleman
License: FPDF

Description

This script allows to write text with small caps. Two methods are available: CellSmallCaps() and MultiCellSmallCaps(), with the same parameters as the standard versions.

Source

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

class PDF_SmallCaps extends FPDF
{

/**
* Create the Small Caps effect in a Cell
* @author constantin teleman
*/
function CellSmallCaps($w, $h=0, $txt='', $border=0, $ln=0, $align='', $fill=false, $link='')
{
    //Output a cell
    $k=$this->k;
    if($this->y+$h>$this->PageBreakTrigger && !$this->InHeader && !$this->InFooter && $this->AcceptPageBreak())
    {
        //Automatic page break
        $x=$this->x;
        $ws=$this->ws;
        if($ws>0)
        {
            $this->ws=0;
            $this->_out('0 Tw');
        }
        $this->AddPage($this->CurOrientation, $this->CurPageSize);
        $this->x=$x;
        if($ws>0)
        {
            $this->ws=$ws;
            $this->_out(sprintf('%.3F Tw', $ws*$k));
        }
    }
    if($w==0)
        $w=$this->w-$this->rMargin-$this->x;
    $s='';
    if($fill || $border==1)
    {
        if($fill)
            $op=($border==1) ? 'B' : 'f';
        else
            $op='S';
        $s=sprintf('%.2F %.2F %.2F %.2F re %s ', $this->x*$k, ($this->h-$this->y)*$k, $w*$k, -$h*$k, $op);
    }
    if(is_string($border))
    {
        $x=$this->x;
        $y=$this->y;
        if(strpos($border, 'L')!==false)
            $s.=sprintf('%.2F %.2F m %.2F %.2F l S ', $x*$k, ($this->h-$y)*$k, $x*$k, ($this->h-($y+$h))*$k);
        if(strpos($border, 'T')!==false)
            $s.=sprintf('%.2F %.2F m %.2F %.2F l S ', $x*$k, ($this->h-$y)*$k, ($x+$w)*$k, ($this->h-$y)*$k);
        if(strpos($border, 'R')!==false)
            $s.=sprintf('%.2F %.2F m %.2F %.2F l S ', ($x+$w)*$k, ($this->h-$y)*$k, ($x+$w)*$k, ($this->h-($y+$h))*$k);
        if(strpos($border, 'B')!==false)
            $s.=sprintf('%.2F %.2F m %.2F %.2F l S ', $x*$k, ($this->h-($y+$h))*$k, ($x+$w)*$k, ($this->h-($y+$h))*$k);
    }
    if($txt!=='')
    {
        if($align=='R')
            $dx=$w-$this->cMargin-$this->GetStringWidth($txt);
        elseif($align=='C')
            $dx=($w-$this->GetStringWidth($txt))/2;
        else
            $dx=$this->cMargin;
        if($this->ColorFlag)
            $s.='q '.$this->TextColor.' ';
        $txt2=str_replace(')', '\\)', str_replace('(', '\\(', str_replace('\\', '\\\\', $txt)));

        $firstDx = $dx;
        for ($i=0; $i<strlen($txt2); $i++) {
            $letter = $txt2[$i];
            $upper = strpos("ABCDEFGHIJKLMNOPQRSTUVWXZ0123456789`!@#$%^&*()_=+|'\";:{}[]?, .<>", $letter);
            if ($upper === false) { // the letter is lowercase
                if($i==0){ // for the first char
                    $s.=sprintf(' BT /F%d %.2F Tf', $this->CurrentFont['i'], $this->FontSizePt*0.8);
                    $s.=sprintf(' %.2F %.2F Td (%s) Tj', ($this->x+$dx)*$k, ($this->h-($this->y+.5*$h+.3*$this->FontSize))*$k, strtoupper($letter));
                    $s.=sprintf(' /F%d %.2F Tf ET', $this->CurrentFont['i'], $this->FontSizePt);
                } else {  // if there is no first char
                    $s.=sprintf(' BT /F%d %.2F Tf', $this->CurrentFont['i'], $this->FontSizePt*0.8);
                    $dx+=($this->GetStringWidth(substr($txt2, $i-1, 1)))*1.02;
                    $s.=sprintf(' %.2F %.2F Td (%s) Tj', ($this->x+$dx)*$k, ($this->h-($this->y+.5*$h+.3*$this->FontSize))*$k, strtoupper($letter));
                    $s.=sprintf(' /F%d %.2F Tf ET', $this->CurrentFont['i'], $this->FontSizePt);
                }
            } else { //case the letter is uppercase
                if($i == 0){ //for the first char
                    $s.=sprintf(' BT %.2F %.2F Td (%s) Tj ET', ($this->x+$dx)*$k, ($this->h-($this->y+.5*$h+.3*$this->FontSize))*$k, $letter);
                } else {  // if there is no first char
                    $dx+=($this->GetStringWidth(substr($txt2, $i-1, 1)))*1.02;
                    $s.=sprintf(' BT %.2F %.2F Td (%s) Tj ET', ($this->x+$dx)*$k, ($this->h-($this->y+.5*$h+.3*$this->FontSize))*$k, $letter);
                }
            }
        }
        
        if($this->underline)
            $s.=' '.$this->_dounderline($this->x+$firstDx, $this->y+.5*$h+.3*$this->FontSize, $txt);
        if($this->ColorFlag)
            $s.=' Q';
        if($link)
            $this->Link($this->x+$firstDx, $this->y+.5*$h-.5*$this->FontSize, $this->GetStringWidth($txt), $this->FontSize, $link);
    }
    if($s)
        $this->_out($s);
    $this->lasth=$h;
    if($ln>0)
    {
        //Go to next line
        $this->y+=$h;
        if($ln==1)
            $this->x=$this->lMargin;
    }
    else
        $this->x+=$w;
}

/**
* Create the Small Caps effect in a MultiCell
* @author constantin teleman
*/
function MultiCellSmallCaps($w, $h, $txt, $border=0, $align='', $fill=false)
{
    //Output text with automatic or explicit line breaks
    $cw=&$this->CurrentFont['cw'];
    if($w==0)
        $w=$this->w-$this->rMargin-$this->x;
    $wmax=($w-2*$this->cMargin)*1000/$this->FontSize;
    $s=str_replace("\r", '', $txt);
    $nb=strlen($s);
    if($nb>0 && $s[$nb-1]=="\n")
        $nb--;
    $b=0;
    if($border)
    {
        if($border==1)
        {
            $border='LTRB';
            $b='LRT';
            $b2='LR';
        }
        else
        {
            $b2='';
            if(strpos($border, 'L')!==false)
                $b2.='L';
            if(strpos($border, 'R')!==false)
                $b2.='R';
            $b=(strpos($border, 'T')!==false) ? $b2.'T' : $b2;
        }
    }
    $sep=-1;
    $i=0;
    $j=0;
    $l=0;
    $ns=0;
    $nl=1;
    while($i<$nb)
    {
        //Get next character
        $c=$s[$i];
        if($c=="\n")
        {
            //Explicit line break
            if($this->ws>0)
            {
                $this->ws=0;
                $this->_out('0 Tw');
            }
            $this->CellSmallCaps($w, $h, substr($s, $j, $i-$j), $b, 2, $align, $fill);
            $i++;
            $sep=-1;
            $j=$i;
            $l=0;
            $ns=0;
            $nl++;
            if($border && $nl==2)
                $b=$b2;
            continue;
        }
        if($c==' ')
        {
            $sep=$i;
            $ls=$l;
            $ns++;
        }
        $l+=$cw[$c];
        if($l>$wmax)
        {
            //Automatic line break
            if($sep==-1)
            {
                if($i==$j)
                    $i++;
                if($this->ws>0)
                {
                    $this->ws=0;
                    $this->_out('0 Tw');
                }
                $this->CellSmallCaps($w, $h, substr($s, $j, $i-$j), $b, 2, $align, $fill);
            }
            else
            {
                if($align=='J')
                {
                    $this->ws=($ns>1) ? ($wmax-$ls)/1000*$this->FontSize/($ns-1) : 0;
                    $this->_out(sprintf('%.3F Tw', $this->ws*$this->k));
                }
                $this->CellSmallCaps($w, $h, substr($s, $j, $sep-$j), $b, 2, $align, $fill);
                $i=$sep+1;
            }
            $sep=-1;
            $j=$i;
            $l=0;
            $ns=0;
            $nl++;
            if($border && $nl==2)
                $b=$b2;
        }
        else
            $i++;
    }
    //Last chunk
    if($this->ws>0)
    {
        $this->ws=0;
        $this->_out('0 Tw');
    }
    if($border && strpos($border, 'B')!==false)
        $b.='B';
    $this->CellSmallCaps($w, $h, substr($s, $j, $i-$j), $b, 2, $align, $fill);
    $this->x=$this->lMargin;
}

}

?>

Example

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

$pdf=new PDF_SmallCaps();
$pdf->AddPage();
$pdf->SetFont('Courier', '', 30);
for ($i = 30; $i>4; $i--) {
    $pdf->SetFontSize($i);
    $pdf->CellSmallCaps(180, 8, "The Code and Text Editor", 0, 1);
}
$pdf->SetFontSize(10);
$pdf->MultiCellSmallCaps(180, 6, 'The Code and Text Editor is a word processing utility where you enter, display, and edit code or text.'.
    ' It is referred to as either the Text Editor or the Code Editor, based on its content.'.
    ' If it contains only text without an associated language, it is referred to as the Text Editor.'.
    ' If it contains source code associated with a language, it is referred to as the Code Editor.'.
    ' Because it is most often used for editing code, though, we will refer to it as the Code Editor.');
$pdf->Output();
?>
View the result here.

Download

ZIP | TGZ
Es ist ein Fehler aufgetreten

Es ist ein Fehler aufgetreten

Was ist das Problem?

Bei der Ausführung des Skriptes ist ein Fehler aufgetreten. Irgendetwas funktioniert nicht richtig.

Wie kann ich das Problem lösen?

Öffnen Sie die aktuelle Log-Datei im Ordner var/logs bzw. app/logs und suchen Sie die zugehörige Fehlermeldung (normalerweise die letzte).

Weitere Informationen

Die Skriptausführung wurde gestoppt, weil irgendetwas nicht korrekt funktioniert. Die eigentliche Fehlermeldung wird aus Sicherheitsgründen hinter dieser Meldung verborgen und findet sich in der aktuellen Log-Datei (siehe oben). Wenn Sie die Fehlermeldung nicht verstehen oder nicht wissen, wie das Problem zu beheben ist, durchsuchen Sie die Contao-FAQs oder besuchen Sie die Contao-Supportseite.