Thai support

Add-On Thai support

Informations

Author:Wittawas Puntumchinda
License: FPDF

Description

This extension fixes the positioning of some Thai diacritical marks.

Source

<?php
/*******************************************************************************
* FPDF Thai Positioning Improve                                                *
*                                                                              *
* Version:  1.01                                                               *
* Date:     2009-10-08                                                         *
* Advisor:  Mr. Wittawas Puntumchinda                                          *
* Coding:   Mr. Sirichai Fuangfoo                                              *
* License:  FPDF                                                               *
*******************************************************************************/

require('fpdf.php');

class FPDF_Thai extends FPDF
{
var $txt_error;    
var $s_error;
var $string_th;
var $s_th;
var $pointX;
var $pointY;
var $curPointX;
var $checkFill;
var $array_th;

/****************************************************************************************
* »ÃÐàÀ·: Function ¢Í§ Class FPDF_TH                                                    
* ÍéÒ§ÍÔ§: Function MultiCell ¢Í§ Class FPDF                                            
* ¡Ò÷ӧҹ: ãªé㹡ÒþÔÁ¾ì¢éͤÇÒÁËÅÒºÃ÷Ѵ¢Í§àÍ¡ÊÒà PDF                                         
* ÃٺẺ: MultiCell (    $w = ¤ÇÒÁ¡ÇéÒ§¢Í§Cell,                                                
*                        $h = ¤ÇÒÁÊÙ§¢Í§Cell,                                                
*                        $txt = ¢éͤÇÒÁ·Õè¨Ð¾ÔÁ¾ì,                                                    
*                        $border = ¡Ó˹´¡ÒÃáÊ´§àÊ鹡Ãͺ(0 = äÁèáÊ´§, 1= áÊ´§)    ,                
*                        $align = µÓá˹觢éͤÇÒÁ(L = «éÒÂ, R = ¢ÇÒ, C = ¡Ö觡ÅÒ§, J = ¡ÃШÒÂ), 
*                        $fill = ¡Ó˹´¡ÒÃáÊ´§ÊբͧCell(false = äÁèáÊ´§, true = áÊ´§)                    
*                    )            
*****************************************************************************************/
function MultiCell($w, $h, $txt, $border=0, $align='J', $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->MCell($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->MCell($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->MCell($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->MCell($w, $h, substr($s, $j, $i-$j), $b, 2, $align, $fill);
    $this->x=$this->lMargin;
}

/****************************************************************************************
* »ÃÐàÀ·  : Function    ¢Í§ Class FPDF_TH                                                    
* ÍéÒ§ÍÔ§       : Function Cell    ¢Í§ Class FPDF                                                
* ¡Ò÷ӧҹ  : ãªé㹡ÒþÔÁ¾ì¢éͤÇÒÁ·ÕÅкÃ÷Ѵ¢Í§àÍ¡ÊÒà PDF                                             
* ÃٺẺ  : Cell (    $w = ¤ÇÒÁ¡ÇéÒ§¢Í§Cell,                                                    
*                    $h = ¤ÇÒÁÊÙ§¢Í§Cell,                                                    
*                    $txt = ¢éͤÇÒÁ·Õè¨Ð¾ÔÁ¾ì,                                                    
*                    $border = ¡Ó˹´¡ÒÃáÊ´§àÊ鹡Ãͺ(0 = äÁèáÊ´§, 1= áÊ´§),                    
*                    $ln = µÓá˹觷ÕèÍÂÙè¶Ñ´ä»¨Ò¡à«ÅÅì(0 = ¢ÇÒ, 1 = ºÃ÷Ѵ¶Ñ´ä», 2 = ´éÒ¹ÅèÒ§), 
*                    $align = µÓá˹觢éͤÇÒÁ(L = «éÒÂ, R = ¢ÇÒ, C = ¡Ö觡ÅÒ§, T = º¹, B = ÅèÒ§),    
*                    $fill = ¡Ó˹´¡ÒÃáÊ´§ÊբͧCell(false = äÁèáÊ´§, true = áÊ´§),                    
*                    $link = URL ·Õèµéͧ¡ÒÃãËé¢éͤÇÒÁàª×èÍÁâ§件֧                                    
*                )    
*****************************************************************************************/
function Cell($w, $h=0, $txt='', $border=0, $ln=0, $align='', $fill=false, $link='')
{
    $this->checkFill="";
    $k=$this->k;
    if($this->y+$h>$this->PageBreakTrigger && !$this->InHeader && !$this->InFooter && $this->AcceptPageBreak())
    {
        //¢Öé¹Ë¹éÒãËÁèÍѵâ¹Áѵ
        $x=$this->x;
        $ws=$this->ws;
        if($ws>0)
        {
            $this->ws=0;
            $this->_out('0 Tw');
        }
        $this->AddPage($this->CurOrientation);
        $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;
    $this->s_th='';
    //¡Ó˹´¡ÒÃáÊ´§àÊ鹡Ãͺ 4 ´éÒ¹ áÅÐÊÕ¡Ãͺ
    if($fill || $border==1)
    {
        if($fill)
            $op=($border==1) ? 'B' : 'f';
        else
            $op='S';
        $this->s_th=sprintf('%.2F %.2F %.2F %.2F re %s ', $this->x*$k, ($this->h-$this->y)*$k, $w*$k, -$h*$k, $op);
        if($op=='f')
            $this->checkFill=$op;
    }
    //¡Ó˹´¡ÒÃáÊ´§àÊ鹡Ãͺ·ÕÅÐàÊé¹
    if(is_string($border))
    {
        $x=$this->x;
        $y=$this->y;
        if(strpos($border, 'L')!==false)
            $this->s_th.=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)
            $this->s_th.=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)
            $this->s_th.=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)
            $this->s_th.=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!=='')
    {            
        $x=$this->x;
        $y=$this->y;
        //¡Ó˹´¡ÒèѴ¢éͤÇÒÁã¹à«ÅÅìµÒÁá¹ÇÃдѺ
        if(strpos($align, 'R')!==false)
            $dx=$w-$this->cMargin-$this->GetStringWidth($txt);
        elseif(strpos($align, 'C')!==false)
            $dx=($w-$this->GetStringWidth($txt))/2;
        else
            $dx=$this->cMargin;
        //¡Ó˹´¡ÒèѴ¢éͤÇÒÁã¹à«ÅÅìµÒÁá¹Ç´Ôè§
        if(strpos($align, 'T')!==false)
            $dy=$h-(.7*$this->k*$this->FontSize);
        elseif(strpos($align, 'B')!==false)
            $dy=$h-(.3*$this->k*$this->FontSize);
        else
            $dy=.5*$h;
        //¡Ó˹´¡ÒâմàÊé¹ãµé¢éͤÇÒÁ
        if($this->underline)
        {    
            //¡Ó˹´ºÑ¹·Ö¡¡ÃÒ¿Ô¡
            if($this->ColorFlag)
                $this->s_th.=' q '.$this->TextColor.' ';
            //¢Õ´àÊé¹ãµé¢éͤÇÒÁ0
            $this->s_th.=' '.$this->_dounderline($this->x+$dx, $this->y+.5*$h+.3*$this->FontSize, $txt);
            //¡Ó˹´¤×¹¤èÒ¡ÃÒ¿Ô¡
            if($this->ColorFlag)
                $this->s_th.=' Q ';
        }
        //¡Ó˹´¢éͤÇÒÁàª×èÍÁâ§件֧
        if($link)
            $this->Link($this->x, $this->y, $this->GetStringWidth($txt), $this->FontSize, $link);
        /*if($s)
            $this->_out($s);
        $s='';*/
        //µÑ´ÍÑ¡ÉÃÍÍ¡¨Ò¡¢éͤÇÒÁ ·ÕÅеÑÇà¡çºÅ§ÍÐàÃÂì
        $this->array_th=substr($txt, 0);
        $i=0;
        $this->pointY=($this->h-($y+$dy+.3*$this->FontSize))*$k;
        $this->curPointX=($x+$dx)*$k;
        $this->string_th='';
        $this->txt_error=0;

        while($i<strlen($txt))
        {    
            //¡Ó˹´µÓá˹觷Õè¨Ð¾ÔÁ¾ìÍÑ¡ÉÃã¹à«ÅÅì
            if(strpos('èéêëìÔÕÖ×çÑÓØÙ', $this->array_th[$i])!==false)
            {
                $pX=$x+$dx;
                if($i>0)
                    $pX+=.02*$this->GetStringWidth($this->array_th[$i-1]);
                $this->pointX=$pX*$k;
                //µÃǨÊͺÍÑ¡Éà »ÃѺµÓá˹è§áÅзӡÒþÔÁ¾ì
                $this->_checkT($i);

                if($this->txt_error==0)
                    $this->string_th.=$this->array_th[$i];
                else
                {
                    $this->txt_error=0;
                }
            }
            else
                $this->string_th.=$this->array_th[$i];

            //àÅ×è͹µÓáË¹è§ x ä»·ÕèµÑÇ·Õè¨Ð¾ÔÁ¾ì¶Ñ´ä»
            $x=$x+$this->GetStringWidth($this->array_th[$i]);
            $i++;
        }
        $this->TText($this->curPointX, $this->pointY, $this->string_th);
        /*$this->s_th.=$this->s_hidden.$this->s_error;*/
        //$this->s_th.=$this->s_error;
        if($this->s_th)
            $this->_out($this->s_th);
    }
    else
        //¹Ó¤èÒä»áÊ´§àÁ×èÍäÁèÁÕ¢éͤÇÒÁ
        $this->_out($this->s_th);

    $this->lasth=$h;
    //µÃǨÊͺ¡ÒÃÇÒ§µÓá˹觢ͧà«ÅÅì¶Ñ´ä»
    if($ln>0)
    {
        //¢Ö鹺Ã÷ѴãËÁè
        $this->y+=$h;
        if($ln==1)
            $this->x=$this->lMargin;
    }
    else
        $this->x+=$w;
}

/********************************************************************************
* ãªé§Ò¹: Function    Cell ¢Í§ Class FPDF_TH                                        
* ¡Ò÷ӧҹ: ãªé㹡ÒõÃǨÊͺÍÑ¡Éà áÅлÃѺµÓá˹觡è͹·Õè¨Ð·Ó¡ÒþÔÁ¾ì                            
* ¤ÇÒÁµéͧ¡ÒÃ: $this->array_th = ÍÐàÃÂì¢Í§ÍÑ¡É÷ÕèµÑ´ÍÍ¡¨Ò¡¢éͤÇÒÁ                        
*                        $i = ÅӴѺ»Ñ¨¨ØºÑ¹ã¹ÍÐàÃÂì·Õè¨Ð·Ó¡ÒõÃǨÊͺ                        
*                        $s = ÊÒÂÍÑ¡¢ÃТͧ⤴ PDF
*********************************************************************************/
function _checkT($i)
{   
    $pointY=$this->pointY;
    $pointX=$this->pointX;
    $nb=strlen($this->array_th);
    //µÇ¨Êͺ¡ÒÃáÊ´§¼Å¢Í§µÑÇÍÑ¡ÉÃà˹×ÍÊÃк¹
    if($this->_errorTh($this->array_th[$i])==1)
    {
        //µÃǨÊͺµÑÇÍÑ¡Éáè͹˹éÒ¹Ñé¹äÁèãªèÊÃк¹ »ÃѺµÓá˹è§Å§    
        if(($this->_errorTh($this->array_th[$i-1])!=2)&&($this->array_th[$i+1]!="Ó"))
        {
            //¶éÒµÑǹÑé¹à»ç¹äÁéàÍ¡ËÃ×ÍäÁé¨ÑµÇÒ
            if($this->array_th[$i]=="è"||$this->array_th[$i]=="ë")
            {
                $pointY=$this->pointY-.2*$this->FontSize*$this->k;
                $this->txt_error=1;
            }
            //¶éÒµÑǹÑé¹à»ç¹äÁéâ·ËÃ×ÍäÁéµÃÕ
            elseif($this->array_th[$i]=='é'||$this->array_th[$i]=='ê')
            {
                $pointY=$this->pointY-.23*$this->FontSize*$this->k;
                $this->txt_error=1;
            }
            //¶éÒµÑǹÑé¹à»ç¹¡ÒÃѹµì
            else
            {
                $pointY=$this->pointY-.17*$this->FontSize*$this->k;
                $this->txt_error=1;
            }
        }
            
        //µÃǨÊͺµÑÇÍÑ¡ÉõÑÇ¡è͹˹éÒ¹Ñé¹à»ç¹µÑÇÍÑ¡ÉÃËÒ§ÂÒǺ¹
        if($this->_errorTh($this->array_th[$i-1])==3)        
        {
            //¶éÒµÑǹÑé¹à»ç¹äÁéàÍ¡ËÃ×ÍäÁé¨ÑµÇÒ
            if($this->array_th[$i]=="è"||$this->array_th[$i]=="ë")
            {
                $pointX=$this->pointX-.17*$this->GetStringWidth($this->array_th[$i-1])*$this->k;
                $this->txt_error=1;
            }
            //¶éÒµÑǹÑé¹à»ç¹äÁéâ·ËÃ×ÍäÁéµÃÕ
            elseif($this->array_th[$i]=='é'||$this->array_th[$i]=='ê')
            {            
                $pointX=$this->pointX-.25*$this->GetStringWidth($this->array_th[$i-1])*$this->k;
                $this->txt_error=1;
            }
            //¶éÒµÑǹÑé¹à»ç¹¡ÒÃѹµì
            else
            {
                $pointX=$this->pointX-.4*$this->GetStringWidth($this->array_th[$i-1])*$this->k;
                $this->txt_error=1;
            }
        }

        //µÃǨÊͺµÑÇÍÑ¡ÉõÑÇ¡è͹˹éÒ¹Ñé¹ä»ÍÕ¡à»ç¹µÑÇÍÑ¡ÉÃËÒ§ÂÒǺ¹    
        if($i>=2 && $this->_errorTh($this->array_th[$i-2])==3)    
        {                    
            //¶éÒµÑǹÑé¹à»ç¹äÁéàÍ¡ËÃ×ÍäÁé¨ÑµÇÒ
            if($this->array_th[$i]=="è"||$this->array_th[$i]=="ë")
            {
                $pointX=$this->pointX-.17*$this->GetStringWidth($this->array_th[$i-2])*$this->k;
                $this->txt_error=1;
            }
            //¶éÒµÑǹÑé¹à»ç¹äÁéâ·ËÃ×ÍäÁéµÃÕ
            elseif($this->array_th[$i]=='é'||$this->array_th[$i]=='ê')
            {                        
                $pointX=$this->pointX-.25*$this->GetStringWidth($this->array_th[$i-2])*$this->k;
                $this->txt_error=1;
            }
            //¶éÒµÑǹÑé¹à»ç¹¡ÒÃѹµì
            else
            {
                $pointX=$this->pointX-.4*$this->GetStringWidth($this->array_th[$i-2])*$this->k;                        
                $this->txt_error=1;
            }
        }
    }
    //¨º¡ÒõÃǨÊͺµÑÇÍÑ¡ÉÃà˹×ÍÊÃк¹

    //µÇ¨Êͺ¡ÒÃáÊ´§¼Å¢Í§µÑÇÍÑ¡ÉÃÊÃк¹
    elseif($this->_errorTh($this->array_th[$i])==2)
    {
        //µÃǨÊͺµÑÇÍÑ¡ÉõÑÇ¡è͹˹éÒ¹Ñé¹à»ç¹µÑÇÍÑ¡ÉÃËÒ§ÂÒǺ¹
        if($this->_errorTh($this->array_th[$i-1])==3)    
        {
            $pointX=$this->pointX-.17*$this->GetStringWidth($this->array_th[$i-1])*$this->k;
            $this->txt_error=1;
        }
        //¶éÒµÑǹÑé¹à»ç¹ÊÃÐÍÓ
        if($this->array_th[$i]=="Ó")
            //µÃǨÊͺµÑÇÍÑ¡ÉõÑÇ¡è͹˹éÒ¹Ñé¹à»ç¹µÑÇÍÑ¡ÉÃËÒ§ÂÒǺ¹
            if($this->_errorTh($this->array_th[$i-2])==3)    
            {
                $pointX=$this->pointX-.17*$this->GetStringWidth($this->array_th[$i-2])*$this->k;
                $this->txt_error=1;
            }
    }                                                                                        
    //¨º¡ÒõÃǨÊͺµÑÇÍÑ¡ÉÃÊÃк¹

    //µÇ¨Êͺ¡ÒÃáÊ´§¼Å¢Í§µÑÇÍÑ¡ÉÃÊÃÐÅèÒ§
    elseif($this->_errorTh($this->array_th[$i])==6)
    {
        //µÃǨÊͺµÑÇÍÑ¡ÉõÑÇ¡è͹˹éÒ¹Ñé¹à»ç¹µÑÇÍÑ¡Éà ­. ¡Ñº °.
        if($this->_errorTh($this->array_th[$i-1])==5)                        
        {    //$this->string_th        $this->curPointX
            $this->TText($this->curPointX, $this->pointY, $this->string_th);
            $this->string_th='';
            $this->curPointX=$this->pointX;

            if($this->checkFill=='f')
                $this->s_th.=' q ';
            else
                $this->s_th.=' q 1 g ';
            //ÊÃéÒ§ÊÕèàËÅÕèÂÁä»»Ô´·Õè°Ò¹ÅèÒ§¢Í§µÑÇÍÑ¡Éà ­. ¡Ñº °. $s.
            $this->s_th.=sprintf('%.2F %.2F %.2F %.2F re f ', $this->pointX-$this->GetStringWidth($this->array_th[$i-1])*$this->k, $this->pointY-.27*$this->FontSize*$this->k, .9*$this->GetStringWidth($this->array_th[$i-1])*$this->k, .25*$this->FontSize*$this->k);
            $this->s_th.=' Q ';

            $this->txt_error=1;
        }
        //µÃǨÊͺµÑÇÍÑ¡ÉõÑÇ¡è͹˹éÒ¹Ñé¹à»ç¹ÍÑ¡¢ÃÐ ¯. ¡Ñº ®.
        elseif($this->_errorTh($this->array_th[$i-1])==4)                            
        {
            $pointY=$this->pointY-.25*$this->FontSize*$this->k;
            $this->txt_error=1;
        }
        //¨º¡ÒõÃǨÊͺµÑÇÍÑ¡ÉÃÊÃÐÅèÒ§
    }                                                                                        
    //¨º¡ÒõÃǨÊͺµÑÇÍÑ¡ÉÃÐÊÃÐÅèÒ§
        
    if($this->txt_error==1)
        $this->TText($pointX, $pointY, $this->array_th[$i]);
}

/********************************************************************************
* ãªé§Ò¹: Function    _checkT ¢Í§ Class FPDF_TH                
* ¡Ò÷ӧҹ: ãªé㹡ÒõÃǨÊͺÍÑ¡É÷ÕèÍÒ¨¨Ð·ÓãËéà¡Ô´¡ÒþÔÁ¾ì·Õè¼Ô´¾ÅÒ´            
* ¤ÇÒÁµéͧ¡ÒÃ: $char_th = µÑÇÍÑ¡É÷Õè¨Ðãªé㹡ÒÃà»ÃÕºà·Õº            
*********************************************************************************/
function _errorTh($char_th)
{    
    $txt_error=0;
    //µÑÇÍÑ¡Éú¹-º¹
    if(($char_th=='è')||($char_th=='é')||($char_th=='ê')||($char_th=='ë')||($char_th=='ì'))
        $txt_error=1;
    //µÑÇÍÑ¡Éú¹
    elseif(($char_th=='Ô')||($char_th=='Õ')||($char_th=='Ö')||($char_th=='×')||($char_th=='ç')||($char_th=='Ñ')||($char_th=='Ó'))
        $txt_error=2;
    //µÑÇÍÑ¡ÉáÅÒ§-º¹
    elseif(($char_th=='»')||($char_th=='¿')||($char_th=='½'))
        $txt_error=3;
    //µÑÇÍÑ¡ÉáÅÒ§-ÅèÒ§
    elseif(($char_th=='®')||($char_th=='¯'))
        $txt_error=4;
    //µÑÇÍÑ¡ÉáÅÒ§-ÅèÒ§
    elseif(($char_th=='­')||($char_th=='°'))
        $txt_error=5;
    //µÑÇÍÑ¡ÉÃÊÃÐÅèÒ§
    elseif(($char_th=='Ø')||($char_th=='Ù'))
        $txt_error=6;
    else
        $txt_error=0;
    return $txt_error;
}

/********************************************************************************
* ãªé§Ò¹: Function    _checkT ¢Í§ Class FPDF_TH                                    *
* ¡Ò÷ӧҹ: ãªéã¹¾ÔÁ¾ìµÑÇÍÑ¡É÷ÕèµÃǨÊͺáÅéÇ                                    *
* ¤ÇÒÁµéͧ¡ÒÃ: $txt_th = µÑÇÍÑ¡Éà 1 µÑÇ ·ÕèµÃǨÊͺáÅéÇ                            *
*                        $s = ÊÒÂÍÑ¡¢ÃТͧ⤴ PDF                                *
*********************************************************************************/
function TText($pX, $pY, $txt_th)
{    
    //µÇ¨Êͺ¡ÒÃãÊèÊÕà«ÅÅì
    if($this->ColorFlag)
        $this->s_th.=' q '.$this->TextColor.' ';
    $txt_th2=str_replace(')', '\\)', str_replace('(', '\\(', str_replace('\\', '\\\\', $txt_th)));
    //ÃкصÓáË¹è§ áÅоÔÁ¾ìµÑÇÍÑ¡ÉÃ
    $this->s_th.=sprintf(' BT %.2F %.2F Td (%s) Tj ET ', $pX, $pY, $txt_th2);
    if($this->ColorFlag)
        $this->s_th.=' Q ';
}

/****************************************************************************************
* ãªé§Ò¹: called by function MultiCell within this class                                
* ÍéÒ§ÍÔ§: Function Cell    ¢Í§ Class FPDF                                                
* ¡Ò÷ӧҹ: ãªé㹡ÒþÔÁ¾ì¢éͤÇÒÁ·ÕÅкÃ÷Ѵ¢Í§àÍ¡ÊÒà PDF                                             
* ÃٺẺ: MCell (    $w = ¤ÇÒÁ¡ÇéÒ§¢Í§Cell,                                                    
*                    $h = ¤ÇÒÁÊÙ§¢Í§Cell,                                                    
*                    $txt = ¢éͤÇÒÁ·Õè¨Ð¾ÔÁ¾ì,                                                    
*                    $border = ¡Ó˹´¡ÒÃáÊ´§àÊ鹡Ãͺ(0 = äÁèáÊ´§, 1= áÊ´§),                    
*                    $ln = µÓá˹觷ÕèÍÂÙè¶Ñ´ä»¨Ò¡à«ÅÅì(0 = ¢ÇÒ, 1 = ºÃ÷Ѵ¶Ñ´ä», 2 = ´éÒ¹ÅèÒ§), 
*                    $align = µÓá˹觢éͤÇÒÁ(L = «éÒÂ, R = ¢ÇÒ, C = ¡Ö觡ÅÒ§, T = º¹, B = ÅèÒ§),    
*                    $fill = ¡Ó˹´¡ÒÃáÊ´§ÊբͧCell(false = äÁèáÊ´§, true = áÊ´§)            
*                    $link = URL ·Õèµéͧ¡ÒÃãËé¢éͤÇÒÁàª×èÍÁâ§件֧        
*                )
*****************************************************************************************/
function MCell($w, $h=0, $txt='', $border=0, $ln=0, $align='', $fill=false, $link='')
{
    $this->checkFill="";
    $k=$this->k;
    if($this->y+$h>$this->PageBreakTrigger && !$this->InHeader && !$this->InFooter && $this->AcceptPageBreak())
    {
        //¢Öé¹Ë¹éÒãËÁèÍѵâ¹Áѵ
        $x=$this->x;
        $ws=$this->ws;
        if($ws>0)
        {
            $this->ws=0;
            $this->_out('0 Tw');
        }
        $this->AddPage($this->CurOrientation);
        $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;
    $this->s_th='';
    //¡Ó˹´¡ÒÃáÊ´§àÊ鹡Ãͺ 4 ´éÒ¹ áÅÐÊÕ¡Ãͺ
    if($fill || $border==1)
    {
        if($fill)
            $op=($border==1) ? 'B' : 'f';
        else
            $op='S';
        $this->s_th=sprintf('%.2F %.2F %.2F %.2F re %s ', $this->x*$k, ($this->h-$this->y)*$k, $w*$k, -$h*$k, $op);
        if($op=='f')
            $this->checkFill=$op;
    }
    //¡Ó˹´¡ÒÃáÊ´§àÊ鹡Ãͺ·ÕÅÐàÊé¹
    if(is_string($border))
    {
        $x=$this->x;
        $y=$this->y;
        if(strpos($border, 'L')!==false)
            $this->s_th.=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)
            $this->s_th.=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)
            $this->s_th.=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)
            $this->s_th.=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!=='')
    {            
        $x=$this->x;
        $y=$this->y;
        //¡Ó˹´¡ÒèѴ¢éͤÇÒÁã¹à«ÅÅìµÒÁá¹ÇÃдѺ
        if(strpos($align, 'R')!==false)
            $dx=$w-$this->cMargin-$this->GetStringWidth($txt);
        elseif(strpos($align, 'C')!==false)
            $dx=($w-$this->GetStringWidth($txt))/2;
        else
            $dx=$this->cMargin;
        //¡Ó˹´¡ÒèѴ¢éͤÇÒÁã¹à«ÅÅìµÒÁá¹Ç´Ôè§
        if(strpos($align, 'T')!==false)
            $dy=$h-(.7*$this->k*$this->FontSize);
        elseif(strpos($align, 'B')!==false)
            $dy=$h-(.3*$this->k*$this->FontSize);
        else
            $dy=.5*$h;
        //¡Ó˹´¡ÒâմàÊé¹ãµé¢éͤÇÒÁ
        if($this->underline)
        {    
            //¡Ó˹´ºÑ¹·Ö¡¡ÃÒ¿Ô¡
            if($this->ColorFlag)
                $this->s_th.='q '.$this->TextColor.' ';
            //¢Õ´àÊé¹ãµé¢éͤÇÒÁ0
            $this->s_th.=' '.$this->_dounderline($this->x+$dx, $this->y+.5*$h+.3*$this->FontSize, $txt);
            //¡Ó˹´¤×¹¤èÒ¡ÃÒ¿Ô¡
            if($this->ColorFlag)
                $this->s_th.=' Q';
        }
        //¡Ó˹´¢éͤÇÒÁàª×èÍÁâ§件֧
        if($link)
            $this->Link($this->x, $this->y, $this->GetStringWidth($txt), $this->FontSize, $link);
        if($this->s_th)
            $this->_out($this->s_th);
        $this->s_th='';
        //µÑ´ÍÑ¡ÉÃÍÍ¡¨Ò¡¢éͤÇÒÁ ·ÕÅеÑÇà¡çºÅ§ÍÐàÃÂì
        $this->array_th=substr($txt, 0);
        $i=0;

        while($i<strlen($txt))
        {    
            //¡Ó˹´µÓá˹觷Õè¨Ð¾ÔÁ¾ìÍÑ¡ÉÃã¹à«ÅÅì
            $this->pointX=($x+$dx+.02*$this->GetStringWidth($this->array_th[$i-1]))*$k;
            $this->pointY=($this->h-($y+$dy+.3*$this->FontSize))*$k;
            //µÃǨÊͺÍÑ¡Éà »ÃѺµÓá˹è§áÅзӡÒþÔÁ¾ì
            $this->_checkT($i);
            if($this->txt_error==0)
                $this->TText($this->pointX, $this->pointY, $this->array_th[$i]);
            else
            {
                $this->txt_error=0;
            }
            //µÃǨÊͺ¡ÒÃãÊèàŢ˹éÒ
            if($this->array_th[$i]=='{'&&$this->array_th[$i+1]=='n'&&$this->array_th[$i+2]=='b'&&$this->array_th[$i+3]=='}')
                $i=$i+3;
            //àÅ×è͹µÓáË¹è§ x ä»·ÕèµÑÇ·Õè¨Ð¾ÔÁ¾ì¶Ñ´ä»
            $x=$x+$this->GetStringWidth($this->array_th[$i]);
            $i++;
        }
        $this->_out($this->s_th);
    }
    else
        //¹Ó¤èÒä»áÊ´§àÁ×èÍäÁèÁÕ¢éͤÇÒÁ
        $this->_out($this->s_th);

