Problem:
In einem bei All-Inkl gehosteten Shop werden in der pdf Rechnung alle Artikel in eine Zeile geschrieben, das Ergebnis schaut dann ungefähr so aus:

Das Problem tritt ausschließlich bei All-Inkl auf, bei anderen Providern oder unter XAMPP ist die pdf Rechnung mit demselben Shop und derselben Konfiguration völlig ok.

Ursache:
Bei vielen All-Inkl Paketen ist die PHP Extension pdflib aktiv.
Zu finden unter Tools > Serverinfo:

pdflib enthält die von der pdf Rechnung verwendete Funktion MultiCell bereits und bringt den Konflikt.
Die pdflib Extension kann auf einem Shared All-Inkl Server nicht deaktiviert werden.

Lösung:
(Nur nötig, wenn die pdf Rechnung exakt dieses Problem hat und unter Tools > Serverinfo die pdflib Extension aufscheint!)

1)

includes/pdf/fpdi.php

Nach folgendem Eintrag in ca. Zeile bis 91 bis 101:
Code:
function setSourceFile($filename) {
        $this->current_filename = $filename;
        $fn =& $this->current_filename;

        if (!isset($this->parsers[$fn]))
            $this->parsers[$fn] =& new fpdi_pdf_parser($fn,$this);
        $this->current_parser =& $this->parsers[$fn];
        
        return $this->parsers[$fn]->getPageCount();
    }
Folgendes hinzufügen:

Code:
function AllMultiCell($w, $h, $txt, $border=0, $align='J', $fill=false) {
    $h1 = $this->GetY();
    //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->Cell($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];
        $l+=$cw[ord($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->Cell($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->Cell($w,$h,substr($s,$j,$sep-$j),$b,2,$align,$fill);
                #$this->Cell($w,$h,'782'.substr($s,$j,1),$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->Cell($w,$h,substr($s,$j,$i-$j),$b,2,$align,$fill);
    #$this->Cell($w,$h,'805'.substr($s,$j,1),$b,2,$align,$fill);
    $this->x=$this->lMargin;
    $h2 = $this->GetY();
    return array($h1, $h2);    
}
2)

includes/classes/class.rl_invoice3.php

Die Einträge MultiCell mit AllMultiCell ersetzen:

ca. Zeile 335:
Ändern von:
Code:
$mc = $this->pdf->MultiCell($w, $this->pdf->FontSize * $this->lineHeight[0], $this->mr($data[$i]), 0, $a);
auf:
Code:
$mc = $this->pdf->AllMultiCell($w, $this->pdf->FontSize * $this->lineHeight[0], $this->mr($data[$i]), 0, $a);
ca. Zeile 464:
Ändern von:
Code:
$this->pdf->MultiCell($this->addressWidth['addr1'], 5, $x['delivery'], $this->addressBorder['addr1'], 1, 'L');
auf:
Code:
$this->pdf->AllMultiCell($this->addressWidth['addr1'], 5, $x['delivery'], $this->addressBorder['addr1'], 1, 'L');
ca. Zeile 467:
Ändern von:
Code:
$this->pdf->MultiCell($this->addressWidth['addr2'], 5, $x['billing'], $this->addressBorder['addr2'], 1, 'L');
auf:
Code:
$this->pdf->AllMultiCell($this->addressWidth['addr2'], 5, $x['billing'], $this->addressBorder['addr2'], 1, 'L');
ca. Zeile 666:
Ändern von:
Code:
$this->pdf->MultiCell(0, 3, $this->debugInfo, 1);
auf:
Code:
$this->pdf->AllMultiCell(0, 3, $this->debugInfo, 1);