Magento factuur PDF aanpassen

Ik werk bij Pronamic regelmatig met het opensource e-commerce platform Magento. Van veel klanten krijgen we het verzoek om de PDF documenten die Magento genereert aan te passen. Er zijn een aantal plugins die het mogelijk maken om de opmaak van de PDF documenten aan te passen:

Helaas zijn deze plugins vaak beperkt tot het aanpassen van kleuren en lettertypen of richten ze zich op 1 specifieke opmaak. Voor veel van onze klanten zijn deze plugins daarom niet interessant. Gelukkig zijn er ook mogelijkheden om de PDF’s aan te passen met behulp van PHP code. Op internet zijn verschillende artikelen te vinden over hoe dit is aan te passen.

De code die verantwoordelijk is voor het generen van de PDF documenten is o.a. te vinden in de volgende map:

/app/code/core/Mage/Sales/Model/Order/Pdf/

Het is mogelijk om de bestanden in deze map te wijzigen, maar verstandig is dit niet. Alle wijzigingen in deze map gaan namelijk verloren zodra je Magento update. Om dit te voorkomen kun je het beste de bestanden die je wijzigt opslaan in de volgende map:

/app/code/local/Mage/Sales/Model/Order/Pdf/

Ik zal in het kort uitleggen hoe je een voettekst kunt toevoegen aan de PDF document.

Voettekst toevoegen aan Magento PDF

Allereerst moeten de volgende 2 bestanden worden gekopieerd:

/app/code/core/Mage/Sales/Model/Order/Pdf/Abstract.php
/app/code/core/Mage/Sales/Model/Order/Pdf/Invoice.php

naar de volgende locatie:

/app/code/local/Mage/Sales/Model/Order/Pdf/Abstract.php
/app/code/local/Mage/Sales/Model/Order/Pdf/Invoice.php

Hiermee voorkom je dat na een Magento update je wijzigingen verloren gaan.

Vervolgens creëren we in de class Mage_Sales_Model_Order_Pdf_Abstract (in het bestand Abstract.php) een nieuwe functie die verantwoordelijk is voor het genereren van de voettekst. Ik heb deze functie in dit voorbeeld bewust recht toe aan gehouden. Er zijn uiteraard allerlei mogelijkheden om deze functie in te korten en flexibeler te maken.

/**
 * Insert footer
 */
protected function insertFooter(&$page, $store = null) {
	$this->_setFontBold($page);

	$startX = 50;
	$startY = 80;
	$columnWidth = 125;
	$lineY = 10;

	// Footer title
	$page->setFillColor(new Zend_Pdf_Color_GrayScale(0.25));

	$name = 'Deze webwinkel';
	if($store !== null) {
		$name = $store->getFrontendName();
	}

	$text = sprintf('%s is onderdeel van Pronamic', $name);

	$page->drawText($text, $startX, $startY, 'UTF-8');

	$startY = $startY - $lineY - $lineY;

	// Columns
	$page->setFillColor(new Zend_Pdf_Color_GrayScale(0.5));

	// Column 1
	$x = $startX;
	$y = $startY;

	$page->drawText('Pronamic', $x, $y, 'UTF-8');
	$y -= $lineY;
	$page->drawText('Merkebuorren 39a', $x, $y, 'UTF-8');
	$y -= $lineY;
	$page->drawText('9241 GB Wijnjewoude', $x, $y, 'UTF-8');

	// Column 2
	$x += $columnWidth;
	$y = $startY;

	$page->drawText('0516 481 200', $x, $y, 'UTF-8');
	$y -= $lineY;
	$page->drawText('info@pronamic.nl', $x, $y, 'UTF-8');
	$y -= $lineY;
	$page->drawText('pronamic.nl', $x, $y, 'UTF-8');

	// Column 3
	$x += $columnWidth;
	$y = $startY;

	$page->drawText('RABO 12.34.56.789', $x, $y, 'UTF-8');
	$y -= $lineY;
	$page->drawText('IBAN NL64 RABO 0123456789', $x, $y, 'UTF-8');
	$y -= $lineY;
	$page->drawText('BIC RABONL2U', $x, $y, 'UTF-8');

	// Column 3
	$x += $columnWidth;
	$y = $startY;

	$page->drawText('', $x, $y, 'UTF-8');
	$y -= $lineY;
	$page->drawText('KVK 01108446', $x, $y, 'UTF-8');
	$y -= $lineY;
	$page->drawText('BTW NL.1234.56.789.B01', $x, $y, 'UTF-8');
}

