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
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
andinvlib/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:
<ul id="items"><?php
foreach ($this->items as $i) { echo "<li>{$i[0]}</li>"; }
?></ul>
Then, create the CSS file “as usual”:
#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.
$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.
$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.
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
See “INSTALLATION & REQUIREMENTS” above – Just download from Github and study
example.php
?heyy anyone can me send a link to how to setup it please
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!
https://code-boxx.com/export-mysql-csv-php/
how i understand pdf generator only works on php 8.0+ versions :/
If you are complaining about “no backward compatibility” – Time to move on, PHP 7 is coming to its end of life in just a few days.
https://www.php.net/supported-versions.php
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;
How to make it work – Study
(B5) ADD ONE-BY-ONE
and(B6) SET ALL AT ONCE
VERY CAREFULLY.$invoicr->set("items", NESTED ARRAY);
Cool, nested array is indeed the “trick”
I am very pleased with this invoice generator, great work