Samstag, 1. Februar 2014

Wo ist der Barcode?

So ein Barcode-Scanner ist schon eine feine Sache. Kurz den Barcode gescannt und schon weiß das Programm um welchen Artikel oder welche Bestellung es sich handelt. Warum also nicht einen Barcode mit der Rechnungsnummer auf die Rechnung und den Lieferschein drucken.

Auf der Suche nach einer geeigneten Lösung stellte ich fest, dass die im OXID eShop verwendete Bibliothek TCPDF direkt Barcodes unterstützt und davon gleich eine große Zahl verschiedenster Typen  (Beispiel). Meine Idee sollte also recht schnell gelöst werden können.

Doch leider führte der Einbau eines Beispielcodes nur zu einem Fehler und der Shop erstellte auf einmal gar keine PDFs mehr. Bei der Ausführung muss also ein Fehler aufgetreten sein. Der Eintrag im PHP Error Log verwunderte mich dann schon etwas:
Failed opening required '.../core/tcpdf/barcodes.php'

Wieso kann die Datei nicht geöffnet werden? Der Vergleich des Verzeichnisses /core/tcpdf mit dem aktuellen Download der Bibliothek zeigte, dass die TCPDF Bibiliothek, die mit der OXID Installation verteilt wird, a) ziemlich alt und b) nicht vollständig ist. Es wurden mehrere Dateien weggelassen, unter anderem auch die Datei barcodes.php, die für den Code für die Barcode-Erzeugung enthält.

Jetzt stand ich vor der Wahl: soll ich die alte Version von TCPDF gegen die aktuelle Version austauschen oder versuchen die alte Version irgendwo noch als Download zu finden. Da mir die Option, die alte Version irgendwo noch zu finden, einfacher erschien, machte ich mich auf die Suche. Das Web vergisst ja nichts, so auch nicht die gesuchte Version 4.8.009 von TCPDF, die von OXID verwendet wird - inklusive Barcode-Biblithek versteht sich ;-).

Nachdem ich daraus die Datei barcodes.php in das Verzeichnis /core/tcpdf kopiert hatte, lief die Erstellung des PDFs fehlerfrei durch und der Barcode wurde auf der Rechnung angezeigt. So einfach kann die Welt sein.


Und so wird der Barcode in die Datei myorder.php eingebaut:

Die neue Funktion pdfBarcode() erstellt den Barcode:
public function pdfBarcode( $oPdf )
    {

        $aStyle = array(
                'position' => 'R',
                'align' => 'C',
                'stretch' => false,
                'fitwidth' => true,
                'cellfitalign' => '',
                'border' => false,
                'hpadding' => 'auto',
                'vpadding' => 'auto',
                'fgcolor' => array(0,0,0),
                'bgcolor' => false,
                'text' => false,
                'font' => 'helvetica',
                'fontsize' => 8,
                'stretchtext' => 4
        );

        $sText = sprintf( "%06d", 
                          $this->oxorder__oxbillnr->value );
        $oPdf->write1DBarcode($sText, 'C39', '', 74, '', 6, 
                              0.4, $aStyle, 'N');
        $oPdf->Ln();

    }
Die Funktion fügt zur Rechnungsnummer noch ein paar führende Nullen hinzu und platziert den Barcode am rechten Rand unterhalb der Rechnungsnummer. Leider hat diese (ältere) Version von TCPDF noch ein paar Macken. So lässt sich der Barcode horizontal nicht exakt positionieren, sondern nur an den Positionen links, Mitte und rechts.

Die neue Funktion wird in der Funktion genPdf, unmittelbar nach der Erstellung des Headers ($this->pdfHeader( $oPdf );), aufgerufen:
// adding barcode with invno to pdf
$this->pdfBarcode( $oPdf );


3 Kommentare:

  1. Where did i get this write1DBarcode( ) in myorder.php? and can you give total source code about genarate barcode in pdf.

    AntwortenLöschen
  2. Search in the myorder.php for the line
    $this->pdfHeader( $oPdf );
    After this line add a new line with
    $this->pdfBarcode( $oPdf );

    And don't forget to add the complete function pdfBarcode from above to myorder.php

    AntwortenLöschen
  3. Hallo Joachim,
    zunächst danke für den interessanten Beitrag den wir direkt ausprobiert haben.
    In der myorder.php haben wir - wie beschrieben - $this->pdfBarcode( $oPdf ); eingefügt, siehe unten:

    ....

    public function pdfHeaderPlus( $oPdf )
    {

    // new page with shop logo
    $this->pdfHeader( $oPdf );

    // adding barcode with invno to pdf
    $this->pdfBarcode( $oPdf );
    .....

    Anschliessend haben wir den rechtlichen Code in die myorder.php eingefügt - siehe unten:

    /**
    * Generates order pdf report file
    *
    * @param string $sFilename name of report file
    * @param int $iSelLang active language
    *
    * @return null
    */
    public function pdfBarcode( $oPdf )
    {

    $aStyle = array(
    'position' => 'R',
    'align' => 'C',
    'stretch' => false,
    'fitwidth' => true,
    'cellfitalign' => '',
    'border' => false,
    'hpadding' => 'auto',
    'vpadding' => 'auto',
    'fgcolor' => array(0,0,0),
    'bgcolor' => false,
    'text' => false,
    'font' => 'helvetica',
    'fontsize' => 8,
    'stretchtext' => 4
    );

    $sText = sprintf( "%06d",
    $this->oxorder__oxbillnr->value );
    $oPdf->write1DBarcode($sText, 'C39', '', 74, '', 6,
    0.4, $aStyle, 'N');
    $oPdf->Ln();

    }

    public function genPdf( $sFilename, $iSelLang = 0 )
    {

    .....

    Leider werden die PDF-Rechnungen gar nicht mehr generiert.
    Müssen wir vielleicht außer der der Datei barcode.php weitere Dateien/Biliotheken in den Ordner tcpdf kopieren?

    AntwortenLöschen