Invoicr – Open Source PHP Invoice Generator (HTML, PDF, DOCX, PNG)

Invoicr is a free and open-source PHP invoice generator that is capable of churning out HTML, PDF, DOCX, and PNG invoices. It is a simple fuss-free package that will give developers a quick boost with their invoice generation needs.

 

TABLE OF CONTENTS

 

 

DOWNLOAD & NOTES

First, here are the download links and a quick “setup guide” for the impatient folks who don’t have the patience to read through everything.

 

LICENSE & DOWNLOAD

GitHub | SourceForge

Invoicr is released under the MIT License. You are free to use it for personal and commercial projects, modify it as you see fit. On the condition that the software is provided “as-is”. There are no warranties provided and “no strings attached”. Code Boxx and the authors are not liable for any claims, damages, or liabilities.

 

INSTALLATION & REQUIREMENTS

There is no “installation”, only a small hassle:

  • Open invlib/invoicr.php, change (C1) company information to your own.
  • That’s all – See example.php for a quick start.
  • MPDF requires GD extension to work properly.

 

 

THE INVOICE TEMPLATES

 

CREDITS & LIBRARIES USED

Invoicr is made possible with the following open-source projects:

  • MPDF for generating the PDF invoices.
  • PHPWord for generating the DOCX invoices.
  • HTML2CANVAS for the PNG invoices (screenshot HTML and save as PNG).

 

HOW TO USE

So far so good? Let us now go through a quick crash course on how to use Invoicr.

 

STEP 1) LOAD INVOICR LIBRARY

// (A) LOAD INVOICR
require "invlib/invoicr.php";

Start by including the invlib/invoicr.php library in your own project. This will automatically create a $invoicr object.

 

STEP 2) FEED INVOICE INFORMATION

// (B) SET INVOICE DATA
// (B1) COMPANY INFORMATION
/* RECOMMENDED TO JUST PERMANENTLY CODE INTO INVLIB/INVOICR.PHP > (C1)
$invoicr->set("company", [
  "http://localhost/code-boxx-logo.png",
  "D:/http/code-boxx-logo.png", 
  "Code Boxx", 
  "Street Address, City, State, Zip",
  "Phone: xxx-xxx-xxx | Fax: xxx-xxx-xxx",
  "https://code-boxx.com",
  "doge@code-boxx.com"
]); */

// (B2) INVOICE HEADER
$invoicr->set("head", [
  ["Invoice #", "CB-123-456"],
  ["DOP", "2011-11-11"],
  ["P.O. #", "CB-789-123"],
  ["Due Date", "2011-12-12"]
]);

// (B3) BILL TO
$invoicr->set("billto", [
  "Customer Name",
  "Street Address", 
  "City, State, Zip"
]);

// (B4) SHIP TO
$invoicr->set("shipto", [
  "Customer Name",
  "Street Address", 
  "City, State, Zip"
]);

// (B5) ITEMS - ADD ONE-BY-ONE
$items = [
  ["Rubber Hose", "5m long rubber hose", 3, "$5.50", "$16.50"],
  ["Rubber Duck", "Good bathtub companion", 8, "$4.20", "$33.60"],
  ["Rubber Band", "", 10, "$0.10", "$1.00"],
  ["Rubber Stamp", "", 3, "$12.30", "$36.90"],
  ["Rubber Shoe", "For slipping, not for running", 1, "$20.00", "$20.00"]
];
// foreach ($items as $i) { $invoicr->add("items", $i); }

// (B6) ITEMS - OR SET ALL AT ONCE
$invoicr->set("items", $items);

// (B7) TOTALS
$invoicr->set("totals", [
  ["SUB-TOTAL", "$108.00"],
  ["DISCOUNT 10%", "-$10.80"],
  ["GRAND TOTAL", "$97.20"]
]);

// (B8) NOTES, IF ANY
$invoicr->set("notes", [
  "Cheques should be made payable to Code Boxx",
  "Get a 10% off with the next purchase with discount code DOGE1234!"
]);

This is probably the most “complicated” step, you need to use $invoicr->set() or $invoicr->add() to feed Invoicr with information:

  • Company logo, name, address, contact.
  • Invoice information.
  • Bill to.
  • Ship to.
  • The items.
  • Totals.
  • Notes, if any.

 

 

STEP 3) CHOOSE A TEMPLATE & OUTPUT THE INVOICE

// (C) OUTPUT
// (C1) CHOOSE A TEMPLATE
$invoicr->template("apple");
// $invoicr->template("banana");
// $invoicr->template("blueberry");
// $invoicr->template("lime");
// $invoicr->template("simple");
// $invoicr->template("strawberry");

// (C2) OUTPUT IN HTML
// DEFAULT : DISPLAY IN BROWSER 
// 1 : DISPLAY IN BROWSER 
// 2 : FORCE DOWNLOAD 
// 3 : SAVE ON SERVER
// 4 : DISPLAY IN BROWSER & SAVE AS PNG
$invoicr->outputHTML();
// $invoicr->outputHTML(1);
// $invoicr->outputHTML(2, "invoice.html");
// $invoicr->outputHTML(3, __DIR__ . DIRECTORY_SEPARATOR . "invoice.html");
// $invoicr->outputHTML(4, "invoice.png");

// (C3) OUTPUT IN PDF
// DEFAULT : DISPLAY IN BROWSER 
// 1 : DISPLAY IN BROWSER 
// 2 : FORCE DOWNLOAD 
// 3 : SAVE ON SERVER
// $invoicr->outputPDF();
// $invoicr->outputPDF(1);
// $invoicr->outputPDF(2, "invoice.pdf");
// $invoicr->outputPDF(3, __DIR__ . DIRECTORY_SEPARATOR . "invoice.pdf");

