Small caps

This script allows to write text with 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

Quelle

http://www.fpdf.org/en/script/script77.php, zuletzt abgerufen 02.10.2016 15:07