Fusioninvoice

Auf Besis des Codeigniter gab es zwei beliebte Rechnungsprogramme, BambooInvoice und Fusioninvoice. Beide sind mitlerweilen eingestellt, bzw. nach einer Überarbeitung nur noch kommerziell erhältlich. Aber… Sie waren mal frei uns sind noch immer zu finden, wobei ich pro Fusion bin, das sieht schicker aus und kann scheinbar auch mehr. Für mich wichtig: Wiederholende Rechnungen, z.B. für Abos.

„Fusioninvoice“ weiterlesen

Codeigniter und MYSQLs DATE_FORMAT()

Man, jetzt hab ichs.

$this->db->select("DATE_FORMAT(beginn, '%d.%m.%Y') AS fbeginn")

wird durch den aktiven Schutz zu einem

DATE_FORMAT(beginn, `'$d`.`$m`.`$Y'`)`

und damit zu einem falschen Statement.

Den Schutz kann man deaktivieren. Die Select-Methode hat dazu einen zweiten Parameter:

$this->db->select("DATE_FORMAT(beginn, '%d.%m.%Y') AS fbeginn", FALSE)

Thats it 🙂

Komma als Dezimaltrenner in Codeigniter

Wenn man eine Formulareingabe per „decimal“ auf seinen Inhalt prüft, landet man bei einer Eingabe wie „5,99“ bei einem Fehler, dass das Feld dezimal sein muss.

Auch wenn man als Sprache bereits german nutzt, wird dieses Problem nicht behoben. Es hilft nur eines, die Validierung muss ungebaut werden:

http://stackoverflow.com/questions/8953923/with-codeigniter-how-can-i-accept-euro-currency-in-form-validation

dompdf und Papierausrichtung

So, nach ein wenig dompdf kann ich sagen: easy. Man kann aber die Ausrichtung oder Größen der Seiten innerhalb des Dokuments nicht ändern. Ein mal festgelegt bleibt es beispielsweise bei A4 und Portrait. Allerdings gibt es zwei Entwickler, die das ganze gefixt haben.

https://groups.google.com/forum/#!msg/dompdf/NvTKQkBPxVc/aEK_2NSk3LUJ

1. ykdompdf

Einen ersten Fix gibt es mit ykdompdf.

http://www.mediafire.com/download/g9lkzx3gl170nyb/ykdompdf.php

Wie es anzuwenden ist, ist im Dokument selbst erklärt. ykdompdf.php ist im Grunde überfüssig (siehe Schritt 2) aber die Codeänderungen an dompdf sind zu erledigen. Eigentlich ganz easy, nur ein Update von dompdf würde alles wieder zerstören.

2. dompdf_pages

Bei mir hat Schritt 1 nicht gereicht, es lief nicht rund. Außerdem sind im selben Beitrag oben ein paar Fehler genannt, die in einem weiteren Patch erledigt werden. Achtung: die im Forum angebotene Datei reicht nicht, deshalb hier entlang:

https://github.com/craigfrancis/dompdf/tree/page-merge/pages

dompdf_pages ersetzt ykdompdf.

Allerdings ist da noch eine class.pdf.php.diff. Ohne diese Änderungen werden geänderte Seiten nicht ausgegeben. Das war vermutlich auch mein Problem, so aber habe ich nun den Fix vom Patch und überhaupt alles zusammen 🙂

Man kann das ganze auch fertig bekommen, allerdings mit der dompdf-Version 0.6.0 statt 0.9.irgendwas+

https://github.com/craigfrancis/dompdf/tree/page-merge

Weiteres

Codeigniter

Das kleine How-To in den kommentaren verwendet load_html_file(). Das klappt nur, wenn auch wirklich eine HTML-Datei übergeben wird. Ich verwende dompdf mit Codeigniter und dort klappts nur mit einem load_html()

        $html1 = $this->load->view('/abrechnung/pdf/anschreiben', $data, TRUE);
        $ykdom->set_paper('a4','portrait');
        $ykdom->load_html($html1);
        $ykdom->render();

CSS-Formatierung

Wenn plötzlich eine leere Seite erscheint, dann ist da ein Seitenumbruch im CSS zu viel. Für hübsche Layouts gibts zumindest ein paar wenige Layoutoptionen im CSS.

http://www.css4you.de/printproperty.html

PDFs mit dompdf und Codeigniter

Ich war etwas auf der Suche ehe ich mich für dompdf entschieden habe. Warum? Es scheint am häufigsten benutzt zu werden und sollte somit noch ne Weile aktuell bleiben. Ich werde es ja sehen.

Außerdem ist es sehr sehr einfach. Man kann mit dompdf schlicht ein html-Dokument übergeben und dompdf macht daraus ein PDF, welches abgelegt wird oder direkt heruntergeladen werden kann.

Nun verwende ich für mein aktuelles Projekt Codeigniter. Ich war auf der Suche, wie man das nun bequem integrieren kann und habe nach etwas probieren mich für einen sehr simplen weg entschieden. Man könnte dompdf sicher in eine Library packen oder vielleicht als Driver bezeichnen und entsprechend verwenden, es gibt aber auch den Folder third_party und der hats mit angetan 🙂

Download dompdf

Das ganze gibt es hier (https://github.com/dompdf/dompdf) und kommt in den /application/third_party/ Ordner von Codeigniter. Ich habe das Verzeichnis noch von dompdf-master/ auf dompdf/ umbenannt.

Download font-lib-php

Mir warf dompdf beim ersten Versuch einen Fehler:

Warning: require_once(/var/www/dompdf-master/lib/php-font-lib/classes/font.cls.php): failed to open stream: No such file or directory in /var/www/dompdf-master/dompdf_config.inc.php on line 335
Fatal error: require_once(): Failed opening required ‚/var/www/dompdf-master/lib/php-font-lib/classes/font.cls.php‘ (include_path=‘.:/usr/share/php:/usr/share/pear‘) in /var/www/dompdf-master/dompdf_config.inc.php on line 335

Auslöser ist das fehlende font-lib-php. Also herunterladen (https://github.com/PhenX/php-font-lib). Im Ordner /application/third/party/dompdf/lib/php-font-lib den Ordner classes/ erstellen und den Inhalt von src/FontLib reinkopieren.

Includen

Wie gesagt, ich habe es mir einfach gemacht. Ich include einfach dompdf in der Methode, in der ich es brauche.

class Abrechnung extends CI_Controller {

    public function pdf()
    {
        
        require_once APPPATH.'third_party/dompdf/dompdf_config.inc.php';
        
        $data = '';
        
        $dompdf = new DOMPDF();
        $html = $this->load->view('abrechnung/pdf', $data, TRUE);
        $dompdf->set_paper('a4','portrait');
        $dompdf->load_html($html);
        $dompdf->render();
        $dompdf->stream("name.pdf");

    }
    
}

Das war es im Grunde schon. In diesem Code fülle ich das PDF noch mit einer HTML-Datei. Die Formatierung sieht noch etwas verunglückt aus, aber der Code wird ausgeführt und mein HTML angezeigt. Hübschmachen kommt jetzt 🙂

Beim herumexperimentieren hatte ich den Fehler

Fatal error: Uncaught exception ‘DOMPDF_Exception’ with message ‘An input file is required (i.e. input_file _GET variable).

Das passiert, wenn man anstelle der config-datei dompdf.php includiert. Also besser nicht machen 😉

 

Quellen

https://kyokasuigetsu25.wordpress.com/2011/02/09/how-to-use-dompdf/
http://stackoverflow.com/questions/17999091/how-do-i-get-dompdf-to-display-my-codeigniter-view-correctly
http://stackoverflow.com/questions/15028250/dompdf-fails-to-load