. */ /** * An extension of FPDF to generate personalized correspondence PDFs */ class correspondence extends FPDF { /** * @var $contact Holds the contact this correspondence will be sent to * @var $language Holds the language this correspondence should be sent in */ var $contact, $language; /** * If you'd want, you could change these constants to encode an RGB colour for headings in your PDFs */ const HEAD_RED = 0; const HEAD_GREEN = 0; const HEAD_BLUE = 0; /** * Array holding the translations * * @see _() A function to translate */ protected static $translations = array( 'adres' => array( 'en' => 'Address', 'nl' => 'Adres'), 'amount' => array( 'en' => 'Amount', 'nl' => 'Subtotaal'), 'amount-due' => array( 'en' => 'Total amount due', 'nl' => 'Te voldoen'), 'biccode' => array( 'en' => 'The BIC code of our bank is %%.', 'nl' => 'De BIC-code van de bank is %%.'), 'btwnr' => array( 'en' => 'VAT nr', 'nl' => 'BTW nr'), 'description' => array( 'en' => 'Description', 'nl' => 'Omschrijving'), 'due-date' => array( 'en' => 'Due date', 'nl' => 'Vervaldatum'), 'email' => array( 'en' => 'Email', 'nl' => 'Email'), 'iban' => array( 'en' => 'IBAN', 'nl' => 'IBAN'), 'invoice' => array( 'en' => 'Invoice', 'nl' => 'Factuur'), 'invoice-date' => array( 'en' => 'Invoice date', 'nl' => 'Factuurdatum'), 'invoice-nr' => array( 'en' => 'Invoice number', 'nl' => 'Factuurnummer'), 'price-excl' => array( 'en' => 'Price excl.', 'nl' => 'Prijs excl.'), 'price-incl' => array( 'en' => 'Price incl.', 'nl' => 'Prijs incl.'), 'request' => array( 'en' => 'You are kindly requested to transfer the total amount before the due date to the provided IBAN nr.', 'nl' => 'U wordt vriendelijk verzocht het te voldoen bedrag voor de vervaldatum van de factuur over te maken naar opgegeven IBAN-nummer.'), 'tel-nr' => array( 'en' => 'Tel.', 'nl' => 'Tel.'), 'total' => array( 'en' => 'Total', 'nl' => 'Totaal'), 'vat' => array( 'en' => 'VAT', 'nl' => 'BTW'), ); /** * @var $page_height The height of a page in millimeters * @var $margin_bottom The bottom margin in millimeters */ protected static $page_height = 297; // A4 protected static $margin_bottom = 30; /** * Translate a string * * @see $translations The array holding the translations * * @param string $key The string to translate * @param string $lang The language to translate to (two-letter code) * * @return string The translated string */ public function _($key) { if (!array_key_exists($key, self::$translations)) return $key; return self::$translations[$key][$this->language]; } /** * Create a new PDF * * @param string $orientation See the FPDF class specs * @param string $unit See the FPDF class specs * @param string $size See the FPDF class specs */ function __construct() { $this->FPDF('P','mm','A4'); $this->SetMargins(30,20,20); $this->SetAuthor(constants::invoice_name); $this->SetCreator('BusinessAdmin Correspondence Generator'); $this->SetDisplayMode('fullpage','continuous'); } /** * Workaround for euro signs * * Euro signs in FPDF should be chr(128). Other signs don't have to be changed. * * @return a valuta symbol that can be used in FPDF */ public static function valuta() { switch (constants::invoice_valuta) { case '€': return chr(128); default: return constants::invoice_valuta; } } /** * Set the language of the correspondence (used to translate stuff) * * @param string $lang The language, two letter code ('en', 'nl', ...) */ function SetLangauge($lang) { $supported = array('nl', 'en'); if (!in_array($lang, $supported)) { throw new Exception("Language not supported"); } else { $this->language = $lang; } } /** * Set the contact to whom this correspondence will be sent (used for the address) * * @param contact $contact The contact */ function SetContact($contact) { $this->contact = $contact; $this->language = $contact->getLanguage(); } /** * Makes a header with your details and the address of the contact */ function CorrespondenceHeader() { if (file_exists(constants::files_folder . 'logo-correspondence.png')) { $this->Image(constants::files_folder . 'logo-correspondence.png',30,20,50); } $this->SetFont('Helvetica','',7); $this->Cell(110,20); $this->Cell(12,1,' ','T'); $this->Cell(2,1); $this->Cell(35,1,' ','T'); $this->Ln(); $this->Cell(110,3.5); $this->SetFont('','B'); $this->Cell(12,3.5,$this->_('adres'),'',0,'R'); $this->Cell(2,3.5); $this->SetFont('',''); $this->Cell(35,3.5, constants::invoice_name); $this->Ln(); $this->Cell(124,3.5); $this->Cell(35,3.5, constants::invoice_address_1); $this->Ln(); $this->Cell(124,3.5); $this->Cell(35,3.5, constants::invoice_address_2); $this->Ln(); $this->Cell(124,3.5); $this->Cell(35,3.5, constants::invoice_address_3); $this->Ln(); $this->Cell(160,1.5); $this->Ln(); $this->Cell(110,3.5); $this->SetFont('','B'); $this->Cell(12,3.5,$this->_('btwnr'),'',0,'R'); $this->Cell(2,3.5); $this->SetFont('',''); $this->Cell(35,3.5, constants::invoice_tax_nr); $this->Ln(); $this->Cell(160,1.5); $this->Ln(); $this->Cell(110,3.5); $this->SetFont('','B'); $this->Cell(12,3.5, $this->_('iban'),'',0,'R'); $this->Cell(2,3.5); $this->SetFont('',''); $this->Cell(35,3.5, constants::invoice_iban); $this->Ln(); $this->Cell(160,1.5); $this->Ln(); $this->Cell(110,3.5); $this->SetFont('','B'); $this->Cell(12,3.5, $this->_('tel-nr'),'',0,'R'); $this->Cell(2,3.5); $this->SetFont('','',7); $this->Cell(35,3.5, constants::invoice_tel_nr); $this->Ln(); $this->Cell(110,3.5); $this->SetFont('','B'); $this->Cell(12,3.5, $this->_('email'),'',0,'R'); $this->Cell(2,3.5); $this->SetFont('',''); $this->Cell(35,3.5, constants::invoice_email); $this->Ln(); $this->Cell(110,1); $this->Cell(12,1,' ','B'); $this->Cell(2,1); $this->Cell(35,1,' ','B'); $this->Ln(); $this->Cell(160,15); $this->Ln(); $this->SetFont('','',11); $this->SetXY(30,56.5); $this->Cell(90,5.5,utf8_decode($this->contact->getName())); $this->Ln(); $this->SetXY(30,61.5); $this->Cell(90,5.5,utf8_decode($this->contact->getAddress())); $this->Ln(); $this->SetXY(30,66.5); $this->Cell(90,5.5,utf8_decode($this->contact->getPostalCode().' '.$this->contact->getCity())); $this->Ln(); $this->SetXY(30,71.5); $this->Cell(90,5.5,utf8_decode($this->contact->getCountry())); $this->Ln(); } /** * Put PDF information */ function _putinfo() { $this->_out('/Producer '.$this->_textstring('BusinessAdmin Correspondence Generator')); if(!empty($this->title)) $this->_out('/Title '.$this->_textstring($this->title)); if(!empty($this->subject)) $this->_out('/Subject '.$this->_textstring($this->subject)); if(!empty($this->author)) $this->_out('/Author '.$this->_textstring($this->author)); if(!empty($this->keywords)) $this->_out('/Keywords '.$this->_textstring($this->keywords)); if(!empty($this->creator)) $this->_out('/Creator '.$this->_textstring($this->creator)); $this->_out('/CreationDate '.$this->_textstring('D:'.@date('YmdHis'))); } /** * Have we reached the bottom of the page yet? * * @return bool */ public function endOfPage() { return ($this->GetY() > self::$page_height - self::$margin_bottom); } /** * Start a new page if we're on the end */ public function addPageIfOnEnd() { if ($this->endOfPage()) { $this->Ln(); $this->AddPage(); $this->Cell(100, 5, ''); // blank line $this->Ln(); } } }