    $this->lasth=$h;
    //µÃǨÊͺ¡ÒÃÇÒ§µÓá˹觢ͧà«ÅÅì¶Ñ´ä»
    if($ln>0)
    {
        //¢Ö鹺Ã÷ѴãËÁè
        $this->y+=$h;
        if($ln==1)
            $this->x=$this->lMargin;
    }
    else
        $this->x+=$w;
}
//End of class
}

?>

Example

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

class PDF extends FPDF_Thai
{
function Header()
{
    $this->SetFont('AngsanaNew', 'BU', 40);
    $this->Cell(190, 10, 'ÁËÒÇÔ·ÂÒÅѺÙþÒ', 0, 0, 'C');
    $this->Ln(20);
}

function ColorTable($header, $data)
{
    //Colors, line width and bold font
    $this->SetFillColor(255, 0, 0);
    $this->SetTextColor(255);
    $this->SetDrawColor(128, 0, 0);
    $this->SetLineWidth(.3);
    $this->SetFont('', 'B');
    //Header
    $w=array(40, 35, 40, 45);
    for($i=0;$i<count($header);$i++)
        $this->Cell($w[$i], 7, $header[$i], 1, 0, 'C', 1);
    $this->Ln();
    //Color and font restoration
    $this->SetFillColor(224, 235, 255);
    $this->SetTextColor(0);
    $this->SetFont('');
    //Data
    $fill=0;
    foreach($data as $row)
    {
        $this->Cell($w[0], 6, $row[0], 'LR', 0, 'L', $fill);
        $this->Cell($w[1], 6, $row[1], 'LR', 0, 'L', $fill);
        $this->Cell($w[2], 6, $row[2], 'LR', 0, 'C', $fill);
        $this->Cell($w[3], 6, number_format($row[3]), 'LR', 0, 'R', $fill);
        $this->Ln();
        $fill=!$fill;
    }
    $this->Cell(array_sum($w), 0, '', 'T');
}
}

$pdf=new PDF();
$pdf->AddFont('AngsanaNew', '', 'angsa.php');
$pdf->AddFont('AngsanaNew', 'B', 'angsab.php');
$pdf->AddPage();
$pdf->SetFont('AngsanaNew', '', 12);
//Column titles
$header=array('ª×èÍ', '¹ÒÁÊ¡ØÅ', 'ÃËÑʹÔÊÔµ', '¤èÒãªé¨èÒÂ/à´×͹');
//Read file lines
$lines=file('student.txt');
$data=array();
foreach($lines as $line)
    $data[]=explode(';', chop($line));
//Output table
$pdf->ColorTable($header, $data);

$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.