// (C4) OUTPUT IN DOCX
// DEFAULT : FORCE DOWNLOAD
// 1 : FORCE DOWNLOAD 
// 2 : SAVE ON SERVER
// $invoicr->outputDOCX();
// $invoicr->outputDOCX(1, "invoice.docx");
// $invoicr->outputDOCX(2, __DIR__ . DIRECTORY_SEPARATOR . "invoice.docx");

Finally, choose a template to use and output the invoice.

 

 

CUSTOM TEMPLATE

Want to build your own customized theme? It is actually pretty easy to do so… If you are unsure at any point, feel free to use the “default” simple.php template files as a reference.

 

STEP 1) CREATE AN EMPTY PHP FILE

Start by creating a new PHP file in the respective template folder. For example, if we want to add a new “durian” template:

  • For DOCX template – invlib/DOCX/durian.php.
  • For PDF template – invlib/PDF/durian.php.
  • For HTML template – invlib/HTML/durian.css and invlib/HTML/durian.php.

 

STEP 2) BUILD THE TEMPLATE

2A) ACCESSING INVOICE INFORMATION

In the template file, we can access the various invoice information previously set with $invoicr->set() or $invoicr->add().

  • $this->company – Company logo, name, address, contact.
  • $this->head- Invoice information.
  • $this->billto – Bill to.
  • $this->shipto – Ship to.
  • $this->items – The items.
  • $this->totals – Totals.
  • $this->notes – Notes, if any.

 

2B) HTML TEMPLATES

To create an HTML template, simply insert the above information into the HTML. For example, to create the list of items:

invlib/HTML/durian.php
<ul id="items"><?php
  foreach ($this->items as $i) { echo "<li>{$i[0]}</li>"; }
?></ul>

Then, create the CSS file “as usual”:

invlib/HTML/durian.css
#items li { background: #eee; }
#items li:nth-child(odd) { background: #f2f2f2; }

 

 

2C) PDF TEMPLATES

PDF generation is handled by MPDF, and it is capable of taking in HTML to generate PDF.

invlib/PDF/durian.php
$this->data = "<ul>";
foreach ($this->items as $i) { $this->data .= "<li>". $i[0] ."</li>"; }
$this->data .= "</ul>";
$mpdf->WriteHTML($this->data);

Check out the official MPDF documentation if you need more information.

 

2D) DOCX TEMPLATES

PHPWord handles the DOCX generation, and it is the “unfriendliest” to work with… Just read through the official PHPWord documentation for more information.

invlib/DOCX/durian.php
$section = $pw->addSection();
$table = $section->addTable($tableStyle);
foreach ($this->items as $i) {
  $table->addRow();
  $cell = $table->addCell(2000, $style);
  $cell->addText($i[0]);
}

 

INVOICR FAQ

Lastly, here are a few common questions that I foresee people asking.

 

PNG GENERATION IS “NOT WORKING”

  • Edit invlib/invoicr.php, change (G2) and use absolute URL for the html2canvas library – <script src="https://your-site.com/invlib/html2canvas.js"></script>.
  • Alternatively, just load it from CDNJS.
  • As you can see, we are pretty much just taking a screenshot of the HTML invoice, creating an <a download="INVOICE.PNG"> link, and click on it.
  • This may not always work, depending on the browser and/or anti-virus. The safer way is to attach the <a> link to the page, and manually click on it.

 

SAVE PNG TO THE SERVER

Edit invlib/invoicr.php, change (G2) to upload the PNG to the server.

window.onload = () => html2canvas(document.getElementById("invoice")).then(canvas => {
  // (A) CANVAS TO FORM DATA
  var data = new FormData();
  data.append("img", canvas.toDataURL("image/png"));
 
  // (B) UPLOAD TO SERVER
  fetch("SERVER-SAVE.PHP", { method:"post", body:data })
  .then(res => res.text())
  .then(txt => console.log(txt))
  .catch(err => console.error(err));
});

Then, save the uploaded PNG on the server.

<?php
$file = fopen("INVOICE.PNG", "w");
$data = explode(",", $_POST["img"]);
$data = base64_decode($data[1]);
fwrite($file, $data);
fclose($file);

 

 

CAN’T PHP DIRECTLY GENERATE A PNG!?

  • Yes, if someone is crazy enough to create an “HTML to PNG” PHP library.
  • That will mean “a PHP image library that is capable of reading and rendering HTML/CSS”.
  • If you cannot find such a library, we are all stuck with using the browser to render the HTML/CSS.

10 thoughts on “Invoicr – Open Source PHP Invoice Generator (HTML, PDF, DOCX, PNG)”

  1. heyy help
    how to use it
    can i use it on php xamppp server or how
    can u give me full installation guide i need thiss pls

    1. See “INSTALLATION & REQUIREMENTS” above – Just download from Github and study example.php?

  2. Hi do you have an example of PDO reading a table for the customer details or product table for the items to bill for instead of hard coding the info in your example.php?

    Any pointers would be great!

  3. i only get the first letter/digit when i put an array of items in $items, what can i do to make this work?

    $items = $arrayofitems;

    1. How to make it work – Study (B5) ADD ONE-BY-ONE and (B6) SET ALL AT ONCE VERY CAREFULLY. $invoicr->set("items", NESTED ARRAY);

    2. Cool, nested array is indeed the “trick”

      I am very pleased with this invoice generator, great work

Leave a Comment

Your email address will not be published. Required fields are marked *