Vervolgens moet deze functie nog aangeroepen worden. De aanroep van deze functie voegen we toe in de functie getPdf van de Mage_Sales_Model_Order_Pdf_Invoice class.

		$this->insertFooter($page, $invoice->getStore());
	}

	$this->_afterGetPdf();

	return $pdf;
}

Vervolgens zal je factuur PDF er als volgt uit zien:


Update

Omdat veel lezers moeite hebben met het aanpassen van de bestanden heb ik ze voor het gemak online gezet.

28 gedachten over “Magento factuur PDF aanpassen

  1. Hallo Remco,

    Heb je oplossing meerdere malen gelezen en geprobeerd, maar het wil niet de footer invoegen.

    Cache legen mocht niet helpen..

    Het lijkt wel of geen enkele php op mage niveau een resultaat oplevert.

    Wil uw oplossing toepassen, wilt u mij op weg helpen.

    Alvast dank,

    1. Weet iemand al hoe dit op te lossen? Ik ben nu bezig, ik had wijzigingen aangebracht, maar die hadden geen effect. Opeens na een maand werken de wijzigingen, maar zijn niet helemaal goed. Dus nu heb ik de waarde terug verandert, maar nu gebeurt er weer niks.
      Het lijkt alsof magento dit ergens cachet, waar wij het niet weten. De var folder heb ik meerdere malen helemaal leeg gegooid ook heb de APC uitgezet. Iemand anders nog ideeën?

    1. Hallo heer Bas,

      $this->insertFooter($page, $invoice->getStore());

      $this->_afterGetPdf();

      return $pdf;
      }

      Hier gaat iets mis met een } ??

      Wil nog steeds niet, helaas…

      1. Ik loop tegen het zelfde probleem aan als Dennis – In de creditnota werkt het perfect maar ik krijg hem niet aan de praat op de invoice. Ik heb zowel Abstract.php als Invoice.php vervangen met de versie die hier te downloaden is.
        Kan deze aanpassing erg goed gebruiken dus elke vorm van advies is van harte welkom.

        bvd

  2. in credit memo.php line 99 $this->insertFooter($page, $creditmemo->getStore());

    $this->_afterGetPdf();

    if ($creditmemo->getStoreId()) {
    Mage::app()->getLocale()->revert();
    }
    return $pdf;
    }

  3. Hallo Bas,

    Wil je wat specificer zijn met het plaasten van deze codes. Ik krijg ook foutmeldingen. Ik heb alles al geprobeerd.

    Met vriendelijke groet,
    Stefan

    1. Remco je bent top! Werkt perfect! Ziet er goed uit, alleen mis ik nog 1 klein dingetje en dan voldoet hij aan alles en dat is de factuurdatum.

      Maar in iedergeval super bedankt voor je hulp!

  4. Hoi Remco,
    werkt super :) alleen hoe krijg ik de footer ook werkend in de creditfactuur? ik heb de code daar ook geprobeerd in te plaatsen maar dan werkt de creditfactuur niet meer.
    Zou je daar misschien ook een voorbeeld bestandje van willen plaatsen?

  5. Ik heb de bestanden uit de dowloadbare map in locale gezet.
    Invoice werkt, de credit werkt, maar ik krijg foutbelding bij verzending….

    Fatal error: Call to a member function getMethodInstance() on a non-object in app/code/core/Mage/Payment/Helper/Data.php on line 119

    Wat gaat er mis.
    Als ik de map locale leeg maak, en de standaard layout gebruik doet verzending het wel en krijg ik de dus de pakbon. Helaas lukt dit niet met de layout uit de map die ik van uw site heb.

    Heeft een u een mogelijke oorzaak hier voor? Ik gebruik versie 1.5.0

    1. Excuses voor de late reactie, ik heb helaas geen oorzaak voor deze foutmelding. Magento is een vrij complex systeem en een dergelijke melding kan door van alles veroorzaakt worden. Mocht je het probleem niet kunnen oplossen dan is wellicht verstandig om een Magento expert in te huren.

      1. Het bericht is al oud maar voor de nieuwe bezoeker is hier vermoedelijk de oplossing.

        Wij hadden hetzelfde probleem in Magento 1.6 maar hebben dit opgelost.

        Voor de invoice zoals Remco dat aangeeft moet je inderdaad gebruiken:

        $this->insertFooter($page, $invoice->getStore());

        Maar voor de pakbon (Shipment.php) moet je het volgende gebruiken

        $this->insertFooter($page, $shipment->getStore());

        Oftewel $invoice moet zijn $shipment

  6. Beste Remco,

    Bij ons is de factuur al in goede orde maar we zouden puur en alleen de witruimte aan de bovenzijde groter willen maken zodat de tekst lager op de pagina komt te staan. Is dit een makkelijke aanpassing?

    Alvast dank voor de hulp.

    Richard

    1. Hallo Richard,

      Een margin aanpassen kan al vrij lastig zijn, omdat vaak de positie van allerlei elementen opnieuw gedefinieerd moet worden. Facturen worden vrij statisch opgebouwd, waardoor veel zaken op pixel niveau zijn ingesteld. Dit is ook eenvoudig terug te zien in de code die hier verantwoordelijk voor is:

      http://svn.magentocommerce.com/source/branches/1.6/app/code/core/Mage/Sales/Model/Order/Pdf/Abstract.php

      Het aanpassen van getallen is echter niet het meest ingewikkelde, dus waarschijnlijk zijn er wel Magento experts die dit relatief goedkoop kunnen aanpassen.

  7. Ik werk met Versie 1.6.2. en heb de extensie werkend.
    Ik heb geprobeerd om de tekst ‘%s is onderdeel van Pronamic’ op basis van de vertaling te wijzigen (NL en US), maar de vertaling lukt niet binnen de protected function insertFooter(&$page, $store = null).

    Test case: Als ik de bekende code
    $page->drawText(Mage::helper(‘sales’)->__(‘Payment Method’), $startX, $startY, ‘UTF-8′);
    $startY = $startY – $lineY;
    uit de bestaande protected function insertOrder(&$page, $order, $putOrderId = true) gebruik in de bovenstaande protected function insertFooter(&$page, $store = null), wordt alleen de NL vertaling weergegeven in de Engelse facturen, terwijl alle andere items (uiteraard) wel correct in het Engels zijn vertaald.
    Vertaling staat in de C:\xampp\htdocs\esprase\app\locale\\Mage_Sales.csv

    Waar zit de missing link: Hoe krijg ik de tekst binnen protected function insertFooter(&$page, $store = null) vertaald o.b.v. de CSV bestanden?

  8. Ik ben op zoek naar Hoe ik in 1.7.2 de pdf factuur kan veranderen. Maar dan zoek ik alleen hoe ik ‘sold to’ en ship to weer in het nederlands krijg. op een 1 of andere manier lukt dat niet? Denken we te ingewikkeld of is het ingewikkeld? en het zwarte vak hoeft van mij ook niet… weet iemand daar een simpele oplossing voor?
    nou vast bedankt:-)

    Femke van Natuurmake-up

    1. Weet niet of je dit al gevonden hebt, maar voor ieder die het ooit zoekt….

      Uit deze blog overgenomen
      http://magentoportico.com/blog/user-interface-design/change-the-language-in-magento-pdf/

      Step 1: Navigate to app\code\core\Mage\Sales\Model\Order\Pdf and then copy Abstract.php, Creditmemo.php, Invoice.php, and Shipment.php files to app\code\local\Mage\Sales\Model\Order\pdf.

      en pas dan hardcoded Ship To aan op regel 340.

      Misschien niet de mooiste oplossing maar goed het werkt.

  9. Hallo,

    Ik zou ook graag het e-mail adres van de klant op de pdf pakbonnen willen hebben, maar weet niet hoe ik deze kan oproepen. Nu staat het er zo, i.p.v. de fax wil ik het e-mail adres van de klant

    {{depend prefix}}{{var prefix}} {{/depend}}{{var firstname}} {{depend middlename}}{{var middlename}} {{/depend}}{{var lastname}}{{depend suffix}} {{var suffix}}{{/depend}}|
    {{depend company}}{{var company}}|{{/depend}}
    {{if street1}}{{var street1}}
    {{/if}}
    {{depend street2}}{{var street2}}|{{/depend}}
    {{depend street3}}{{var street3}}|{{/depend}}
    {{depend street4}}{{var street4}}|{{/depend}}
    {{if city}}{{var city}}, {{/if}}{{if region}}{{var region}}, {{/if}}{{if postcode}}{{var postcode}}{{/if}}|
    {{var country}}|
    {{depend telephone}}T: {{var telephone}}{{/depend}}|
    {{depend fax}}F: {{var fax}}{{/depend}}|

  10. Hallo, zou je een preview kunnen uploaden, hoe het werkelijke factuur document er uit ziet?
    Ik ben erg benieuwd en lijkt me denk ik wel leuk om me hier in te verdiepen.

    Regards,

    Amee de Groen-Donovan

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Verplichte velden zijn gemarkeerd met *

De volgende HTML tags en attributen zijn toegestaan: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>