{"id":5987,"date":"2025-12-22T05:32:07","date_gmt":"2025-12-22T05:32:07","guid":{"rendered":"https:\/\/www.codexworld.com\/?p=5987"},"modified":"2026-01-16T14:47:34","modified_gmt":"2026-01-16T14:47:34","slug":"generate-invoice-pdf-with-php-ajax","status":"publish","type":"post","link":"https:\/\/www.codexworld.com\/generate-invoice-pdf-with-php-ajax\/","title":{"rendered":"Generate Invoice PDF with PHP &#038; AJAX"},"content":{"rendered":"<p>Generate a professional invoice PDF directly from a dynamic web form using PHP, Dompdf, and AJAX for seamless downloads without page reloads. This tutorial leverages your attached scripts for a production-ready implementation with CSRF protection, logo uploads, and real-time calculations.<\/p>\n<p>This tutorial explains how to generate a professional Invoice PDF using PHP and AJAX without page reload. The invoice is created dynamically from a web form, supports multiple line items, tax calculation, optional logo upload, and automatically downloads the generated PDF. Let&#8217;s dive into the implementation of the invoice PDF generator using PHP and AJAX!<\/p>\n<h2>\ud83d\udd25 What You&#8217;ll Build<\/h2>\n<ul>\n<li>Dynamic invoice creation form (add\/remove items)<\/li>\n<li>Real-time subtotal, tax, and total calculation<\/li>\n<li>Logo upload with preview (PNG\/JPG\/GIF)<\/li>\n<li>AJAX-based PDF generation (no page reload)<\/li>\n<li>Automatic PDF download<\/li>\n<li>Secure &#038; optimized PHP backend<\/li>\n<\/ul>\n<h2>\ud83d\udccb Prerequisites<\/h2>\n<p>Install Dompdf via Composer by running (in your project root):<\/p>\n<pre>composer require dompdf\/dompdf<\/pre>\n<p><u>Note that: You don&#8217;t need to download the Dompdf library separately, all the required library files are included in our source code package.<\/u><\/p>\n<h2>\ud83d\udcc1 Project Structure<\/h2>\n<p>Organize files as follows for clean deployment:<\/p>\n<pre class=\"file-struc\">generate_invoice_pdf<span style=\"color:#794938\">\/<\/span>\r\n\u251c\u2500\u2500 index.php\r\n\u251c\u2500\u2500 generate_pdf.php\r\n\u251c\u2500\u2500 assets<span style=\"color:#794938\">\/<\/span>\r\n\u2502   \u251c\u2500\u2500 css<span style=\"color:#794938\">\/<\/span>\r\n\u2502   \u2502   \u2514\u2500\u2500 style.css\r\n\u2502   \u2514\u2500\u2500 js<span style=\"color:#794938\">\/<\/span>\r\n\u2502       \u2514\u2500\u2500 app.js\r\n\u2514\u2500\u2500 vendor<span style=\"color:#794938\">\/<\/span>\r\n    \u2514\u2500\u2500 autoload.php\r\n<\/pre>\n<h2>\ud83d\udcbb Code Overview<\/h2>\n<ul>\n<li><strong>index.php<\/strong>: Main HTML form for invoice input and JavaScript for AJAX handling.<\/li>\n<li><strong>generate_pdf.php<\/strong>: PHP script that processes form data, generates the PDF using Dompdf, and returns it for download.<\/li>\n<li><strong>assets\/js\/app.js<\/strong>: JavaScript for dynamic form behavior and AJAX submission.<\/li>\n<li><strong>assets\/css\/style.css<\/strong>: Basic styling for the form.<\/li>\n<\/ul>\n<h2>\ud83d\ude80 Implementation Steps<\/h2>\n<ol>\n<li><strong>Setup HTML Form (index.php)<\/strong>: Create a form with fields for customer details, invoice items, tax rate, and logo upload. Include buttons to add\/remove items dynamically.<\/li>\n<li><strong>JavaScript for Dynamic Behavior (assets\/js\/app.js)<\/strong>: Write JS to handle adding\/removing invoice items, calculating totals in real-time, and submitting the form via AJAX.<\/li>\n<li><strong>PHP Backend (generate_pdf.php)<\/strong>: Implement PHP to validate input, process the logo upload, generate the invoice HTML, and convert it to PDF using Dompdf.<\/li>\n<li><strong>AJAX Submission<\/strong>: Use AJAX to send form data to the PHP script and handle the PDF download without reloading the page.<\/li>\n<li><strong>Testing<\/strong>: Test the entire flow to ensure the invoice is generated correctly and downloads as expected.<\/li>\n<\/ol>\n<h2>Create the Invoice Form (index.php)<\/h2>\n<p>Create a file named <code>index.php<\/code> and define HTML elements to build an invoice form with organized sections for customer\/seller details, dynamic items table, tax summary, and notes. The invoice form collects:<\/p>\n<ul>\n<li>Company &#038; client details (including full addresses)<\/li>\n<li>Invoice number &#038; dates<\/li>\n<li>Multiple invoice items<\/li>\n<li>Tax percentage<\/li>\n<li>Optional business logo upload (PNG\/JPG\/GIF, <2MB)<\/li>\n<\/ul>\n<p>At the beginning, start a PHP session and generate a CSRF token for security.<\/p>\n<pre><span style=\"color: #0000BB\">&lt;?php <br \/><\/span><span style=\"color: #FF8000\">\/\/&nbsp;Start&nbsp;session <br \/><\/span><span style=\"color: #0000BB\">session_start<\/span><span style=\"color: #007700\">(); <br \/> <br \/><\/span><span style=\"color: #FF8000\">\/\/&nbsp;Generate&nbsp;CSRF&nbsp;token <br \/><\/span><span style=\"color: #007700\">if&nbsp;(empty(<\/span><span style=\"color: #0000BB\">$_SESSION<\/span><span style=\"color: #007700\">[<\/span><span style=\"color: #DD0000\">'csrf_token'<\/span><span style=\"color: #007700\">]))&nbsp;{ <br \/>&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span style=\"color: #0000BB\">$_SESSION<\/span><span style=\"color: #007700\">[<\/span><span style=\"color: #DD0000\">'csrf_token'<\/span><span style=\"color: #007700\">]&nbsp;=&nbsp;<\/span><span style=\"color: #0000BB\">bin2hex<\/span><span style=\"color: #007700\">(<\/span><span style=\"color: #0000BB\">random_bytes<\/span><span style=\"color: #007700\">(<\/span><span style=\"color: #0000BB\">32<\/span><span style=\"color: #007700\">)); <br \/>} <br \/><\/span><span style=\"color: #0000BB\">$csrf&nbsp;<\/span><span style=\"color: #007700\">=&nbsp;<\/span><span style=\"color: #0000BB\">$_SESSION<\/span><span style=\"color: #007700\">[<\/span><span style=\"color: #DD0000\">'csrf_token'<\/span><span style=\"color: #007700\">]; <br \/><\/span><span style=\"color: #0000BB\">?&gt;<\/span>\r\n\r\n<span style=\"color: rgb(95, 94, 78);\"><span style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">form<\/span> <span class=\"hljs-attr\">id<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"invoice-form\"<\/span> <span class=\"hljs-attr\">enctype<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"multipart\/form-data\"<\/span> <span class=\"hljs-attr\">novalidate<\/span>&gt;<\/span>\r\n    <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">input<\/span> <span class=\"hljs-attr\">type<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"hidden\"<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"csrf_token\"<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"&lt;?= htmlspecialchars($csrf) ?&gt;\"<\/span>&gt;<\/span>\r\n\r\n    <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">section<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"cols\"<\/span>&gt;<\/span>\r\n        <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">div<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"card\"<\/span>&gt;<\/span>\r\n            <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">h2<\/span>&gt;<\/span>Customer Information<span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;\/<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">h2<\/span>&gt;<\/span>\r\n            <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">div<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"row\"<\/span>&gt;<\/span>\r\n                <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">input<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"customer_first\"<\/span> <span class=\"hljs-attr\">placeholder<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"First name\"<\/span> <span class=\"hljs-attr\">required<\/span>&gt;<\/span>\r\n            <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;\/<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">div<\/span>&gt;<\/span>\r\n            <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">div<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"row\"<\/span>&gt;<\/span>\r\n                <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">input<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"customer_last\"<\/span> <span class=\"hljs-attr\">placeholder<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"Last name\"<\/span> <span class=\"hljs-attr\">required<\/span>&gt;<\/span>\r\n            <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;\/<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">div<\/span>&gt;<\/span>\r\n            <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">div<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"row\"<\/span>&gt;<\/span>\r\n                <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">input<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"customer_business\"<\/span> <span class=\"hljs-attr\">placeholder<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"Business name\"<\/span>&gt;<\/span>\r\n            <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;\/<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">div<\/span>&gt;<\/span>\r\n            <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">div<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"row\"<\/span>&gt;<\/span>\r\n                <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">input<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"customer_phone\"<\/span> <span class=\"hljs-attr\">placeholder<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"Phone\"<\/span>&gt;<\/span>\r\n            <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;\/<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">div<\/span>&gt;<\/span>\r\n            <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">div<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"row\"<\/span>&gt;<\/span>\r\n                <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">input<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"customer_address\"<\/span> <span class=\"hljs-attr\">placeholder<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"Address\"<\/span>&gt;<\/span>\r\n            <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;\/<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">div<\/span>&gt;<\/span>\r\n            <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">div<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"row\"<\/span>&gt;<\/span>\r\n                <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">input<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"customer_city\"<\/span> <span class=\"hljs-attr\">placeholder<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"City\"<\/span>&gt;<\/span>\r\n            <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;\/<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">div<\/span>&gt;<\/span>\r\n            <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">div<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"row\"<\/span>&gt;<\/span>\r\n                <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">input<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"customer_state\"<\/span> <span class=\"hljs-attr\">placeholder<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"State\"<\/span>&gt;<\/span>\r\n            <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;\/<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">div<\/span>&gt;<\/span>\r\n            <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">div<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"row\"<\/span>&gt;<\/span>\r\n                <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">input<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"customer_zip\"<\/span> <span class=\"hljs-attr\">placeholder<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"Zip Code\"<\/span>&gt;<\/span>\r\n            <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;\/<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">div<\/span>&gt;<\/span>\r\n            <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">div<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"row\"<\/span>&gt;<\/span>\r\n                <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">input<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"customer_country\"<\/span> <span class=\"hljs-attr\">placeholder<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"Country\"<\/span>&gt;<\/span>\r\n            <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;\/<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">div<\/span>&gt;<\/span>\r\n        <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;\/<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">div<\/span>&gt;<\/span>\r\n\r\n        <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">div<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"card\"<\/span>&gt;<\/span>\r\n            <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">h2<\/span>&gt;<\/span>Seller Information<span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;\/<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">h2<\/span>&gt;<\/span>\r\n            <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">div<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"row\"<\/span>&gt;<\/span>\r\n                <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">input<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"seller_business\"<\/span> <span class=\"hljs-attr\">placeholder<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"Business name\"<\/span> <span class=\"hljs-attr\">required<\/span>&gt;<\/span>\r\n            <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;\/<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">div<\/span>&gt;<\/span>\r\n            <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">div<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"row\"<\/span>&gt;<\/span>\r\n                <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">input<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"seller_email\"<\/span> <span class=\"hljs-attr\">placeholder<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"Email\"<\/span> <span class=\"hljs-attr\">type<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"email\"<\/span> <span class=\"hljs-attr\">required<\/span>&gt;<\/span>\r\n            <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;\/<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">div<\/span>&gt;<\/span>\r\n            <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">div<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"row\"<\/span>&gt;<\/span>\r\n                <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">input<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"seller_phone\"<\/span> <span class=\"hljs-attr\">placeholder<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"Phone\"<\/span>&gt;<\/span>\r\n            <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;\/<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">div<\/span>&gt;<\/span>\r\n            <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">div<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"row\"<\/span>&gt;<\/span>\r\n                <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">input<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"seller_website\"<\/span> <span class=\"hljs-attr\">placeholder<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"Website\"<\/span>&gt;<\/span>\r\n            <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;\/<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">div<\/span>&gt;<\/span>\r\n            <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">div<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"row\"<\/span>&gt;<\/span>\r\n                <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">input<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"seller_address\"<\/span> <span class=\"hljs-attr\">placeholder<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"Address\"<\/span>&gt;<\/span>\r\n            <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;\/<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">div<\/span>&gt;<\/span>\r\n            <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">div<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"row\"<\/span>&gt;<\/span>\r\n                <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">input<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"seller_city\"<\/span> <span class=\"hljs-attr\">placeholder<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"City\"<\/span>&gt;<\/span>\r\n            <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;\/<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">div<\/span>&gt;<\/span>\r\n            <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">div<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"row\"<\/span>&gt;<\/span>\r\n                <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">input<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"seller_state\"<\/span> <span class=\"hljs-attr\">placeholder<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"State\"<\/span>&gt;<\/span>\r\n            <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;\/<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">div<\/span>&gt;<\/span>\r\n            <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">div<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"row\"<\/span>&gt;<\/span>\r\n                <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">input<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"seller_zip\"<\/span> <span class=\"hljs-attr\">placeholder<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"Zip Code\"<\/span>&gt;<\/span>\r\n            <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;\/<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">div<\/span>&gt;<\/span>\r\n            <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">div<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"row\"<\/span>&gt;<\/span>\r\n                <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">input<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"seller_country\"<\/span> <span class=\"hljs-attr\">placeholder<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"Country\"<\/span>&gt;<\/span>\r\n            <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;\/<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">div<\/span>&gt;<\/span>\r\n            <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">div<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"row logo-row\"<\/span>&gt;<\/span>\r\n                <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">label<\/span>&gt;<\/span>Logo (optional)<span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;\/<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">label<\/span>&gt;<\/span>\r\n                <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">div<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"logo-input-wrap\"<\/span>&gt;<\/span>\r\n                    <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">input<\/span> <span class=\"hljs-attr\">id<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"logo-input\"<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"logo\"<\/span> <span class=\"hljs-attr\">type<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"file\"<\/span> <span class=\"hljs-attr\">accept<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"image\/*\"<\/span>&gt;<\/span>\r\n                    <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">div<\/span> <span class=\"hljs-attr\">id<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"logo-preview\"<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"logo-preview\"<\/span> <span class=\"hljs-attr\">style<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"display:none\"<\/span>&gt;<\/span>\r\n                        <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">img<\/span> <span class=\"hljs-attr\">id<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"logo-preview-img\"<\/span> <span class=\"hljs-attr\">src<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"\"<\/span> <span class=\"hljs-attr\">alt<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"Logo preview\"<\/span>&gt;<\/span>\r\n                        <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">button<\/span> <span class=\"hljs-attr\">type<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"button\"<\/span> <span class=\"hljs-attr\">id<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"remove-logo\"<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"remove-logo\"<\/span>&gt;<\/span>Remove<span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;\/<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">button<\/span>&gt;<\/span>\r\n                    <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;\/<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">div<\/span>&gt;<\/span>\r\n                <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;\/<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">div<\/span>&gt;<\/span>\r\n            <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;\/<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">div<\/span>&gt;<\/span>\r\n        <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;\/<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">div<\/span>&gt;<\/span>\r\n    <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;\/<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">section<\/span>&gt;<\/span>\r\n\r\n    <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">section<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"card\"<\/span>&gt;<\/span>\r\n        <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">h2<\/span>&gt;<\/span>Invoice Details<span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;\/<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">h2<\/span>&gt;<\/span>\r\n        <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">div<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"row field-inline\"<\/span>&gt;<\/span>\r\n            <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">label<\/span>&gt;<\/span>\r\n                Invoice #\r\n                <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">input<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"invoice_number\"<\/span> <span class=\"hljs-attr\">placeholder<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"Invoice #\"<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"&lt;?= htmlspecialchars('INV-001') ?&gt;\"<\/span>&gt;<\/span>\r\n            <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;\/<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">label<\/span>&gt;<\/span>\r\n            <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">label<\/span>&gt;<\/span>\r\n                Invoice Date\r\n                <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">input<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"issue_date\"<\/span> <span class=\"hljs-attr\">type<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"date\"<\/span> <span class=\"hljs-attr\">required<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"&lt;?= date('Y-m-d') ?&gt;\"<\/span>&gt;<\/span>\r\n            <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;\/<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">label<\/span>&gt;<\/span>\r\n            <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">label<\/span>&gt;<\/span>\r\n                Due Date\r\n                <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">input<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"due_date\"<\/span> <span class=\"hljs-attr\">type<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"date\"<\/span> <span class=\"hljs-attr\">required<\/span>&gt;<\/span>\r\n            <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;\/<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">label<\/span>&gt;<\/span>\r\n        <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;\/<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">div<\/span>&gt;<\/span>\r\n    <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;\/<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">section<\/span>&gt;<\/span>\r\n\r\n    <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">section<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"card\"<\/span>&gt;<\/span>\r\n        <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">h2<\/span>&gt;<\/span>Items<span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;\/<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">h2<\/span>&gt;<\/span>\r\n        <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">table<\/span> <span class=\"hljs-attr\">id<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"items-table\"<\/span>&gt;<\/span>\r\n            <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">thead<\/span>&gt;<\/span>\r\n            <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">tr<\/span>&gt;<\/span>\r\n                <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">th<\/span>&gt;<\/span>Item<span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;\/<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">th<\/span>&gt;<\/span>\r\n                <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">th<\/span>&gt;<\/span>Description<span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;\/<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">th<\/span>&gt;<\/span>\r\n                <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">th<\/span>&gt;<\/span>Qty<span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;\/<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">th<\/span>&gt;<\/span>\r\n                <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">th<\/span>&gt;<\/span>Price<span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;\/<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">th<\/span>&gt;<\/span>\r\n                <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">th<\/span>&gt;<\/span><span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;\/<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">th<\/span>&gt;<\/span>\r\n            <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;\/<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">tr<\/span>&gt;<\/span>\r\n            <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;\/<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">thead<\/span>&gt;<\/span>\r\n            <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">tbody<\/span>&gt;<\/span><span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;\/<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">tbody<\/span>&gt;<\/span>\r\n        <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;\/<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">table<\/span>&gt;<\/span>\r\n        <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">button<\/span> <span class=\"hljs-attr\">type<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"button\"<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"btn-info\"<\/span> <span class=\"hljs-attr\">id<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"add-item\"<\/span>&gt;<\/span>+ Add Item<span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;\/<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">button<\/span>&gt;<\/span>\r\n    <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;\/<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">section<\/span>&gt;<\/span>\r\n\r\n    <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">section<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"card\"<\/span>&gt;<\/span>\r\n        <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">div<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"summary\"<\/span>&gt;<\/span>\r\n            <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">div<\/span>&gt;<\/span>\r\n                <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">label<\/span>&gt;<\/span>Tax (%)<span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;\/<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">label<\/span>&gt;<\/span> \r\n                <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">input<\/span> <span class=\"hljs-attr\">id<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"tax\"<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"tax\"<\/span> <span class=\"hljs-attr\">type<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"number\"<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"0\"<\/span> <span class=\"hljs-attr\">min<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"0\"<\/span> <span class=\"hljs-attr\">step<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"0.01\"<\/span>&gt;<\/span>\r\n            <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;\/<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">div<\/span>&gt;<\/span>\r\n            <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">div<\/span>&gt;<\/span>\r\n                <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">label<\/span>&gt;<\/span>Subtotal:<span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;\/<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">label<\/span>&gt;<\/span>\r\n                <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">span<\/span> <span class=\"hljs-attr\">id<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"subtotal\"<\/span>&gt;<\/span>0.00<span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;\/<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">span<\/span>&gt;<\/span>\r\n            <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;\/<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">div<\/span>&gt;<\/span>\r\n            <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">div<\/span>&gt;<\/span>\r\n                <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">label<\/span>&gt;<\/span>Tax:<span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;\/<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">label<\/span>&gt;<\/span>\r\n                <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">span<\/span> <span class=\"hljs-attr\">id<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"tax-amount\"<\/span>&gt;<\/span>0.00<span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;\/<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">span<\/span>&gt;<\/span>\r\n            <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;\/<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">div<\/span>&gt;<\/span>\r\n            <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">div<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"total\"<\/span>&gt;<\/span>\r\n                <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">label<\/span>&gt;<\/span>Total:<span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;\/<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">label<\/span>&gt;<\/span>\r\n                <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">span<\/span> <span class=\"hljs-attr\">id<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"total\"<\/span>&gt;<\/span>0.00<span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;\/<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">span<\/span>&gt;<\/span>\r\n            <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;\/<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">div<\/span>&gt;<\/span>\r\n        <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;\/<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">div<\/span>&gt;<\/span>\r\n    <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;\/<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">section<\/span>&gt;<\/span>\r\n\r\n    <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">section<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"card\"<\/span>&gt;<\/span>\r\n        <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">h2<\/span>&gt;<\/span>Notes<span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;\/<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">h2<\/span>&gt;<\/span>\r\n        <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">textarea<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"notes\"<\/span> <span class=\"hljs-attr\">rows<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"4\"<\/span> <span class=\"hljs-attr\">placeholder<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"Add any notes or terms for this invoice...\"<\/span>&gt;<\/span><span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;\/<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">textarea<\/span>&gt;<\/span>\r\n    <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;\/<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">section<\/span>&gt;<\/span>\r\n\r\n    <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">div<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"actions\"<\/span>&gt;<\/span>\r\n        <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">a<\/span> <span class=\"hljs-attr\">href<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"index.php\"<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"btn btn-secondary\"<\/span>&gt;<\/span>Reset<span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;\/<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">a<\/span>&gt;<\/span>\r\n        <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">button<\/span> <span class=\"hljs-attr\">type<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"submit\"<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"btn-primary\"<\/span> <span class=\"hljs-attr\">id<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"create-btn\"<\/span>&gt;<\/span>Create Invoice (Download PDF)<span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;\/<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">button<\/span>&gt;<\/span>\r\n    <span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;\/<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">div<\/span>&gt;<\/span>\r\n<span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;\/<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">form<\/span>&gt;<\/span><\/span>\r\n<\/pre>\n<p>Include JavaScript handler script (<code>app.js<\/code>) for dynamic invoice items, real-time subtotal\/tax\/total updates, and logo preview. <\/p>\n<pre style=\"color: rgb(95, 94, 78);\"><span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">script<\/span> <span class=\"hljs-attr\">src<\/span>=<span class=\"hljs-string\" style=\"color: rgb(125, 151, 38);\">\"assets\/js\/app.js\"<\/span>&gt;<\/span><span class=\"undefined\"><\/span><span class=\"hljs-tag\" style=\"color: rgb(186, 98, 54);\">&lt;\/<span class=\"hljs-name\" style=\"color: rgb(186, 98, 54);\">script<\/span>&gt;<\/span><\/pre>\n<h2>Handle Dynamic Invoice Items &#038; Totals with JavaScript (assets\/js\/app.js)<\/h2>\n<p>The <code>app.js<\/code> file contains JavaScript code to manage dynamic invoice items, calculate subtotals, taxes, and totals in real-time, and handle logo preview functionality. This file manages all client-side interactions.<br \/>\n<u>Features Implemented:<\/u><\/p>\n<ul>\n<li>Add\/remove invoice items: Clone table rows, update arrays like items_name[], items_qty[]<\/li>\n<li>Live subtotal, tax, and total calculations: On input change, compute <code>subtotal = sum(qty * price)<\/code>, <code>tax_amount = subtotal * (tax\/100)<\/code>, <code>total = subtotal + tax_amount<\/code><\/li>\n<li>Preview uploaded logo: Use FileReader API to display base64 image in <code>#logo-preview-img<\/code><\/li>\n<li>AJAX form submission using fetch(): Serialize form data including files via FormData, POST to generate_pdf.php<\/li>\n<li>Success handler: Create blob URL from response and trigger saveAs(blob, filename) for direct PDF download<\/li>\n<\/ul>\n<p>Include error handling for validation failures (e.g., missing items) with user-friendly alerts.<\/p>\n<pre style=\"color: rgb(68, 68, 68);\">(<span class=\"hljs-function\"><span class=\"hljs-keyword\" style=\"font-weight: 700;\">function<\/span>(<span class=\"hljs-params\"><\/span>)<\/span>{\r\n    <span class=\"hljs-keyword\" style=\"font-weight: 700;\">const<\/span> addItemBtn = <span class=\"hljs-built_in\" style=\"color: rgb(57, 115, 0);\">document<\/span>.getElementById(<span class=\"hljs-string\" style=\"color: rgb(136, 0, 0);\">'add-item'<\/span>);\r\n    <span class=\"hljs-keyword\" style=\"font-weight: 700;\">const<\/span> itemsTbody = <span class=\"hljs-built_in\" style=\"color: rgb(57, 115, 0);\">document<\/span>.querySelector(<span class=\"hljs-string\" style=\"color: rgb(136, 0, 0);\">'#items-table tbody'<\/span>);\r\n    <span class=\"hljs-keyword\" style=\"font-weight: 700;\">const<\/span> taxInput = <span class=\"hljs-built_in\" style=\"color: rgb(57, 115, 0);\">document<\/span>.getElementById(<span class=\"hljs-string\" style=\"color: rgb(136, 0, 0);\">'tax'<\/span>);\r\n    <span class=\"hljs-keyword\" style=\"font-weight: 700;\">const<\/span> subtotalEl = <span class=\"hljs-built_in\" style=\"color: rgb(57, 115, 0);\">document<\/span>.getElementById(<span class=\"hljs-string\" style=\"color: rgb(136, 0, 0);\">'subtotal'<\/span>);\r\n    <span class=\"hljs-keyword\" style=\"font-weight: 700;\">const<\/span> taxAmountEl = <span class=\"hljs-built_in\" style=\"color: rgb(57, 115, 0);\">document<\/span>.getElementById(<span class=\"hljs-string\" style=\"color: rgb(136, 0, 0);\">'tax-amount'<\/span>);\r\n    <span class=\"hljs-keyword\" style=\"font-weight: 700;\">const<\/span> totalEl = <span class=\"hljs-built_in\" style=\"color: rgb(57, 115, 0);\">document<\/span>.getElementById(<span class=\"hljs-string\" style=\"color: rgb(136, 0, 0);\">'total'<\/span>);\r\n    <span class=\"hljs-keyword\" style=\"font-weight: 700;\">const<\/span> form = <span class=\"hljs-built_in\" style=\"color: rgb(57, 115, 0);\">document<\/span>.getElementById(<span class=\"hljs-string\" style=\"color: rgb(136, 0, 0);\">'invoice-form'<\/span>);\r\n    <span class=\"hljs-keyword\" style=\"font-weight: 700;\">const<\/span> logoInput = <span class=\"hljs-built_in\" style=\"color: rgb(57, 115, 0);\">document<\/span>.getElementById(<span class=\"hljs-string\" style=\"color: rgb(136, 0, 0);\">'logo-input'<\/span>);\r\n    <span class=\"hljs-keyword\" style=\"font-weight: 700;\">const<\/span> logoPreviewWrap = <span class=\"hljs-built_in\" style=\"color: rgb(57, 115, 0);\">document<\/span>.getElementById(<span class=\"hljs-string\" style=\"color: rgb(136, 0, 0);\">'logo-preview'<\/span>);\r\n    <span class=\"hljs-keyword\" style=\"font-weight: 700;\">const<\/span> logoPreviewImg = <span class=\"hljs-built_in\" style=\"color: rgb(57, 115, 0);\">document<\/span>.getElementById(<span class=\"hljs-string\" style=\"color: rgb(136, 0, 0);\">'logo-preview-img'<\/span>);\r\n    <span class=\"hljs-keyword\" style=\"font-weight: 700;\">const<\/span> removeLogoBtn = <span class=\"hljs-built_in\" style=\"color: rgb(57, 115, 0);\">document<\/span>.getElementById(<span class=\"hljs-string\" style=\"color: rgb(136, 0, 0);\">'remove-logo'<\/span>);\r\n\r\n    <span class=\"hljs-comment\" style=\"color: rgb(136, 136, 136);\">\/\/ Function for dynamic item row creation<\/span>\r\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\" style=\"font-weight: 700;\">function<\/span> <span class=\"hljs-title\" style=\"color: rgb(136, 0, 0); font-weight: 700;\">createRow<\/span>(<span class=\"hljs-params\">item={name:'',desc:'',qty:1,price:0}<\/span>)<\/span>{\r\n        <span class=\"hljs-keyword\" style=\"font-weight: 700;\">const<\/span> tr = <span class=\"hljs-built_in\" style=\"color: rgb(57, 115, 0);\">document<\/span>.createElement(<span class=\"hljs-string\" style=\"color: rgb(136, 0, 0);\">'tr'<\/span>);\r\n        tr.innerHTML = <span class=\"hljs-string\" style=\"color: rgb(136, 0, 0);\">`\r\n            &lt;td&gt;&lt;input name=\"items_name[]\" required value=\"<span class=\"hljs-subst\" style=\"color: rgb(68, 68, 68);\">${escapeHtml(item.name)}<\/span>\"&gt;&lt;\/td&gt;\r\n            &lt;td&gt;&lt;input name=\"items_desc[]\" value=\"<span class=\"hljs-subst\" style=\"color: rgb(68, 68, 68);\">${escapeHtml(item.desc)}<\/span>\"&gt;&lt;\/td&gt;\r\n            &lt;td&gt;&lt;input name=\"items_qty[]\" class=\"small\" type=\"number\" min=\"0\" step=\"1\" required value=\"<span class=\"hljs-subst\" style=\"color: rgb(68, 68, 68);\">${item.qty}<\/span>\"&gt;&lt;\/td&gt;\r\n            &lt;td&gt;&lt;input name=\"items_price[]\" class=\"small\" type=\"number\" min=\"0\" step=\"0.01\" required value=\"<span class=\"hljs-subst\" style=\"color: rgb(68, 68, 68);\">${item.price}<\/span>\"&gt;&lt;\/td&gt;\r\n            &lt;td&gt;&lt;button type=\"button\" class=\"remove-item\"&gt;Remove&lt;\/button&gt;&lt;\/td&gt;\r\n        `<\/span>;\r\n        itemsTbody.appendChild(tr);\r\n        tr.querySelector(<span class=\"hljs-string\" style=\"color: rgb(136, 0, 0);\">'.remove-item'<\/span>).addEventListener(<span class=\"hljs-string\" style=\"color: rgb(136, 0, 0);\">'click'<\/span>, ()=&gt;{tr.remove(); computeTotals();});\r\n        tr.querySelectorAll(<span class=\"hljs-string\" style=\"color: rgb(136, 0, 0);\">'input'<\/span>).forEach(i=&gt;i.addEventListener(<span class=\"hljs-string\" style=\"color: rgb(136, 0, 0);\">'input'<\/span>, computeTotals));\r\n    }\r\n\r\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\" style=\"font-weight: 700;\">function<\/span> <span class=\"hljs-title\" style=\"color: rgb(136, 0, 0); font-weight: 700;\">escapeHtml<\/span>(<span class=\"hljs-params\">s<\/span>)<\/span>{ <span class=\"hljs-keyword\" style=\"font-weight: 700;\">return<\/span> <span class=\"hljs-built_in\" style=\"color: rgb(57, 115, 0);\">String<\/span>(s).replace(<span class=\"hljs-regexp\" style=\"color: rgb(188, 96, 96);\">\/[&amp;&lt;&gt;\\\"]\/g<\/span>, <span class=\"hljs-function\"><span class=\"hljs-keyword\" style=\"font-weight: 700;\">function<\/span>(<span class=\"hljs-params\">c<\/span>)<\/span>{<span class=\"hljs-keyword\" style=\"font-weight: 700;\">return<\/span> {<span class=\"hljs-string\" style=\"color: rgb(136, 0, 0);\">'&amp;'<\/span>:<span class=\"hljs-string\" style=\"color: rgb(136, 0, 0);\">'&amp;amp;'<\/span>,<span class=\"hljs-string\" style=\"color: rgb(136, 0, 0);\">'&lt;'<\/span>:<span class=\"hljs-string\" style=\"color: rgb(136, 0, 0);\">'&amp;lt;'<\/span>,<span class=\"hljs-string\" style=\"color: rgb(136, 0, 0);\">'&gt;'<\/span>:<span class=\"hljs-string\" style=\"color: rgb(136, 0, 0);\">'&amp;gt;'<\/span>,<span class=\"hljs-string\" style=\"color: rgb(136, 0, 0);\">'\"'<\/span>:<span class=\"hljs-string\" style=\"color: rgb(136, 0, 0);\">'&amp;quot;'<\/span>}[c];}); }\r\n\r\n    addItemBtn.addEventListener(<span class=\"hljs-string\" style=\"color: rgb(136, 0, 0);\">'click'<\/span>, ()=&gt;createRow());\r\n    taxInput.addEventListener(<span class=\"hljs-string\" style=\"color: rgb(136, 0, 0);\">'input'<\/span>, computeTotals);\r\n\r\n    <span class=\"hljs-comment\" style=\"color: rgb(136, 136, 136);\">\/\/ Function for real-time total calculation<\/span>\r\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\" style=\"font-weight: 700;\">function<\/span> <span class=\"hljs-title\" style=\"color: rgb(136, 0, 0); font-weight: 700;\">computeTotals<\/span>(<span class=\"hljs-params\"><\/span>)<\/span>{\r\n        <span class=\"hljs-keyword\" style=\"font-weight: 700;\">let<\/span> subtotal=<span class=\"hljs-number\" style=\"color: rgb(136, 0, 0);\">0<\/span>;\r\n        <span class=\"hljs-keyword\" style=\"font-weight: 700;\">const<\/span> qtys = <span class=\"hljs-built_in\" style=\"color: rgb(57, 115, 0);\">Array<\/span>.from(<span class=\"hljs-built_in\" style=\"color: rgb(57, 115, 0);\">document<\/span>.getElementsByName(<span class=\"hljs-string\" style=\"color: rgb(136, 0, 0);\">'items_qty[]'<\/span>));\r\n        <span class=\"hljs-keyword\" style=\"font-weight: 700;\">const<\/span> prices = <span class=\"hljs-built_in\" style=\"color: rgb(57, 115, 0);\">Array<\/span>.from(<span class=\"hljs-built_in\" style=\"color: rgb(57, 115, 0);\">document<\/span>.getElementsByName(<span class=\"hljs-string\" style=\"color: rgb(136, 0, 0);\">'items_price[]'<\/span>));\r\n        <span class=\"hljs-keyword\" style=\"font-weight: 700;\">for<\/span>(<span class=\"hljs-keyword\" style=\"font-weight: 700;\">let<\/span> i=<span class=\"hljs-number\" style=\"color: rgb(136, 0, 0);\">0<\/span>;i&lt;qtys.length;i++){\r\n            <span class=\"hljs-keyword\" style=\"font-weight: 700;\">const<\/span> q = <span class=\"hljs-built_in\" style=\"color: rgb(57, 115, 0);\">parseFloat<\/span>(qtys[i].value)||<span class=\"hljs-number\" style=\"color: rgb(136, 0, 0);\">0<\/span>;\r\n            <span class=\"hljs-keyword\" style=\"font-weight: 700;\">const<\/span> p = <span class=\"hljs-built_in\" style=\"color: rgb(57, 115, 0);\">parseFloat<\/span>(prices[i].value)||<span class=\"hljs-number\" style=\"color: rgb(136, 0, 0);\">0<\/span>;\r\n            subtotal += q*p;\r\n        }\r\n        <span class=\"hljs-keyword\" style=\"font-weight: 700;\">const<\/span> taxPerc = <span class=\"hljs-built_in\" style=\"color: rgb(57, 115, 0);\">parseFloat<\/span>(taxInput.value)||<span class=\"hljs-number\" style=\"color: rgb(136, 0, 0);\">0<\/span>;\r\n        <span class=\"hljs-keyword\" style=\"font-weight: 700;\">const<\/span> taxAmt = subtotal * (taxPerc\/<span class=\"hljs-number\" style=\"color: rgb(136, 0, 0);\">100<\/span>);\r\n        <span class=\"hljs-keyword\" style=\"font-weight: 700;\">const<\/span> total = subtotal + taxAmt;\r\n        subtotalEl.textContent = <span class=\"hljs-string\" style=\"color: rgb(136, 0, 0);\">'$'<\/span>+subtotal.toFixed(<span class=\"hljs-number\" style=\"color: rgb(136, 0, 0);\">2<\/span>);\r\n        taxAmountEl.textContent = <span class=\"hljs-string\" style=\"color: rgb(136, 0, 0);\">'$'<\/span>+taxAmt.toFixed(<span class=\"hljs-number\" style=\"color: rgb(136, 0, 0);\">2<\/span>);\r\n        totalEl.textContent = <span class=\"hljs-string\" style=\"color: rgb(136, 0, 0);\">'$'<\/span>+total.toFixed(<span class=\"hljs-number\" style=\"color: rgb(136, 0, 0);\">2<\/span>);\r\n    }\r\n\r\n    <span class=\"hljs-comment\" style=\"color: rgb(136, 136, 136);\">\/\/ initial one item<\/span>\r\n    createRow({name:<span class=\"hljs-string\" style=\"color: rgb(136, 0, 0);\">''<\/span>,desc:<span class=\"hljs-string\" style=\"color: rgb(136, 0, 0);\">''<\/span>,qty:<span class=\"hljs-number\" style=\"color: rgb(136, 0, 0);\">1<\/span>,price:<span class=\"hljs-number\" style=\"color: rgb(136, 0, 0);\">0<\/span>});\r\n    computeTotals();\r\n\r\n    <span class=\"hljs-comment\" style=\"color: rgb(136, 136, 136);\">\/\/ Logo preview handling<\/span>\r\n    <span class=\"hljs-keyword\" style=\"font-weight: 700;\">if<\/span>(logoInput){\r\n        logoInput.addEventListener(<span class=\"hljs-string\" style=\"color: rgb(136, 0, 0);\">'change'<\/span>, <span class=\"hljs-function\"><span class=\"hljs-keyword\" style=\"font-weight: 700;\">function<\/span>(<span class=\"hljs-params\"><\/span>)<\/span>{\r\n            <span class=\"hljs-keyword\" style=\"font-weight: 700;\">const<\/span> f = <span class=\"hljs-keyword\" style=\"font-weight: 700;\">this<\/span>.files &amp;&amp; <span class=\"hljs-keyword\" style=\"font-weight: 700;\">this<\/span>.files[<span class=\"hljs-number\" style=\"color: rgb(136, 0, 0);\">0<\/span>];\r\n            <span class=\"hljs-keyword\" style=\"font-weight: 700;\">if<\/span>(!f){ logoPreviewWrap.style.display=<span class=\"hljs-string\" style=\"color: rgb(136, 0, 0);\">'none'<\/span>; logoPreviewImg.src=<span class=\"hljs-string\" style=\"color: rgb(136, 0, 0);\">''<\/span>; <span class=\"hljs-keyword\" style=\"font-weight: 700;\">return<\/span>; }\r\n            <span class=\"hljs-keyword\" style=\"font-weight: 700;\">if<\/span>(f.size &gt; <span class=\"hljs-number\" style=\"color: rgb(136, 0, 0);\">2<\/span>*<span class=\"hljs-number\" style=\"color: rgb(136, 0, 0);\">1024<\/span>*<span class=\"hljs-number\" style=\"color: rgb(136, 0, 0);\">1024<\/span>){ alert(<span class=\"hljs-string\" style=\"color: rgb(136, 0, 0);\">'Logo must be under 2 MB'<\/span>); <span class=\"hljs-keyword\" style=\"font-weight: 700;\">this<\/span>.value=<span class=\"hljs-string\" style=\"color: rgb(136, 0, 0);\">''<\/span>; <span class=\"hljs-keyword\" style=\"font-weight: 700;\">return<\/span>; }\r\n            <span class=\"hljs-keyword\" style=\"font-weight: 700;\">const<\/span> allowed = [<span class=\"hljs-string\" style=\"color: rgb(136, 0, 0);\">'image\/png'<\/span>,<span class=\"hljs-string\" style=\"color: rgb(136, 0, 0);\">'image\/jpeg'<\/span>,<span class=\"hljs-string\" style=\"color: rgb(136, 0, 0);\">'image\/gif'<\/span>];\r\n            <span class=\"hljs-keyword\" style=\"font-weight: 700;\">if<\/span>(!allowed.includes(f.type)) { alert(<span class=\"hljs-string\" style=\"color: rgb(136, 0, 0);\">'Only PNG\/JPEG\/GIF allowed'<\/span>); <span class=\"hljs-keyword\" style=\"font-weight: 700;\">this<\/span>.value=<span class=\"hljs-string\" style=\"color: rgb(136, 0, 0);\">''<\/span>; <span class=\"hljs-keyword\" style=\"font-weight: 700;\">return<\/span>; }\r\n            <span class=\"hljs-keyword\" style=\"font-weight: 700;\">const<\/span> reader = <span class=\"hljs-keyword\" style=\"font-weight: 700;\">new<\/span> FileReader();\r\n            reader.onload = <span class=\"hljs-function\"><span class=\"hljs-keyword\" style=\"font-weight: 700;\">function<\/span>(<span class=\"hljs-params\">ev<\/span>)<\/span>{ logoPreviewImg.src = ev.target.result; logoPreviewWrap.style.display=<span class=\"hljs-string\" style=\"color: rgb(136, 0, 0);\">'flex'<\/span>; };\r\n            reader.readAsDataURL(f);\r\n        });\r\n        removeLogoBtn.addEventListener(<span class=\"hljs-string\" style=\"color: rgb(136, 0, 0);\">'click'<\/span>, <span class=\"hljs-function\"><span class=\"hljs-keyword\" style=\"font-weight: 700;\">function<\/span>(<span class=\"hljs-params\"><\/span>)<\/span>{\r\n            logoInput.value = <span class=\"hljs-string\" style=\"color: rgb(136, 0, 0);\">''<\/span>;\r\n            logoPreviewImg.src = <span class=\"hljs-string\" style=\"color: rgb(136, 0, 0);\">''<\/span>;\r\n            logoPreviewWrap.style.display = <span class=\"hljs-string\" style=\"color: rgb(136, 0, 0);\">'none'<\/span>;\r\n        });\r\n    }\r\n\r\n    <span class=\"hljs-comment\" style=\"color: rgb(136, 136, 136);\">\/\/ Form submission and PDF generation<\/span>\r\n    form.addEventListener(<span class=\"hljs-string\" style=\"color: rgb(136, 0, 0);\">'submit'<\/span>, <span class=\"hljs-keyword\" style=\"font-weight: 700;\">async<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\" style=\"font-weight: 700;\">function<\/span>(<span class=\"hljs-params\">e<\/span>)<\/span>{\r\n        e.preventDefault();\r\n        <span class=\"hljs-keyword\" style=\"font-weight: 700;\">const<\/span> btn = <span class=\"hljs-built_in\" style=\"color: rgb(57, 115, 0);\">document<\/span>.getElementById(<span class=\"hljs-string\" style=\"color: rgb(136, 0, 0);\">'create-btn'<\/span>);\r\n        <span class=\"hljs-keyword\" style=\"font-weight: 700;\">if<\/span>(!form.checkValidity()){\r\n            form.reportValidity();\r\n            <span class=\"hljs-keyword\" style=\"font-weight: 700;\">return<\/span>;\r\n        }\r\n        btn.disabled = <span class=\"hljs-literal\" style=\"color: rgb(120, 169, 96);\">true<\/span>; btn.textContent = <span class=\"hljs-string\" style=\"color: rgb(136, 0, 0);\">'Generating...'<\/span>;\r\n        <span class=\"hljs-keyword\" style=\"font-weight: 700;\">const<\/span> data = <span class=\"hljs-keyword\" style=\"font-weight: 700;\">new<\/span> FormData(form);\r\n        <span class=\"hljs-keyword\" style=\"font-weight: 700;\">try<\/span>{\r\n            <span class=\"hljs-keyword\" style=\"font-weight: 700;\">const<\/span> resp = <span class=\"hljs-keyword\" style=\"font-weight: 700;\">await<\/span> fetch(<span class=\"hljs-string\" style=\"color: rgb(136, 0, 0);\">'generate_pdf.php'<\/span>, {method:<span class=\"hljs-string\" style=\"color: rgb(136, 0, 0);\">'POST'<\/span>, body:data});\r\n            <span class=\"hljs-keyword\" style=\"font-weight: 700;\">if<\/span>(!resp.ok){\r\n                <span class=\"hljs-keyword\" style=\"font-weight: 700;\">const<\/span> text = <span class=\"hljs-keyword\" style=\"font-weight: 700;\">await<\/span> resp.text();\r\n                <span class=\"hljs-keyword\" style=\"font-weight: 700;\">throw<\/span> <span class=\"hljs-keyword\" style=\"font-weight: 700;\">new<\/span> <span class=\"hljs-built_in\" style=\"color: rgb(57, 115, 0);\">Error<\/span>(text || <span class=\"hljs-string\" style=\"color: rgb(136, 0, 0);\">'Server error'<\/span>);\r\n            }\r\n            <span class=\"hljs-keyword\" style=\"font-weight: 700;\">const<\/span> blob = <span class=\"hljs-keyword\" style=\"font-weight: 700;\">await<\/span> resp.blob();\r\n            <span class=\"hljs-keyword\" style=\"font-weight: 700;\">const<\/span> filename = getFileNameFromDisposition(resp.headers.get(<span class=\"hljs-string\" style=\"color: rgb(136, 0, 0);\">'Content-Disposition'<\/span>)) || <span class=\"hljs-string\" style=\"color: rgb(136, 0, 0);\">'invoice.pdf'<\/span>;\r\n            <span class=\"hljs-keyword\" style=\"font-weight: 700;\">const<\/span> url = URL.createObjectURL(blob);\r\n            <span class=\"hljs-keyword\" style=\"font-weight: 700;\">const<\/span> a = <span class=\"hljs-built_in\" style=\"color: rgb(57, 115, 0);\">document<\/span>.createElement(<span class=\"hljs-string\" style=\"color: rgb(136, 0, 0);\">'a'<\/span>); a.href = url; a.download = filename; <span class=\"hljs-built_in\" style=\"color: rgb(57, 115, 0);\">document<\/span>.body.appendChild(a); a.click(); a.remove();\r\n            URL.revokeObjectURL(url);\r\n        }<span class=\"hljs-keyword\" style=\"font-weight: 700;\">catch<\/span>(err){\r\n            alert(<span class=\"hljs-string\" style=\"color: rgb(136, 0, 0);\">'Error: '<\/span>+err.message);\r\n        }<span class=\"hljs-keyword\" style=\"font-weight: 700;\">finally<\/span>{ btn.disabled=<span class=\"hljs-literal\" style=\"color: rgb(120, 169, 96);\">false<\/span>; btn.textContent=<span class=\"hljs-string\" style=\"color: rgb(136, 0, 0);\">'Create Invoice (Download PDF)'<\/span>; }\r\n    });\r\n\r\n    <span class=\"hljs-comment\" style=\"color: rgb(136, 136, 136);\">\/\/ Helper to extract filename from Content-Disposition header<\/span>\r\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\" style=\"font-weight: 700;\">function<\/span> <span class=\"hljs-title\" style=\"color: rgb(136, 0, 0); font-weight: 700;\">getFileNameFromDisposition<\/span>(<span class=\"hljs-params\">disposition<\/span>)<\/span>{\r\n        <span class=\"hljs-keyword\" style=\"font-weight: 700;\">if<\/span>(!disposition) <span class=\"hljs-keyword\" style=\"font-weight: 700;\">return<\/span> <span class=\"hljs-literal\" style=\"color: rgb(120, 169, 96);\">null<\/span>;\r\n        <span class=\"hljs-keyword\" style=\"font-weight: 700;\">const<\/span> match = <span class=\"hljs-regexp\" style=\"color: rgb(188, 96, 96);\">\/filename\\*?=([^;]+)\/i<\/span>.exec(disposition);\r\n        <span class=\"hljs-keyword\" style=\"font-weight: 700;\">if<\/span>(!match) <span class=\"hljs-keyword\" style=\"font-weight: 700;\">return<\/span> <span class=\"hljs-literal\" style=\"color: rgb(120, 169, 96);\">null<\/span>;\r\n        <span class=\"hljs-keyword\" style=\"font-weight: 700;\">let<\/span> fn = match[<span class=\"hljs-number\" style=\"color: rgb(136, 0, 0);\">1<\/span>].trim();\r\n        fn = fn.replace(<span class=\"hljs-regexp\" style=\"color: rgb(188, 96, 96);\">\/UTF-8''\/i<\/span>,<span class=\"hljs-string\" style=\"color: rgb(136, 0, 0);\">''<\/span>);\r\n        fn = fn.replace(<span class=\"hljs-regexp\" style=\"color: rgb(188, 96, 96);\">\/\"\/g<\/span>,<span class=\"hljs-string\" style=\"color: rgb(136, 0, 0);\">''<\/span>);\r\n        <span class=\"hljs-keyword\" style=\"font-weight: 700;\">return<\/span> <span class=\"hljs-built_in\" style=\"color: rgb(57, 115, 0);\">decodeURIComponent<\/span>(fn);\r\n    }\r\n})();<\/pre>\n<h2>Generate Invoice PDF in PHP (generate_pdf.php)<\/h2>\n<p>The <code>generate_pdf.php<\/code> file processes the submitted form data, generates a PDF invoice using the Dompdf library, and returns it for download using PHP. It includes CSRF protection, input sanitization, and process POST data securely and output binary PDF.<\/p>\n<ul>\n<li>Session\/CSRF validation: <code>hash_equals($_SESSION['csrftoken'], $_POST['csrftoken'])<\/code><\/li>\n<li>Input sanitization: Custom clean() for HTML escape, <code>floatval_safe()<\/code> for numerics<\/li>\n<li>Logo handling: Validate MIME\/size, convert to base64 data URI for embedding<\/li>\n<li>HTML template: Flexbox header with seller logo\/invoice details, bordered items table, summary with subtotal\/tax\/total<\/li>\n<li>Dompdf rendering: <code>$dompdf->loadHtml($html); $dompdf->setPaper('A4', 'portrait'); $pdf = $dompdf->output();<\/code><\/li>\n<li>Binary headers: Clean output buffers, set <code>Content-Type: application\/pdf, Content-Disposition: attachment<\/code><\/li>\n<\/ul>\n<p>Use <code>number_format($value, 2)<\/code> for currency formatting and <code>nl2br()<\/code> for notes.<\/p>\n<pre><span style=\"color: #0000BB\">&lt;?php <br \/><\/span><span style=\"color: #FF8000\">\/\/&nbsp;Start&nbsp;session <br \/><\/span><span style=\"color: #0000BB\">session_start<\/span><span style=\"color: #007700\">(); <br \/> <br \/><\/span><span style=\"color: #FF8000\">\/\/&nbsp;Load&nbsp;Dompdf&nbsp;library <br \/><\/span><span style=\"color: #007700\">require&nbsp;<\/span><span style=\"color: #0000BB\">__DIR__&nbsp;<\/span><span style=\"color: #007700\">.&nbsp;<\/span><span style=\"color: #DD0000\">'\/vendor\/autoload.php'<\/span><span style=\"color: #007700\">; <br \/>use&nbsp;<\/span><span style=\"color: #0000BB\">Dompdf\\Dompdf<\/span><span style=\"color: #007700\">; <br \/>use&nbsp;<\/span><span style=\"color: #0000BB\">Dompdf\\Options<\/span><span style=\"color: #007700\">; <br \/> <br \/><\/span><span style=\"color: #FF8000\">\/\/&nbsp;Only&nbsp;accept&nbsp;POST <br \/><\/span><span style=\"color: #007700\">if&nbsp;(<\/span><span style=\"color: #0000BB\">$_SERVER<\/span><span style=\"color: #007700\">[<\/span><span style=\"color: #DD0000\">'REQUEST_METHOD'<\/span><span style=\"color: #007700\">]&nbsp;!==&nbsp;<\/span><span style=\"color: #DD0000\">'POST'<\/span><span style=\"color: #007700\">)&nbsp;{ <br \/>&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span style=\"color: #0000BB\">http_response_code<\/span><span style=\"color: #007700\">(<\/span><span style=\"color: #0000BB\">405<\/span><span style=\"color: #007700\">); <br \/>&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;<\/span><span style=\"color: #DD0000\">'Method&nbsp;not&nbsp;allowed'<\/span><span style=\"color: #007700\">; <br \/>&nbsp;&nbsp;&nbsp;&nbsp;exit; <br \/>} <br \/> <br \/><\/span><span style=\"color: #FF8000\">\/\/&nbsp;Validate&nbsp;CSRF&nbsp;token <br \/><\/span><span style=\"color: #0000BB\">$csrf&nbsp;<\/span><span style=\"color: #007700\">=&nbsp;<\/span><span style=\"color: #0000BB\">$_POST<\/span><span style=\"color: #007700\">[<\/span><span style=\"color: #DD0000\">'csrf_token'<\/span><span style=\"color: #007700\">]&nbsp;??&nbsp;<\/span><span style=\"color: #DD0000\">''<\/span><span style=\"color: #007700\">; <br \/>if&nbsp;(empty(<\/span><span style=\"color: #0000BB\">$_SESSION<\/span><span style=\"color: #007700\">[<\/span><span style=\"color: #DD0000\">'csrf_token'<\/span><span style=\"color: #007700\">])&nbsp;||&nbsp;!<\/span><span style=\"color: #0000BB\">hash_equals<\/span><span style=\"color: #007700\">(<\/span><span style=\"color: #0000BB\">$_SESSION<\/span><span style=\"color: #007700\">[<\/span><span style=\"color: #DD0000\">'csrf_token'<\/span><span style=\"color: #007700\">],&nbsp;<\/span><span style=\"color: #0000BB\">$csrf<\/span><span style=\"color: #007700\">))&nbsp;{ <br \/>&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span style=\"color: #0000BB\">http_response_code<\/span><span style=\"color: #007700\">(<\/span><span style=\"color: #0000BB\">400<\/span><span style=\"color: #007700\">); <br \/>&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;<\/span><span style=\"color: #DD0000\">'Invalid&nbsp;CSRF&nbsp;token'<\/span><span style=\"color: #007700\">; <br \/>&nbsp;&nbsp;&nbsp;&nbsp;exit; <br \/>} <br \/> <br \/><\/span><span style=\"color: #FF8000\">\/\/&nbsp;Helper&nbsp;sanitizers <br \/><\/span><span style=\"color: #007700\">function&nbsp;<\/span><span style=\"color: #0000BB\">clean<\/span><span style=\"color: #007700\">(<\/span><span style=\"color: #0000BB\">$s<\/span><span style=\"color: #007700\">){&nbsp;return&nbsp;<\/span><span style=\"color: #0000BB\">htmlspecialchars<\/span><span style=\"color: #007700\">(<\/span><span style=\"color: #0000BB\">trim<\/span><span style=\"color: #007700\">(<\/span><span style=\"color: #0000BB\">$s<\/span><span style=\"color: #007700\">),&nbsp;<\/span><span style=\"color: #0000BB\">ENT_QUOTES<\/span><span style=\"color: #007700\">,&nbsp;<\/span><span style=\"color: #DD0000\">'UTF-8'<\/span><span style=\"color: #007700\">);&nbsp;} <br \/>function&nbsp;<\/span><span style=\"color: #0000BB\">floatval_safe<\/span><span style=\"color: #007700\">(<\/span><span style=\"color: #0000BB\">$v<\/span><span style=\"color: #007700\">){&nbsp;return&nbsp;<\/span><span style=\"color: #0000BB\">is_numeric<\/span><span style=\"color: #007700\">(<\/span><span style=\"color: #0000BB\">$v<\/span><span style=\"color: #007700\">)&nbsp;?&nbsp;(float)<\/span><span style=\"color: #0000BB\">$v&nbsp;<\/span><span style=\"color: #007700\">:&nbsp;<\/span><span style=\"color: #0000BB\">0.0<\/span><span style=\"color: #007700\">;&nbsp;} <br \/> <br \/><\/span><span style=\"color: #FF8000\">\/\/&nbsp;Collect&nbsp;and&nbsp;sanitize&nbsp;fields <br \/><\/span><span style=\"color: #0000BB\">$customer&nbsp;<\/span><span style=\"color: #007700\">=&nbsp;[ <br \/>&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span style=\"color: #DD0000\">'first'<\/span><span style=\"color: #007700\">=&gt;<\/span><span style=\"color: #0000BB\">clean<\/span><span style=\"color: #007700\">(<\/span><span style=\"color: #0000BB\">$_POST<\/span><span style=\"color: #007700\">[<\/span><span style=\"color: #DD0000\">'customer_first'<\/span><span style=\"color: #007700\">]&nbsp;??&nbsp;<\/span><span style=\"color: #DD0000\">''<\/span><span style=\"color: #007700\">), <br \/>&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span style=\"color: #DD0000\">'last'<\/span><span style=\"color: #007700\">=&gt;<\/span><span style=\"color: #0000BB\">clean<\/span><span style=\"color: #007700\">(<\/span><span style=\"color: #0000BB\">$_POST<\/span><span style=\"color: #007700\">[<\/span><span style=\"color: #DD0000\">'customer_last'<\/span><span style=\"color: #007700\">]&nbsp;??&nbsp;<\/span><span style=\"color: #DD0000\">''<\/span><span style=\"color: #007700\">), <br \/>&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span style=\"color: #DD0000\">'business'<\/span><span style=\"color: #007700\">=&gt;<\/span><span style=\"color: #0000BB\">clean<\/span><span style=\"color: #007700\">(<\/span><span style=\"color: #0000BB\">$_POST<\/span><span style=\"color: #007700\">[<\/span><span style=\"color: #DD0000\">'customer_business'<\/span><span style=\"color: #007700\">]&nbsp;??&nbsp;<\/span><span style=\"color: #DD0000\">''<\/span><span style=\"color: #007700\">), <br \/>&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span style=\"color: #DD0000\">'phone'<\/span><span style=\"color: #007700\">=&gt;<\/span><span style=\"color: #0000BB\">clean<\/span><span style=\"color: #007700\">(<\/span><span style=\"color: #0000BB\">$_POST<\/span><span style=\"color: #007700\">[<\/span><span style=\"color: #DD0000\">'customer_phone'<\/span><span style=\"color: #007700\">]&nbsp;??&nbsp;<\/span><span style=\"color: #DD0000\">''<\/span><span style=\"color: #007700\">), <br \/>&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span style=\"color: #DD0000\">'address'<\/span><span style=\"color: #007700\">=&gt;<\/span><span style=\"color: #0000BB\">clean<\/span><span style=\"color: #007700\">(<\/span><span style=\"color: #0000BB\">$_POST<\/span><span style=\"color: #007700\">[<\/span><span style=\"color: #DD0000\">'customer_address'<\/span><span style=\"color: #007700\">]&nbsp;??&nbsp;<\/span><span style=\"color: #DD0000\">''<\/span><span style=\"color: #007700\">), <br \/>&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span style=\"color: #DD0000\">'city'<\/span><span style=\"color: #007700\">=&gt;<\/span><span style=\"color: #0000BB\">clean<\/span><span style=\"color: #007700\">(<\/span><span style=\"color: #0000BB\">$_POST<\/span><span style=\"color: #007700\">[<\/span><span style=\"color: #DD0000\">'customer_city'<\/span><span style=\"color: #007700\">]&nbsp;??&nbsp;<\/span><span style=\"color: #DD0000\">''<\/span><span style=\"color: #007700\">), <br \/>&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span style=\"color: #DD0000\">'state'<\/span><span style=\"color: #007700\">=&gt;<\/span><span style=\"color: #0000BB\">clean<\/span><span style=\"color: #007700\">(<\/span><span style=\"color: #0000BB\">$_POST<\/span><span style=\"color: #007700\">[<\/span><span style=\"color: #DD0000\">'customer_state'<\/span><span style=\"color: #007700\">]&nbsp;??&nbsp;<\/span><span style=\"color: #DD0000\">''<\/span><span style=\"color: #007700\">), <br \/>&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span style=\"color: #DD0000\">'zip'<\/span><span style=\"color: #007700\">=&gt;<\/span><span style=\"color: #0000BB\">clean<\/span><span style=\"color: #007700\">(<\/span><span style=\"color: #0000BB\">$_POST<\/span><span style=\"color: #007700\">[<\/span><span style=\"color: #DD0000\">'customer_zip'<\/span><span style=\"color: #007700\">]&nbsp;??&nbsp;<\/span><span style=\"color: #DD0000\">''<\/span><span style=\"color: #007700\">), <br \/>&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span style=\"color: #DD0000\">'country'<\/span><span style=\"color: #007700\">=&gt;<\/span><span style=\"color: #0000BB\">clean<\/span><span style=\"color: #007700\">(<\/span><span style=\"color: #0000BB\">$_POST<\/span><span style=\"color: #007700\">[<\/span><span style=\"color: #DD0000\">'customer_country'<\/span><span style=\"color: #007700\">]&nbsp;??&nbsp;<\/span><span style=\"color: #DD0000\">''<\/span><span style=\"color: #007700\">), <br \/>]; <br \/><\/span><span style=\"color: #0000BB\">$seller&nbsp;<\/span><span style=\"color: #007700\">=&nbsp;[ <br \/>&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span style=\"color: #DD0000\">'business'<\/span><span style=\"color: #007700\">=&gt;<\/span><span style=\"color: #0000BB\">clean<\/span><span style=\"color: #007700\">(<\/span><span style=\"color: #0000BB\">$_POST<\/span><span style=\"color: #007700\">[<\/span><span style=\"color: #DD0000\">'seller_business'<\/span><span style=\"color: #007700\">]&nbsp;??&nbsp;<\/span><span style=\"color: #DD0000\">''<\/span><span style=\"color: #007700\">), <br \/>&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span style=\"color: #DD0000\">'email'<\/span><span style=\"color: #007700\">=&gt;<\/span><span style=\"color: #0000BB\">filter_var<\/span><span style=\"color: #007700\">(<\/span><span style=\"color: #0000BB\">$_POST<\/span><span style=\"color: #007700\">[<\/span><span style=\"color: #DD0000\">'seller_email'<\/span><span style=\"color: #007700\">]&nbsp;??&nbsp;<\/span><span style=\"color: #DD0000\">''<\/span><span style=\"color: #007700\">,&nbsp;<\/span><span style=\"color: #0000BB\">FILTER_SANITIZE_EMAIL<\/span><span style=\"color: #007700\">), <br \/>&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span style=\"color: #DD0000\">'phone'<\/span><span style=\"color: #007700\">=&gt;<\/span><span style=\"color: #0000BB\">clean<\/span><span style=\"color: #007700\">(<\/span><span style=\"color: #0000BB\">$_POST<\/span><span style=\"color: #007700\">[<\/span><span style=\"color: #DD0000\">'seller_phone'<\/span><span style=\"color: #007700\">]&nbsp;??&nbsp;<\/span><span style=\"color: #DD0000\">''<\/span><span style=\"color: #007700\">), <br \/>&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span style=\"color: #DD0000\">'website'<\/span><span style=\"color: #007700\">=&gt;<\/span><span style=\"color: #0000BB\">filter_var<\/span><span style=\"color: #007700\">(<\/span><span style=\"color: #0000BB\">$_POST<\/span><span style=\"color: #007700\">[<\/span><span style=\"color: #DD0000\">'seller_website'<\/span><span style=\"color: #007700\">]&nbsp;??&nbsp;<\/span><span style=\"color: #DD0000\">''<\/span><span style=\"color: #007700\">,&nbsp;<\/span><span style=\"color: #0000BB\">FILTER_SANITIZE_URL<\/span><span style=\"color: #007700\">), <br \/>&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span style=\"color: #DD0000\">'address'<\/span><span style=\"color: #007700\">=&gt;<\/span><span style=\"color: #0000BB\">clean<\/span><span style=\"color: #007700\">(<\/span><span style=\"color: #0000BB\">$_POST<\/span><span style=\"color: #007700\">[<\/span><span style=\"color: #DD0000\">'seller_address'<\/span><span style=\"color: #007700\">]&nbsp;??&nbsp;<\/span><span style=\"color: #DD0000\">''<\/span><span style=\"color: #007700\">), <br \/>&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span style=\"color: #DD0000\">'city'<\/span><span style=\"color: #007700\">=&gt;<\/span><span style=\"color: #0000BB\">clean<\/span><span style=\"color: #007700\">(<\/span><span style=\"color: #0000BB\">$_POST<\/span><span style=\"color: #007700\">[<\/span><span style=\"color: #DD0000\">'seller_city'<\/span><span style=\"color: #007700\">]&nbsp;??&nbsp;<\/span><span style=\"color: #DD0000\">''<\/span><span style=\"color: #007700\">), <br \/>&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span style=\"color: #DD0000\">'state'<\/span><span style=\"color: #007700\">=&gt;<\/span><span style=\"color: #0000BB\">clean<\/span><span style=\"color: #007700\">(<\/span><span style=\"color: #0000BB\">$_POST<\/span><span style=\"color: #007700\">[<\/span><span style=\"color: #DD0000\">'seller_state'<\/span><span style=\"color: #007700\">]&nbsp;??&nbsp;<\/span><span style=\"color: #DD0000\">''<\/span><span style=\"color: #007700\">), <br \/>&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span style=\"color: #DD0000\">'zip'<\/span><span style=\"color: #007700\">=&gt;<\/span><span style=\"color: #0000BB\">clean<\/span><span style=\"color: #007700\">(<\/span><span style=\"color: #0000BB\">$_POST<\/span><span style=\"color: #007700\">[<\/span><span style=\"color: #DD0000\">'seller_zip'<\/span><span style=\"color: #007700\">]&nbsp;??&nbsp;<\/span><span style=\"color: #DD0000\">''<\/span><span style=\"color: #007700\">), <br \/>&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span style=\"color: #DD0000\">'country'<\/span><span style=\"color: #007700\">=&gt;<\/span><span style=\"color: #0000BB\">clean<\/span><span style=\"color: #007700\">(<\/span><span style=\"color: #0000BB\">$_POST<\/span><span style=\"color: #007700\">[<\/span><span style=\"color: #DD0000\">'seller_country'<\/span><span style=\"color: #007700\">]&nbsp;??&nbsp;<\/span><span style=\"color: #DD0000\">''<\/span><span style=\"color: #007700\">), <br \/>]; <br \/><\/span><span style=\"color: #0000BB\">$invoice&nbsp;<\/span><span style=\"color: #007700\">=&nbsp;[ <br \/>&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span style=\"color: #DD0000\">'number'<\/span><span style=\"color: #007700\">=&gt;<\/span><span style=\"color: #0000BB\">clean<\/span><span style=\"color: #007700\">(<\/span><span style=\"color: #0000BB\">$_POST<\/span><span style=\"color: #007700\">[<\/span><span style=\"color: #DD0000\">'invoice_number'<\/span><span style=\"color: #007700\">]&nbsp;??&nbsp;<\/span><span style=\"color: #DD0000\">''<\/span><span style=\"color: #007700\">), <br \/>&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span style=\"color: #DD0000\">'issue'<\/span><span style=\"color: #007700\">=&gt;<\/span><span style=\"color: #0000BB\">clean<\/span><span style=\"color: #007700\">(<\/span><span style=\"color: #0000BB\">$_POST<\/span><span style=\"color: #007700\">[<\/span><span style=\"color: #DD0000\">'issue_date'<\/span><span style=\"color: #007700\">]&nbsp;??&nbsp;<\/span><span style=\"color: #DD0000\">''<\/span><span style=\"color: #007700\">), <br \/>&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span style=\"color: #DD0000\">'due'<\/span><span style=\"color: #007700\">=&gt;<\/span><span style=\"color: #0000BB\">clean<\/span><span style=\"color: #007700\">(<\/span><span style=\"color: #0000BB\">$_POST<\/span><span style=\"color: #007700\">[<\/span><span style=\"color: #DD0000\">'due_date'<\/span><span style=\"color: #007700\">]&nbsp;??&nbsp;<\/span><span style=\"color: #DD0000\">''<\/span><span style=\"color: #007700\">), <br \/>]; <br \/><\/span><span style=\"color: #0000BB\">$notes&nbsp;<\/span><span style=\"color: #007700\">=&nbsp;<\/span><span style=\"color: #0000BB\">clean<\/span><span style=\"color: #007700\">(<\/span><span style=\"color: #0000BB\">$_POST<\/span><span style=\"color: #007700\">[<\/span><span style=\"color: #DD0000\">'notes'<\/span><span style=\"color: #007700\">]&nbsp;??&nbsp;<\/span><span style=\"color: #DD0000\">''<\/span><span style=\"color: #007700\">); <br \/><\/span><span style=\"color: #0000BB\">$tax&nbsp;<\/span><span style=\"color: #007700\">=&nbsp;<\/span><span style=\"color: #0000BB\">floatval_safe<\/span><span style=\"color: #007700\">(<\/span><span style=\"color: #0000BB\">$_POST<\/span><span style=\"color: #007700\">[<\/span><span style=\"color: #DD0000\">'tax'<\/span><span style=\"color: #007700\">]&nbsp;??&nbsp;<\/span><span style=\"color: #0000BB\">0<\/span><span style=\"color: #007700\">); <br \/> <br \/><\/span><span style=\"color: #FF8000\">\/\/&nbsp;Collect&nbsp;invoice&nbsp;items <br \/><\/span><span style=\"color: #0000BB\">$items&nbsp;<\/span><span style=\"color: #007700\">=&nbsp;[]; <br \/><\/span><span style=\"color: #0000BB\">$names&nbsp;<\/span><span style=\"color: #007700\">=&nbsp;<\/span><span style=\"color: #0000BB\">$_POST<\/span><span style=\"color: #007700\">[<\/span><span style=\"color: #DD0000\">'items_name'<\/span><span style=\"color: #007700\">]&nbsp;??&nbsp;[]; <br \/><\/span><span style=\"color: #0000BB\">$descs&nbsp;<\/span><span style=\"color: #007700\">=&nbsp;<\/span><span style=\"color: #0000BB\">$_POST<\/span><span style=\"color: #007700\">[<\/span><span style=\"color: #DD0000\">'items_desc'<\/span><span style=\"color: #007700\">]&nbsp;??&nbsp;[]; <br \/><\/span><span style=\"color: #0000BB\">$qtys&nbsp;<\/span><span style=\"color: #007700\">=&nbsp;<\/span><span style=\"color: #0000BB\">$_POST<\/span><span style=\"color: #007700\">[<\/span><span style=\"color: #DD0000\">'items_qty'<\/span><span style=\"color: #007700\">]&nbsp;??&nbsp;[]; <br \/><\/span><span style=\"color: #0000BB\">$prices&nbsp;<\/span><span style=\"color: #007700\">=&nbsp;<\/span><span style=\"color: #0000BB\">$_POST<\/span><span style=\"color: #007700\">[<\/span><span style=\"color: #DD0000\">'items_price'<\/span><span style=\"color: #007700\">]&nbsp;??&nbsp;[]; <br \/>for(<\/span><span style=\"color: #0000BB\">$i<\/span><span style=\"color: #007700\">=<\/span><span style=\"color: #0000BB\">0<\/span><span style=\"color: #007700\">;<\/span><span style=\"color: #0000BB\">$i<\/span><span style=\"color: #007700\">&lt;<\/span><span style=\"color: #0000BB\">count<\/span><span style=\"color: #007700\">(<\/span><span style=\"color: #0000BB\">$names<\/span><span style=\"color: #007700\">);<\/span><span style=\"color: #0000BB\">$i<\/span><span style=\"color: #007700\">++){ <br \/>&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span style=\"color: #0000BB\">$n&nbsp;<\/span><span style=\"color: #007700\">=&nbsp;<\/span><span style=\"color: #0000BB\">clean<\/span><span style=\"color: #007700\">(<\/span><span style=\"color: #0000BB\">$names<\/span><span style=\"color: #007700\">[<\/span><span style=\"color: #0000BB\">$i<\/span><span style=\"color: #007700\">]&nbsp;??&nbsp;<\/span><span style=\"color: #DD0000\">''<\/span><span style=\"color: #007700\">); <br \/>&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span style=\"color: #0000BB\">$d&nbsp;<\/span><span style=\"color: #007700\">=&nbsp;<\/span><span style=\"color: #0000BB\">clean<\/span><span style=\"color: #007700\">(<\/span><span style=\"color: #0000BB\">$descs<\/span><span style=\"color: #007700\">[<\/span><span style=\"color: #0000BB\">$i<\/span><span style=\"color: #007700\">]&nbsp;??&nbsp;<\/span><span style=\"color: #DD0000\">''<\/span><span style=\"color: #007700\">); <br \/>&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span style=\"color: #0000BB\">$q&nbsp;<\/span><span style=\"color: #007700\">=&nbsp;<\/span><span style=\"color: #0000BB\">intval<\/span><span style=\"color: #007700\">(<\/span><span style=\"color: #0000BB\">$qtys<\/span><span style=\"color: #007700\">[<\/span><span style=\"color: #0000BB\">$i<\/span><span style=\"color: #007700\">]&nbsp;??&nbsp;<\/span><span style=\"color: #0000BB\">0<\/span><span style=\"color: #007700\">); <br \/>&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span style=\"color: #0000BB\">$p&nbsp;<\/span><span style=\"color: #007700\">=&nbsp;<\/span><span style=\"color: #0000BB\">floatval_safe<\/span><span style=\"color: #007700\">(<\/span><span style=\"color: #0000BB\">$prices<\/span><span style=\"color: #007700\">[<\/span><span style=\"color: #0000BB\">$i<\/span><span style=\"color: #007700\">]&nbsp;??&nbsp;<\/span><span style=\"color: #0000BB\">0<\/span><span style=\"color: #007700\">); <br \/>&nbsp;&nbsp;&nbsp;&nbsp;if(<\/span><span style=\"color: #0000BB\">$n&nbsp;<\/span><span style=\"color: #007700\">===&nbsp;<\/span><span style=\"color: #DD0000\">''&nbsp;<\/span><span style=\"color: #007700\">&amp;&amp;&nbsp;<\/span><span style=\"color: #0000BB\">$d&nbsp;<\/span><span style=\"color: #007700\">===&nbsp;<\/span><span style=\"color: #DD0000\">''&nbsp;<\/span><span style=\"color: #007700\">&amp;&amp;&nbsp;<\/span><span style=\"color: #0000BB\">$q<\/span><span style=\"color: #007700\">&lt;=<\/span><span style=\"color: #0000BB\">0&nbsp;<\/span><span style=\"color: #007700\">&amp;&amp;&nbsp;<\/span><span style=\"color: #0000BB\">$p<\/span><span style=\"color: #007700\">==<\/span><span style=\"color: #0000BB\">0<\/span><span style=\"color: #007700\">)&nbsp;continue; <br \/>&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span style=\"color: #0000BB\">$items<\/span><span style=\"color: #007700\">[]&nbsp;=&nbsp;[<\/span><span style=\"color: #DD0000\">'name'<\/span><span style=\"color: #007700\">=&gt;<\/span><span style=\"color: #0000BB\">$n<\/span><span style=\"color: #007700\">,<\/span><span style=\"color: #DD0000\">'desc'<\/span><span style=\"color: #007700\">=&gt;<\/span><span style=\"color: #0000BB\">$d<\/span><span style=\"color: #007700\">,<\/span><span style=\"color: #DD0000\">'qty'<\/span><span style=\"color: #007700\">=&gt;<\/span><span style=\"color: #0000BB\">$q<\/span><span style=\"color: #007700\">,<\/span><span style=\"color: #DD0000\">'price'<\/span><span style=\"color: #007700\">=&gt;<\/span><span style=\"color: #0000BB\">$p<\/span><span style=\"color: #007700\">]; <br \/>} <br \/>if(empty(<\/span><span style=\"color: #0000BB\">$items<\/span><span style=\"color: #007700\">)){ <br \/>&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span style=\"color: #0000BB\">http_response_code<\/span><span style=\"color: #007700\">(<\/span><span style=\"color: #0000BB\">400<\/span><span style=\"color: #007700\">); <br \/>&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;<\/span><span style=\"color: #DD0000\">'At&nbsp;least&nbsp;one&nbsp;invoice&nbsp;item&nbsp;is&nbsp;required.'<\/span><span style=\"color: #007700\">; <br \/>&nbsp;&nbsp;&nbsp;&nbsp;exit; <br \/>} <br \/> <br \/><\/span><span style=\"color: #FF8000\">\/\/&nbsp;Handle&nbsp;logo&nbsp;upload&nbsp;(optional). <br \/><\/span><span style=\"color: #0000BB\">$tempLogo&nbsp;<\/span><span style=\"color: #007700\">=&nbsp;<\/span><span style=\"color: #DD0000\">''<\/span><span style=\"color: #007700\">; <br \/>if&nbsp;(!empty(<\/span><span style=\"color: #0000BB\">$_FILES<\/span><span style=\"color: #007700\">[<\/span><span style=\"color: #DD0000\">'logo'<\/span><span style=\"color: #007700\">])&nbsp;&amp;&amp;&nbsp;<\/span><span style=\"color: #0000BB\">$_FILES<\/span><span style=\"color: #007700\">[<\/span><span style=\"color: #DD0000\">'logo'<\/span><span style=\"color: #007700\">][<\/span><span style=\"color: #DD0000\">'error'<\/span><span style=\"color: #007700\">]&nbsp;!==&nbsp;<\/span><span style=\"color: #0000BB\">UPLOAD_ERR_NO_FILE<\/span><span style=\"color: #007700\">)&nbsp;{ <br \/>&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span style=\"color: #FF8000\">\/\/&nbsp;Check&nbsp;for&nbsp;upload&nbsp;errors <br \/>&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span style=\"color: #007700\">if&nbsp;(<\/span><span style=\"color: #0000BB\">$_FILES<\/span><span style=\"color: #007700\">[<\/span><span style=\"color: #DD0000\">'logo'<\/span><span style=\"color: #007700\">][<\/span><span style=\"color: #DD0000\">'error'<\/span><span style=\"color: #007700\">]&nbsp;!==&nbsp;<\/span><span style=\"color: #0000BB\">UPLOAD_ERR_OK<\/span><span style=\"color: #007700\">)&nbsp;{ <br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span style=\"color: #0000BB\">http_response_code<\/span><span style=\"color: #007700\">(<\/span><span style=\"color: #0000BB\">400<\/span><span style=\"color: #007700\">); <br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(<\/span><span style=\"color: #DD0000\">'Logo&nbsp;upload&nbsp;error'<\/span><span style=\"color: #007700\">); <br \/>&nbsp;&nbsp;&nbsp;&nbsp;} <br \/> <br \/>&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span style=\"color: #FF8000\">\/\/&nbsp;File&nbsp;type&nbsp;validation <br \/>&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span style=\"color: #0000BB\">$allowed&nbsp;<\/span><span style=\"color: #007700\">=&nbsp;[<\/span><span style=\"color: #DD0000\">'image\/png'<\/span><span style=\"color: #007700\">,&nbsp;<\/span><span style=\"color: #DD0000\">'image\/jpeg'<\/span><span style=\"color: #007700\">,&nbsp;<\/span><span style=\"color: #DD0000\">'image\/gif'<\/span><span style=\"color: #007700\">]; <br \/> <br \/>&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span style=\"color: #0000BB\">$finfo&nbsp;<\/span><span style=\"color: #007700\">=&nbsp;<\/span><span style=\"color: #0000BB\">finfo_open<\/span><span style=\"color: #007700\">(<\/span><span style=\"color: #0000BB\">FILEINFO_MIME_TYPE<\/span><span style=\"color: #007700\">); <br \/>&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span style=\"color: #0000BB\">$mime&nbsp;&nbsp;<\/span><span style=\"color: #007700\">=&nbsp;<\/span><span style=\"color: #0000BB\">finfo_file<\/span><span style=\"color: #007700\">(<\/span><span style=\"color: #0000BB\">$finfo<\/span><span style=\"color: #007700\">,&nbsp;<\/span><span style=\"color: #0000BB\">$_FILES<\/span><span style=\"color: #007700\">[<\/span><span style=\"color: #DD0000\">'logo'<\/span><span style=\"color: #007700\">][<\/span><span style=\"color: #DD0000\">'tmp_name'<\/span><span style=\"color: #007700\">]); <br \/>&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span style=\"color: #0000BB\">finfo_close<\/span><span style=\"color: #007700\">(<\/span><span style=\"color: #0000BB\">$finfo<\/span><span style=\"color: #007700\">); <br \/> <br \/>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!<\/span><span style=\"color: #0000BB\">in_array<\/span><span style=\"color: #007700\">(<\/span><span style=\"color: #0000BB\">$mime<\/span><span style=\"color: #007700\">,&nbsp;<\/span><span style=\"color: #0000BB\">$allowed<\/span><span style=\"color: #007700\">))&nbsp;{ <br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span style=\"color: #0000BB\">http_response_code<\/span><span style=\"color: #007700\">(<\/span><span style=\"color: #0000BB\">400<\/span><span style=\"color: #007700\">); <br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(<\/span><span style=\"color: #DD0000\">'Invalid&nbsp;logo&nbsp;type'<\/span><span style=\"color: #007700\">); <br \/>&nbsp;&nbsp;&nbsp;&nbsp;} <br \/> <br \/>&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span style=\"color: #FF8000\">\/\/&nbsp;File&nbsp;size&nbsp;limit&nbsp;(2MB) <br \/>&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span style=\"color: #007700\">if&nbsp;(<\/span><span style=\"color: #0000BB\">$_FILES<\/span><span style=\"color: #007700\">[<\/span><span style=\"color: #DD0000\">'logo'<\/span><span style=\"color: #007700\">][<\/span><span style=\"color: #DD0000\">'size'<\/span><span style=\"color: #007700\">]&nbsp;&gt;&nbsp;<\/span><span style=\"color: #0000BB\">2&nbsp;<\/span><span style=\"color: #007700\">*&nbsp;<\/span><span style=\"color: #0000BB\">1024&nbsp;<\/span><span style=\"color: #007700\">*&nbsp;<\/span><span style=\"color: #0000BB\">1024<\/span><span style=\"color: #007700\">)&nbsp;{ <br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span style=\"color: #0000BB\">http_response_code<\/span><span style=\"color: #007700\">(<\/span><span style=\"color: #0000BB\">400<\/span><span style=\"color: #007700\">); <br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(<\/span><span style=\"color: #DD0000\">'Logo&nbsp;too&nbsp;large'<\/span><span style=\"color: #007700\">); <br \/>&nbsp;&nbsp;&nbsp;&nbsp;} <br \/> <br \/>&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span style=\"color: #FF8000\">\/\/&nbsp;Temp&nbsp;file&nbsp;path <br \/>&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span style=\"color: #0000BB\">$tmpPath&nbsp;<\/span><span style=\"color: #007700\">=&nbsp;<\/span><span style=\"color: #0000BB\">$_FILES<\/span><span style=\"color: #007700\">[<\/span><span style=\"color: #DD0000\">'logo'<\/span><span style=\"color: #007700\">][<\/span><span style=\"color: #DD0000\">'tmp_name'<\/span><span style=\"color: #007700\">]; <br \/> <br \/>&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span style=\"color: #FF8000\">\/\/&nbsp;Build&nbsp;base64&nbsp;data&nbsp;URI <br \/>&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span style=\"color: #0000BB\">$imageData&nbsp;<\/span><span style=\"color: #007700\">=&nbsp;<\/span><span style=\"color: #0000BB\">file_get_contents<\/span><span style=\"color: #007700\">(<\/span><span style=\"color: #0000BB\">$tmpPath<\/span><span style=\"color: #007700\">); <br \/>&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span style=\"color: #0000BB\">$base64&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span style=\"color: #007700\">=&nbsp;<\/span><span style=\"color: #DD0000\">'data:'&nbsp;<\/span><span style=\"color: #007700\">.&nbsp;<\/span><span style=\"color: #0000BB\">$mime&nbsp;<\/span><span style=\"color: #007700\">.&nbsp;<\/span><span style=\"color: #DD0000\">';base64,'&nbsp;<\/span><span style=\"color: #007700\">.&nbsp;<\/span><span style=\"color: #0000BB\">base64_encode<\/span><span style=\"color: #007700\">(<\/span><span style=\"color: #0000BB\">$imageData<\/span><span style=\"color: #007700\">); <br \/>&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span style=\"color: #0000BB\">$tempLogo&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span style=\"color: #007700\">=&nbsp;<\/span><span style=\"color: #0000BB\">str_replace<\/span><span style=\"color: #007700\">(<\/span><span style=\"color: #DD0000\">'&nbsp;'<\/span><span style=\"color: #007700\">,&nbsp;<\/span><span style=\"color: #DD0000\">'+'<\/span><span style=\"color: #007700\">,&nbsp;<\/span><span style=\"color: #0000BB\">$base64<\/span><span style=\"color: #007700\">); <br \/>} <br \/> <br \/><\/span><span style=\"color: #FF8000\">\/\/&nbsp;Build&nbsp;HTML&nbsp;for&nbsp;PDF <br \/><\/span><span style=\"color: #007700\">function&nbsp;<\/span><span style=\"color: #0000BB\">money<\/span><span style=\"color: #007700\">(<\/span><span style=\"color: #0000BB\">$v<\/span><span style=\"color: #007700\">){&nbsp;return&nbsp;<\/span><span style=\"color: #0000BB\">number_format<\/span><span style=\"color: #007700\">((float)<\/span><span style=\"color: #0000BB\">$v<\/span><span style=\"color: #007700\">,<\/span><span style=\"color: #0000BB\">2<\/span><span style=\"color: #007700\">);&nbsp;} <br \/><\/span><span style=\"color: #0000BB\">$subtotal&nbsp;<\/span><span style=\"color: #007700\">=&nbsp;<\/span><span style=\"color: #0000BB\">0<\/span><span style=\"color: #007700\">; <br \/><\/span><span style=\"color: #0000BB\">$itemsHtml&nbsp;<\/span><span style=\"color: #007700\">=&nbsp;<\/span><span style=\"color: #DD0000\">''<\/span><span style=\"color: #007700\">; <br \/>foreach(<\/span><span style=\"color: #0000BB\">$items&nbsp;<\/span><span style=\"color: #007700\">as&nbsp;<\/span><span style=\"color: #0000BB\">$it<\/span><span style=\"color: #007700\">){ <br \/>&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span style=\"color: #0000BB\">$line&nbsp;<\/span><span style=\"color: #007700\">=&nbsp;<\/span><span style=\"color: #0000BB\">$it<\/span><span style=\"color: #007700\">[<\/span><span style=\"color: #DD0000\">'qty'<\/span><span style=\"color: #007700\">]&nbsp;*&nbsp;<\/span><span style=\"color: #0000BB\">$it<\/span><span style=\"color: #007700\">[<\/span><span style=\"color: #DD0000\">'price'<\/span><span style=\"color: #007700\">]; <br \/>&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span style=\"color: #0000BB\">$subtotal&nbsp;<\/span><span style=\"color: #007700\">+=&nbsp;<\/span><span style=\"color: #0000BB\">$line<\/span><span style=\"color: #007700\">; <br \/>&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span style=\"color: #0000BB\">$itemsHtml&nbsp;<\/span><span style=\"color: #007700\">.=&nbsp;<\/span><span style=\"color: #DD0000\">\"&lt;tr&gt;\\n\"<\/span><span style=\"color: #007700\">. <br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span style=\"color: #DD0000\">\"&lt;td&nbsp;style=\\\"border:1px&nbsp;solid&nbsp;#ccc;padding:8px;\\\"&gt;\"<\/span><span style=\"color: #007700\">.&nbsp;<\/span><span style=\"color: #0000BB\">$it<\/span><span style=\"color: #007700\">[<\/span><span style=\"color: #DD0000\">'name'<\/span><span style=\"color: #007700\">]&nbsp;.<\/span><span style=\"color: #DD0000\">\"&lt;\/td&gt;\\n\"<\/span><span style=\"color: #007700\">. <br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span style=\"color: #DD0000\">\"&lt;td&nbsp;style=\\\"border:1px&nbsp;solid&nbsp;#ccc;padding:8px;\\\"&gt;\"<\/span><span style=\"color: #007700\">.&nbsp;<\/span><span style=\"color: #0000BB\">$it<\/span><span style=\"color: #007700\">[<\/span><span style=\"color: #DD0000\">'desc'<\/span><span style=\"color: #007700\">]&nbsp;.<\/span><span style=\"color: #DD0000\">\"&lt;\/td&gt;\\n\"<\/span><span style=\"color: #007700\">. <br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span style=\"color: #DD0000\">\"&lt;td&nbsp;style=\\\"border:1px&nbsp;solid&nbsp;#ccc;padding:8px;text-align:right;\\\"&gt;\"<\/span><span style=\"color: #007700\">.&nbsp;<\/span><span style=\"color: #0000BB\">$it<\/span><span style=\"color: #007700\">[<\/span><span style=\"color: #DD0000\">'qty'<\/span><span style=\"color: #007700\">]&nbsp;.<\/span><span style=\"color: #DD0000\">\"&lt;\/td&gt;\\n\"<\/span><span style=\"color: #007700\">. <br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span style=\"color: #DD0000\">\"&lt;td&nbsp;style=\\\"border:1px&nbsp;solid&nbsp;#ccc;padding:8px;text-align:right;\\\"&gt;\"<\/span><span style=\"color: #007700\">.&nbsp;<\/span><span style=\"color: #0000BB\">money<\/span><span style=\"color: #007700\">(<\/span><span style=\"color: #0000BB\">$it<\/span><span style=\"color: #007700\">[<\/span><span style=\"color: #DD0000\">'price'<\/span><span style=\"color: #007700\">])&nbsp;.<\/span><span style=\"color: #DD0000\">\"&lt;\/td&gt;\\n\"<\/span><span style=\"color: #007700\">. <br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span style=\"color: #DD0000\">\"&lt;td&nbsp;style=\\\"border:1px&nbsp;solid&nbsp;#ccc;padding:8px;text-align:right;\\\"&gt;\"<\/span><span style=\"color: #007700\">.&nbsp;<\/span><span style=\"color: #0000BB\">money<\/span><span style=\"color: #007700\">(<\/span><span style=\"color: #0000BB\">$line<\/span><span style=\"color: #007700\">)&nbsp;.<\/span><span style=\"color: #DD0000\">\"&lt;\/td&gt;\\n\"<\/span><span style=\"color: #007700\">. <br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span style=\"color: #DD0000\">\"&lt;\/tr&gt;\\n\"<\/span><span style=\"color: #007700\">; <br \/>} <br \/><\/span><span style=\"color: #0000BB\">$taxAmt&nbsp;<\/span><span style=\"color: #007700\">=&nbsp;<\/span><span style=\"color: #0000BB\">$subtotal&nbsp;<\/span><span style=\"color: #007700\">*&nbsp;(<\/span><span style=\"color: #0000BB\">$tax<\/span><span style=\"color: #007700\">\/<\/span><span style=\"color: #0000BB\">100<\/span><span style=\"color: #007700\">); <br \/><\/span><span style=\"color: #0000BB\">$total&nbsp;<\/span><span style=\"color: #007700\">=&nbsp;<\/span><span style=\"color: #0000BB\">$subtotal&nbsp;<\/span><span style=\"color: #007700\">+&nbsp;<\/span><span style=\"color: #0000BB\">$taxAmt<\/span><span style=\"color: #007700\">; <br \/> <br \/><\/span><span style=\"color: #0000BB\">$html&nbsp;<\/span><span style=\"color: #007700\">=&nbsp;<\/span><span style=\"color: #DD0000\">'&lt;!doctype&nbsp;html&gt;&lt;html&gt;&lt;head&gt;&lt;meta&nbsp;charset=\"utf-8\"&gt;&lt;style&gt;'&nbsp;<\/span><span style=\"color: #007700\">. <br \/>&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span style=\"color: #DD0000\">'body{font-family:Arial,Helvetica,sans-serif;font-size:12px;color:#222}&nbsp;.header{display:flex;justify-content:space-between;align-items:center}&nbsp;.seller{font-weight:700}'&nbsp;<\/span><span style=\"color: #007700\">. <br \/>&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span style=\"color: #DD0000\">'table{width:100%;border-collapse:collapse;margin-top:12px}'&nbsp;<\/span><span style=\"color: #007700\">. <br \/>&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span style=\"color: #DD0000\">'&lt;\/style&gt;&lt;\/head&gt;&lt;body&gt;'<\/span><span style=\"color: #007700\">; <br \/><\/span><span style=\"color: #0000BB\">$html&nbsp;<\/span><span style=\"color: #007700\">.=&nbsp;<\/span><span style=\"color: #DD0000\">'&lt;div&nbsp;class=\"header\"&gt;'<\/span><span style=\"color: #007700\">; <br \/><\/span><span style=\"color: #0000BB\">$html&nbsp;<\/span><span style=\"color: #007700\">.=&nbsp;<\/span><span style=\"color: #DD0000\">'&lt;div&nbsp;class=\"left\"&gt;'<\/span><span style=\"color: #007700\">; <br \/> <br \/>if&nbsp;(!empty(<\/span><span style=\"color: #0000BB\">$tempLogo<\/span><span style=\"color: #007700\">))&nbsp;{ <br \/>&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span style=\"color: #0000BB\">$html&nbsp;<\/span><span style=\"color: #007700\">.=&nbsp;<\/span><span style=\"color: #DD0000\">'&lt;img&nbsp;src=\"'&nbsp;<\/span><span style=\"color: #007700\">.&nbsp;<\/span><span style=\"color: #0000BB\">$tempLogo&nbsp;<\/span><span style=\"color: #007700\">.&nbsp;<\/span><span style=\"color: #DD0000\">'\"&nbsp;height=\"80\"&nbsp;style=\"margin-bottom:10px;\"&gt;'<\/span><span style=\"color: #007700\">; <br \/>} <br \/> <br \/><\/span><span style=\"color: #0000BB\">$html&nbsp;<\/span><span style=\"color: #007700\">.=&nbsp;<\/span><span style=\"color: #DD0000\">'&lt;div&nbsp;class=\"seller\"&gt;'<\/span><span style=\"color: #007700\">.&nbsp;<\/span><span style=\"color: #0000BB\">$seller<\/span><span style=\"color: #007700\">[<\/span><span style=\"color: #DD0000\">'business'<\/span><span style=\"color: #007700\">]&nbsp;.<\/span><span style=\"color: #DD0000\">'&lt;\/div&gt;'<\/span><span style=\"color: #007700\">; <br \/><\/span><span style=\"color: #0000BB\">$html&nbsp;<\/span><span style=\"color: #007700\">.=&nbsp;<\/span><span style=\"color: #DD0000\">'&lt;div&gt;'<\/span><span style=\"color: #007700\">.&nbsp;<\/span><span style=\"color: #0000BB\">$seller<\/span><span style=\"color: #007700\">[<\/span><span style=\"color: #DD0000\">'address'<\/span><span style=\"color: #007700\">]&nbsp;.<\/span><span style=\"color: #DD0000\">'&lt;br&gt;'<\/span><span style=\"color: #007700\">.&nbsp;<\/span><span style=\"color: #0000BB\">$seller<\/span><span style=\"color: #007700\">[<\/span><span style=\"color: #DD0000\">'city'<\/span><span style=\"color: #007700\">].<\/span><span style=\"color: #DD0000\">'&nbsp;'<\/span><span style=\"color: #007700\">.&nbsp;<\/span><span style=\"color: #0000BB\">$seller<\/span><span style=\"color: #007700\">[<\/span><span style=\"color: #DD0000\">'state'<\/span><span style=\"color: #007700\">].<\/span><span style=\"color: #DD0000\">'&nbsp;'<\/span><span style=\"color: #007700\">.&nbsp;<\/span><span style=\"color: #0000BB\">$seller<\/span><span style=\"color: #007700\">[<\/span><span style=\"color: #DD0000\">'zip'<\/span><span style=\"color: #007700\">].<\/span><span style=\"color: #DD0000\">'&lt;br&gt;'<\/span><span style=\"color: #007700\">.&nbsp;<\/span><span style=\"color: #0000BB\">$seller<\/span><span style=\"color: #007700\">[<\/span><span style=\"color: #DD0000\">'country'<\/span><span style=\"color: #007700\">]&nbsp;.<\/span><span style=\"color: #DD0000\">'&lt;\/div&gt;'<\/span><span style=\"color: #007700\">; <br \/><\/span><span style=\"color: #0000BB\">$html&nbsp;<\/span><span style=\"color: #007700\">.=&nbsp;<\/span><span style=\"color: #DD0000\">'&lt;\/div&gt;'<\/span><span style=\"color: #007700\">; <br \/><\/span><span style=\"color: #0000BB\">$html&nbsp;<\/span><span style=\"color: #007700\">.=&nbsp;<\/span><span style=\"color: #DD0000\">'&lt;div&nbsp;class=\"right\"&gt;'<\/span><span style=\"color: #007700\">; <br \/><\/span><span style=\"color: #0000BB\">$html&nbsp;<\/span><span style=\"color: #007700\">.=&nbsp;<\/span><span style=\"color: #DD0000\">'&lt;h2&gt;Invoice&lt;\/h2&gt;'<\/span><span style=\"color: #007700\">; <br \/><\/span><span style=\"color: #0000BB\">$html&nbsp;<\/span><span style=\"color: #007700\">.=&nbsp;<\/span><span style=\"color: #DD0000\">'&lt;div&gt;&lt;strong&gt;Invoice&nbsp;#:&lt;\/strong&gt;&nbsp;'<\/span><span style=\"color: #007700\">.&nbsp;<\/span><span style=\"color: #0000BB\">$invoice<\/span><span style=\"color: #007700\">[<\/span><span style=\"color: #DD0000\">'number'<\/span><span style=\"color: #007700\">]&nbsp;.<\/span><span style=\"color: #DD0000\">'&lt;\/div&gt;'<\/span><span style=\"color: #007700\">; <br \/><\/span><span style=\"color: #0000BB\">$html&nbsp;<\/span><span style=\"color: #007700\">.=&nbsp;<\/span><span style=\"color: #DD0000\">'&lt;div&gt;&lt;strong&gt;Issue:&lt;\/strong&gt;&nbsp;'<\/span><span style=\"color: #007700\">.&nbsp;<\/span><span style=\"color: #0000BB\">$invoice<\/span><span style=\"color: #007700\">[<\/span><span style=\"color: #DD0000\">'issue'<\/span><span style=\"color: #007700\">]&nbsp;.<\/span><span style=\"color: #DD0000\">'&lt;\/div&gt;'<\/span><span style=\"color: #007700\">; <br \/><\/span><span style=\"color: #0000BB\">$html&nbsp;<\/span><span style=\"color: #007700\">.=&nbsp;<\/span><span style=\"color: #DD0000\">'&lt;div&gt;&lt;strong&gt;Due:&lt;\/strong&gt;&nbsp;'<\/span><span style=\"color: #007700\">.&nbsp;<\/span><span style=\"color: #0000BB\">$invoice<\/span><span style=\"color: #007700\">[<\/span><span style=\"color: #DD0000\">'due'<\/span><span style=\"color: #007700\">]&nbsp;.<\/span><span style=\"color: #DD0000\">'&lt;\/div&gt;'<\/span><span style=\"color: #007700\">; <br \/><\/span><span style=\"color: #0000BB\">$html&nbsp;<\/span><span style=\"color: #007700\">.=&nbsp;<\/span><span style=\"color: #DD0000\">'&lt;\/div&gt;&lt;\/div&gt;'<\/span><span style=\"color: #007700\">; <br \/> <br \/><\/span><span style=\"color: #0000BB\">$html&nbsp;<\/span><span style=\"color: #007700\">.=&nbsp;<\/span><span style=\"color: #DD0000\">'&lt;hr&gt;'<\/span><span style=\"color: #007700\">; <br \/><\/span><span style=\"color: #0000BB\">$html&nbsp;<\/span><span style=\"color: #007700\">.=&nbsp;<\/span><span style=\"color: #DD0000\">'&lt;div&nbsp;style=\"display:flex;justify-content:space-between\"&gt;'<\/span><span style=\"color: #007700\">; <br \/><\/span><span style=\"color: #0000BB\">$html&nbsp;<\/span><span style=\"color: #007700\">.=&nbsp;<\/span><span style=\"color: #DD0000\">'&lt;div&gt;&lt;strong&gt;Bill&nbsp;To:&lt;\/strong&gt;&lt;br&gt;'<\/span><span style=\"color: #007700\">.&nbsp;<\/span><span style=\"color: #0000BB\">$customer<\/span><span style=\"color: #007700\">[<\/span><span style=\"color: #DD0000\">'first'<\/span><span style=\"color: #007700\">].<\/span><span style=\"color: #DD0000\">'&nbsp;'<\/span><span style=\"color: #007700\">.&nbsp;<\/span><span style=\"color: #0000BB\">$customer<\/span><span style=\"color: #007700\">[<\/span><span style=\"color: #DD0000\">'last'<\/span><span style=\"color: #007700\">]&nbsp;.<\/span><span style=\"color: #DD0000\">'&lt;br&gt;'<\/span><span style=\"color: #007700\">.&nbsp;<\/span><span style=\"color: #0000BB\">$customer<\/span><span style=\"color: #007700\">[<\/span><span style=\"color: #DD0000\">'business'<\/span><span style=\"color: #007700\">]&nbsp;.<\/span><span style=\"color: #DD0000\">'&lt;br&gt;'<\/span><span style=\"color: #007700\">.&nbsp;<\/span><span style=\"color: #0000BB\">$customer<\/span><span style=\"color: #007700\">[<\/span><span style=\"color: #DD0000\">'address'<\/span><span style=\"color: #007700\">]&nbsp;.<\/span><span style=\"color: #DD0000\">'&lt;br&gt;'<\/span><span style=\"color: #007700\">.&nbsp;<\/span><span style=\"color: #0000BB\">$customer<\/span><span style=\"color: #007700\">[<\/span><span style=\"color: #DD0000\">'city'<\/span><span style=\"color: #007700\">].<\/span><span style=\"color: #DD0000\">'&nbsp;'<\/span><span style=\"color: #007700\">.&nbsp;<\/span><span style=\"color: #0000BB\">$customer<\/span><span style=\"color: #007700\">[<\/span><span style=\"color: #DD0000\">'state'<\/span><span style=\"color: #007700\">].<\/span><span style=\"color: #DD0000\">'&nbsp;'<\/span><span style=\"color: #007700\">.&nbsp;<\/span><span style=\"color: #0000BB\">$customer<\/span><span style=\"color: #007700\">[<\/span><span style=\"color: #DD0000\">'zip'<\/span><span style=\"color: #007700\">]&nbsp;.<\/span><span style=\"color: #DD0000\">'&lt;br&gt;'<\/span><span style=\"color: #007700\">.&nbsp;<\/span><span style=\"color: #0000BB\">$customer<\/span><span style=\"color: #007700\">[<\/span><span style=\"color: #DD0000\">'country'<\/span><span style=\"color: #007700\">]&nbsp;.<\/span><span style=\"color: #DD0000\">'&lt;\/div&gt;'<\/span><span style=\"color: #007700\">; <br \/><\/span><span style=\"color: #0000BB\">$html&nbsp;<\/span><span style=\"color: #007700\">.=&nbsp;<\/span><span style=\"color: #DD0000\">'&lt;\/div&gt;'<\/span><span style=\"color: #007700\">; <br \/> <br \/><\/span><span style=\"color: #0000BB\">$html&nbsp;<\/span><span style=\"color: #007700\">.=&nbsp;<\/span><span style=\"color: #DD0000\">'&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&nbsp;style=\"border:1px&nbsp;solid&nbsp;#ccc;padding:8px\"&gt;Item&lt;\/th&gt;&lt;th&nbsp;style=\"border:1px&nbsp;solid&nbsp;#ccc;padding:8px\"&gt;Description&lt;\/th&gt;&lt;th&nbsp;style=\"border:1px&nbsp;solid&nbsp;#ccc;padding:8px\"&gt;Qty&lt;\/th&gt;&lt;th&nbsp;style=\"border:1px&nbsp;solid&nbsp;#ccc;padding:8px\"&gt;Price&lt;\/th&gt;&lt;th&nbsp;style=\"border:1px&nbsp;solid&nbsp;#ccc;padding:8px\"&gt;Line&nbsp;Total&lt;\/th&gt;&lt;\/tr&gt;&lt;\/thead&gt;&lt;tbody&gt;'<\/span><span style=\"color: #007700\">; <br \/><\/span><span style=\"color: #0000BB\">$html&nbsp;<\/span><span style=\"color: #007700\">.=&nbsp;<\/span><span style=\"color: #0000BB\">$itemsHtml<\/span><span style=\"color: #007700\">; <br \/><\/span><span style=\"color: #0000BB\">$html&nbsp;<\/span><span style=\"color: #007700\">.=&nbsp;<\/span><span style=\"color: #DD0000\">'&lt;\/tbody&gt;&lt;\/table&gt;'<\/span><span style=\"color: #007700\">; <br \/> <br \/><\/span><span style=\"color: #0000BB\">$html&nbsp;<\/span><span style=\"color: #007700\">.=&nbsp;<\/span><span style=\"color: #DD0000\">'&lt;div&nbsp;style=\"width:300px;margin-left:auto;margin-top:12px\"&gt;'<\/span><span style=\"color: #007700\">; <br \/><\/span><span style=\"color: #0000BB\">$html&nbsp;<\/span><span style=\"color: #007700\">.=&nbsp;<\/span><span style=\"color: #DD0000\">'&lt;table&nbsp;style=\"width:100%\"&gt;'<\/span><span style=\"color: #007700\">; <br \/><\/span><span style=\"color: #0000BB\">$html&nbsp;<\/span><span style=\"color: #007700\">.=&nbsp;<\/span><span style=\"color: #DD0000\">'&lt;tr&gt;&lt;td&nbsp;style=\"padding:6px\"&gt;Subtotal:&lt;\/td&gt;&lt;td&nbsp;style=\"padding:6px;text-align:right\"&gt;$'<\/span><span style=\"color: #007700\">.<\/span><span style=\"color: #0000BB\">money<\/span><span style=\"color: #007700\">(<\/span><span style=\"color: #0000BB\">$subtotal<\/span><span style=\"color: #007700\">).<\/span><span style=\"color: #DD0000\">'&lt;\/td&gt;&lt;\/tr&gt;'<\/span><span style=\"color: #007700\">; <br \/><\/span><span style=\"color: #0000BB\">$html&nbsp;<\/span><span style=\"color: #007700\">.=&nbsp;<\/span><span style=\"color: #DD0000\">'&lt;tr&gt;&lt;td&nbsp;style=\"padding:6px\"&gt;Tax&nbsp;('<\/span><span style=\"color: #007700\">.<\/span><span style=\"color: #0000BB\">htmlspecialchars<\/span><span style=\"color: #007700\">(<\/span><span style=\"color: #0000BB\">$tax<\/span><span style=\"color: #007700\">).<\/span><span style=\"color: #DD0000\">'%):&lt;\/td&gt;&lt;td&nbsp;style=\"padding:6px;text-align:right\"&gt;$'<\/span><span style=\"color: #007700\">.<\/span><span style=\"color: #0000BB\">money<\/span><span style=\"color: #007700\">(<\/span><span style=\"color: #0000BB\">$taxAmt<\/span><span style=\"color: #007700\">).<\/span><span style=\"color: #DD0000\">'&lt;\/td&gt;&lt;\/tr&gt;'<\/span><span style=\"color: #007700\">; <br \/><\/span><span style=\"color: #0000BB\">$html&nbsp;<\/span><span style=\"color: #007700\">.=&nbsp;<\/span><span style=\"color: #DD0000\">'&lt;tr&gt;&lt;td&nbsp;style=\"padding:6px;font-weight:700\"&gt;Total:&lt;\/td&gt;&lt;td&nbsp;style=\"padding:6px;text-align:right;font-weight:700\"&gt;$'<\/span><span style=\"color: #007700\">.<\/span><span style=\"color: #0000BB\">money<\/span><span style=\"color: #007700\">(<\/span><span style=\"color: #0000BB\">$total<\/span><span style=\"color: #007700\">).<\/span><span style=\"color: #DD0000\">'&lt;\/td&gt;&lt;\/tr&gt;'<\/span><span style=\"color: #007700\">; <br \/><\/span><span style=\"color: #0000BB\">$html&nbsp;<\/span><span style=\"color: #007700\">.=&nbsp;<\/span><span style=\"color: #DD0000\">'&lt;\/table&gt;&lt;\/div&gt;'<\/span><span style=\"color: #007700\">; <br \/> <br \/>if(<\/span><span style=\"color: #0000BB\">$notes<\/span><span style=\"color: #007700\">){&nbsp;<\/span><span style=\"color: #0000BB\">$html&nbsp;<\/span><span style=\"color: #007700\">.=&nbsp;<\/span><span style=\"color: #DD0000\">'&lt;h3&gt;Notes&lt;\/h3&gt;&lt;p&gt;'<\/span><span style=\"color: #007700\">.&nbsp;<\/span><span style=\"color: #0000BB\">nl2br<\/span><span style=\"color: #007700\">(<\/span><span style=\"color: #0000BB\">$notes<\/span><span style=\"color: #007700\">)&nbsp;.<\/span><span style=\"color: #DD0000\">'&lt;\/p&gt;'<\/span><span style=\"color: #007700\">;&nbsp;} <br \/> <br \/><\/span><span style=\"color: #0000BB\">$html&nbsp;<\/span><span style=\"color: #007700\">.=&nbsp;<\/span><span style=\"color: #DD0000\">'&lt;\/body&gt;&lt;\/html&gt;'<\/span><span style=\"color: #007700\">; <br \/> <br \/><\/span><span style=\"color: #FF8000\">\/\/&nbsp;Generate&nbsp;PDF&nbsp;via&nbsp;Dompdf <br \/><\/span><span style=\"color: #0000BB\">$options&nbsp;<\/span><span style=\"color: #007700\">=&nbsp;new&nbsp;<\/span><span style=\"color: #0000BB\">Options<\/span><span style=\"color: #007700\">(); <br \/><\/span><span style=\"color: #0000BB\">$options<\/span><span style=\"color: #007700\">-&gt;<\/span><span style=\"color: #0000BB\">set<\/span><span style=\"color: #007700\">(<\/span><span style=\"color: #DD0000\">'isRemoteEnabled'<\/span><span style=\"color: #007700\">,&nbsp;<\/span><span style=\"color: #0000BB\">true<\/span><span style=\"color: #007700\">); <br \/> <br \/><\/span><span style=\"color: #0000BB\">$dompdf&nbsp;<\/span><span style=\"color: #007700\">=&nbsp;new&nbsp;<\/span><span style=\"color: #0000BB\">Dompdf<\/span><span style=\"color: #007700\">(<\/span><span style=\"color: #0000BB\">$options<\/span><span style=\"color: #007700\">); <br \/><\/span><span style=\"color: #0000BB\">$dompdf<\/span><span style=\"color: #007700\">-&gt;<\/span><span style=\"color: #0000BB\">loadHtml<\/span><span style=\"color: #007700\">(<\/span><span style=\"color: #0000BB\">$html<\/span><span style=\"color: #007700\">); <br \/><\/span><span style=\"color: #0000BB\">$dompdf<\/span><span style=\"color: #007700\">-&gt;<\/span><span style=\"color: #0000BB\">setPaper<\/span><span style=\"color: #007700\">(<\/span><span style=\"color: #DD0000\">'A4'<\/span><span style=\"color: #007700\">,<\/span><span style=\"color: #DD0000\">'portrait'<\/span><span style=\"color: #007700\">); <br \/><\/span><span style=\"color: #0000BB\">$dompdf<\/span><span style=\"color: #007700\">-&gt;<\/span><span style=\"color: #0000BB\">render<\/span><span style=\"color: #007700\">(); <br \/> <br \/><\/span><span style=\"color: #FF8000\">\/\/&nbsp;Render&nbsp;PDF&nbsp;to&nbsp;string&nbsp;(avoid&nbsp;direct&nbsp;streaming&nbsp;which&nbsp;can&nbsp;be&nbsp;corrupted&nbsp;by&nbsp;prior&nbsp;output) <br \/><\/span><span style=\"color: #0000BB\">$pdf&nbsp;<\/span><span style=\"color: #007700\">=&nbsp;<\/span><span style=\"color: #0000BB\">$dompdf<\/span><span style=\"color: #007700\">-&gt;<\/span><span style=\"color: #0000BB\">output<\/span><span style=\"color: #007700\">(); <br \/> <br \/><\/span><span style=\"color: #FF8000\">\/\/&nbsp;Ensure&nbsp;no&nbsp;accidental&nbsp;output&nbsp;(warnings\/notices)&nbsp;remain&nbsp;\u2014&nbsp;clean&nbsp;all&nbsp;output&nbsp;buffers <br \/><\/span><span style=\"color: #007700\">while&nbsp;(<\/span><span style=\"color: #0000BB\">ob_get_level<\/span><span style=\"color: #007700\">()&nbsp;&gt;&nbsp;<\/span><span style=\"color: #0000BB\">0<\/span><span style=\"color: #007700\">)&nbsp;{ <br \/>&nbsp;&nbsp;&nbsp;&nbsp;@<\/span><span style=\"color: #0000BB\">ob_end_clean<\/span><span style=\"color: #007700\">(); <br \/>} <br \/> <br \/><\/span><span style=\"color: #FF8000\">\/\/&nbsp;Turn&nbsp;off&nbsp;display_errors&nbsp;so&nbsp;PHP&nbsp;won't&nbsp;inject&nbsp;warnings&nbsp;into&nbsp;the&nbsp;binary&nbsp;stream <br \/><\/span><span style=\"color: #0000BB\">ini_set<\/span><span style=\"color: #007700\">(<\/span><span style=\"color: #DD0000\">'display_errors'<\/span><span style=\"color: #007700\">,&nbsp;<\/span><span style=\"color: #DD0000\">'0'<\/span><span style=\"color: #007700\">); <br \/> <br \/><\/span><span style=\"color: #FF8000\">\/\/&nbsp;Send&nbsp;proper&nbsp;binary&nbsp;headers <br \/><\/span><span style=\"color: #0000BB\">$filename&nbsp;<\/span><span style=\"color: #007700\">=&nbsp;<\/span><span style=\"color: #DD0000\">'invoice_'<\/span><span style=\"color: #007700\">.<\/span><span style=\"color: #0000BB\">time<\/span><span style=\"color: #007700\">().<\/span><span style=\"color: #DD0000\">'.pdf'<\/span><span style=\"color: #007700\">; <br \/><\/span><span style=\"color: #0000BB\">header<\/span><span style=\"color: #007700\">(<\/span><span style=\"color: #DD0000\">'Content-Type:&nbsp;application\/pdf'<\/span><span style=\"color: #007700\">); <br \/><\/span><span style=\"color: #0000BB\">header<\/span><span style=\"color: #007700\">(<\/span><span style=\"color: #DD0000\">'Content-Disposition:&nbsp;attachment;&nbsp;filename=\"'&nbsp;<\/span><span style=\"color: #007700\">.&nbsp;<\/span><span style=\"color: #0000BB\">rawurlencode<\/span><span style=\"color: #007700\">(<\/span><span style=\"color: #0000BB\">$filename<\/span><span style=\"color: #007700\">)&nbsp;.&nbsp;<\/span><span style=\"color: #DD0000\">'\";&nbsp;filename*=UTF-8\\'\\''&nbsp;<\/span><span style=\"color: #007700\">.&nbsp;<\/span><span style=\"color: #0000BB\">rawurlencode<\/span><span style=\"color: #007700\">(<\/span><span style=\"color: #0000BB\">$filename<\/span><span style=\"color: #007700\">)); <br \/><\/span><span style=\"color: #0000BB\">header<\/span><span style=\"color: #007700\">(<\/span><span style=\"color: #DD0000\">'Content-Transfer-Encoding:&nbsp;binary'<\/span><span style=\"color: #007700\">); <br \/><\/span><span style=\"color: #0000BB\">header<\/span><span style=\"color: #007700\">(<\/span><span style=\"color: #DD0000\">'Accept-Ranges:&nbsp;bytes'<\/span><span style=\"color: #007700\">); <br \/><\/span><span style=\"color: #0000BB\">header<\/span><span style=\"color: #007700\">(<\/span><span style=\"color: #DD0000\">'Content-Length:&nbsp;'&nbsp;<\/span><span style=\"color: #007700\">.&nbsp;<\/span><span style=\"color: #0000BB\">strlen<\/span><span style=\"color: #007700\">(<\/span><span style=\"color: #0000BB\">$pdf<\/span><span style=\"color: #007700\">)); <br \/> <br \/>echo&nbsp;<\/span><span style=\"color: #0000BB\">$pdf<\/span><span style=\"color: #007700\">; <br \/>exit; <br \/><\/span><span style=\"color: #0000BB\">?&gt;<\/span><\/pre>\n<h2>\ud83d\udd10 Security &#038; Optimization Tips<\/h2>\n<ul>\n<li>Escape user input before output<\/li>\n<li>Limit upload size (2MB recommended)<\/li>\n<li>Remove uploaded logo after PDF generation<\/li>\n<li>Use HTTPS for production<\/li>\n<li>Cache fonts in Dompdf for faster rendering<\/li>\n<\/ul>\n<h2>\ud83c\udfaf Final Output<\/h2>\n<p>\u2714 Professional invoice PDF<br \/>\n\u2714 Dynamic &#038; reusable<br \/>\n\u2714 Client-ready<br \/>\n\u2714 Perfect for SaaS, billing systems, freelancers<\/p>\n<h2>\ud83d\ude80 Conclusion<\/h2>\n<p>With this guide, you can create dynamic, professional invoices in PDF format using PHP and Dompdf. Customize the template to fit your brand and business needs. This Generate Invoice PDF with PHP (AJAX) solution is:<\/p>\n<ul>\n<li>Beginner-friendly<\/li>\n<li>Production-ready<\/li>\n<li>Easily customizable<\/li>\n<li>Ideal for real-world billing applications<\/li>\n<\/ul>\n<p>You can extend this Invoice PDF Generator script further by adding Database storage, Invoice numbers, Currency selection, Email PDF to client, and Payment gateway integration. Happy coding!<\/p>\n<p>If you want complete project with all features, check out our <a href=\"https:\/\/www.codexworld.com\/scripts\/php-invoice-management-system\/\">PHP Invoice Management System Script<\/a>.<\/p>\n<h2>\ud83d\udd17 Related Resources<\/h2>\n<p>&#8211; Convert HTML to PDF in PHP with Dompdf: <a href=\"https:\/\/www.codexworld.com\/convert-html-to-pdf-php-dompdf\/\">https:\/\/www.codexworld.com\/convert-html-to-pdf-php-dompdf\/<\/a><br \/>\n&#8211; Export MySQL Data to Excel using PHP: <a href=\"https:\/\/www.codexworld.com\/export-data-to-excel-in-php\/\">https:\/\/www.codexworld.com\/export-data-to-excel-in-php\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Generate a professional invoice PDF directly from a dynamic web form using PHP, Dompdf, and AJAX for seamless downloads without page reloads. This tutorial leverages your attached scripts for a production-ready implementation with CSRF protection, <\/p>\n","protected":false},"author":1,"featured_media":5989,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[4],"tags":[28,180,394,181,14],"class_list":["post-5987","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-php","tag-ajax","tag-dompdf","tag-invoice","tag-pdf","tag-php","cat-4-id","has_thumb"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Generate Invoice PDF with PHP &amp; AJAX - CodexWorld<\/title>\n<meta name=\"description\" content=\"Learn how to generate a professional invoice PDF using PHP and AJAX. Dynamic items, tax calculation, logo upload, and instant PDF download.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.codexworld.com\/generate-invoice-pdf-with-php-ajax\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Generate Invoice PDF with PHP &amp; AJAX - CodexWorld\" \/>\n<meta property=\"og:description\" content=\"Learn how to generate a professional invoice PDF using PHP and AJAX. Dynamic items, tax calculation, logo upload, and instant PDF download.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.codexworld.com\/generate-invoice-pdf-with-php-ajax\/\" \/>\n<meta property=\"og:site_name\" content=\"CodexWorld\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/codexworld\" \/>\n<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/codexworld\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-22T05:32:07+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-01-16T14:47:34+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.codexworld.com\/wp-content\/uploads\/2025\/12\/generate-invoice-pdf-with-php-ajax-codexworld.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1536\" \/>\n\t<meta property=\"og:image:height\" content=\"864\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"CodexWorld\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@codexworldblog\" \/>\n<meta name=\"twitter:site\" content=\"@codexworldweb\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"CodexWorld\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.codexworld.com\\\/generate-invoice-pdf-with-php-ajax\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.codexworld.com\\\/generate-invoice-pdf-with-php-ajax\\\/\"},\"author\":{\"name\":\"CodexWorld\",\"@id\":\"https:\\\/\\\/www.codexworld.com\\\/#\\\/schema\\\/person\\\/9da51d8fa3cdefeb5ec9c69136d4baf0\"},\"headline\":\"Generate Invoice PDF with PHP &#038; AJAX\",\"datePublished\":\"2025-12-22T05:32:07+00:00\",\"dateModified\":\"2026-01-16T14:47:34+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.codexworld.com\\\/generate-invoice-pdf-with-php-ajax\\\/\"},\"wordCount\":413,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.codexworld.com\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.codexworld.com\\\/generate-invoice-pdf-with-php-ajax\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.codexworld.com\\\/wp-content\\\/uploads\\\/2025\\\/12\\\/generate-invoice-pdf-with-php-ajax-codexworld.jpg\",\"keywords\":[\"Ajax\",\"Dompdf\",\"Invoice\",\"PDF\",\"PHP\"],\"articleSection\":[\"PHP\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.codexworld.com\\\/generate-invoice-pdf-with-php-ajax\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.codexworld.com\\\/generate-invoice-pdf-with-php-ajax\\\/\",\"url\":\"https:\\\/\\\/www.codexworld.com\\\/generate-invoice-pdf-with-php-ajax\\\/\",\"name\":\"Generate Invoice PDF with PHP & AJAX - CodexWorld\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.codexworld.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.codexworld.com\\\/generate-invoice-pdf-with-php-ajax\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.codexworld.com\\\/generate-invoice-pdf-with-php-ajax\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.codexworld.com\\\/wp-content\\\/uploads\\\/2025\\\/12\\\/generate-invoice-pdf-with-php-ajax-codexworld.jpg\",\"datePublished\":\"2025-12-22T05:32:07+00:00\",\"dateModified\":\"2026-01-16T14:47:34+00:00\",\"description\":\"Learn how to generate a professional invoice PDF using PHP and AJAX. Dynamic items, tax calculation, logo upload, and instant PDF download.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.codexworld.com\\\/generate-invoice-pdf-with-php-ajax\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.codexworld.com\\\/generate-invoice-pdf-with-php-ajax\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.codexworld.com\\\/generate-invoice-pdf-with-php-ajax\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.codexworld.com\\\/wp-content\\\/uploads\\\/2025\\\/12\\\/generate-invoice-pdf-with-php-ajax-codexworld.jpg\",\"contentUrl\":\"https:\\\/\\\/www.codexworld.com\\\/wp-content\\\/uploads\\\/2025\\\/12\\\/generate-invoice-pdf-with-php-ajax-codexworld.jpg\",\"width\":1536,\"height\":864,\"caption\":\"generate-invoice-pdf-with-php-ajax-codexworld\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.codexworld.com\\\/generate-invoice-pdf-with-php-ajax\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.codexworld.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Generate Invoice PDF with PHP &#038; AJAX\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.codexworld.com\\\/#website\",\"url\":\"https:\\\/\\\/www.codexworld.com\\\/\",\"name\":\"CodexWorld\",\"description\":\"Web &amp; Mobile App Development Company\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.codexworld.com\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.codexworld.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.codexworld.com\\\/#organization\",\"name\":\"CodexWorld\",\"url\":\"https:\\\/\\\/www.codexworld.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.codexworld.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.codexworld.com\\\/wp-content\\\/uploads\\\/2014\\\/09\\\/codexworld-logo.png\",\"contentUrl\":\"https:\\\/\\\/www.codexworld.com\\\/wp-content\\\/uploads\\\/2014\\\/09\\\/codexworld-logo.png\",\"width\":200,\"height\":19,\"caption\":\"CodexWorld\"},\"image\":{\"@id\":\"https:\\\/\\\/www.codexworld.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/codexworld\",\"https:\\\/\\\/x.com\\\/codexworldweb\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/codexworld\",\"https:\\\/\\\/www.youtube.com\\\/codexworld\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.codexworld.com\\\/#\\\/schema\\\/person\\\/9da51d8fa3cdefeb5ec9c69136d4baf0\",\"name\":\"CodexWorld\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/cf4999db3b409de559f80677afa01729bb2eeda19be273c254e8b2c22729e386?s=96&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/cf4999db3b409de559f80677afa01729bb2eeda19be273c254e8b2c22729e386?s=96&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/cf4999db3b409de559f80677afa01729bb2eeda19be273c254e8b2c22729e386?s=96&r=g\",\"caption\":\"CodexWorld\"},\"description\":\"CodexWorld is a programming blog, one-stop destination for web professionals \u2014 developers, programmers, freelancers, and site owners.\",\"sameAs\":[\"http:\\\/\\\/www.codexworld.com\",\"https:\\\/\\\/www.facebook.com\\\/codexworld\",\"https:\\\/\\\/x.com\\\/codexworldblog\"],\"url\":\"https:\\\/\\\/www.codexworld.com\\\/author\\\/nitya192265\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Generate Invoice PDF with PHP & AJAX - CodexWorld","description":"Learn how to generate a professional invoice PDF using PHP and AJAX. Dynamic items, tax calculation, logo upload, and instant PDF download.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.codexworld.com\/generate-invoice-pdf-with-php-ajax\/","og_locale":"en_US","og_type":"article","og_title":"Generate Invoice PDF with PHP & AJAX - CodexWorld","og_description":"Learn how to generate a professional invoice PDF using PHP and AJAX. Dynamic items, tax calculation, logo upload, and instant PDF download.","og_url":"https:\/\/www.codexworld.com\/generate-invoice-pdf-with-php-ajax\/","og_site_name":"CodexWorld","article_publisher":"https:\/\/www.facebook.com\/codexworld","article_author":"https:\/\/www.facebook.com\/codexworld","article_published_time":"2025-12-22T05:32:07+00:00","article_modified_time":"2026-01-16T14:47:34+00:00","og_image":[{"width":1536,"height":864,"url":"https:\/\/www.codexworld.com\/wp-content\/uploads\/2025\/12\/generate-invoice-pdf-with-php-ajax-codexworld.jpg","type":"image\/jpeg"}],"author":"CodexWorld","twitter_card":"summary_large_image","twitter_creator":"@codexworldblog","twitter_site":"@codexworldweb","twitter_misc":{"Written by":"CodexWorld","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.codexworld.com\/generate-invoice-pdf-with-php-ajax\/#article","isPartOf":{"@id":"https:\/\/www.codexworld.com\/generate-invoice-pdf-with-php-ajax\/"},"author":{"name":"CodexWorld","@id":"https:\/\/www.codexworld.com\/#\/schema\/person\/9da51d8fa3cdefeb5ec9c69136d4baf0"},"headline":"Generate Invoice PDF with PHP &#038; AJAX","datePublished":"2025-12-22T05:32:07+00:00","dateModified":"2026-01-16T14:47:34+00:00","mainEntityOfPage":{"@id":"https:\/\/www.codexworld.com\/generate-invoice-pdf-with-php-ajax\/"},"wordCount":413,"commentCount":0,"publisher":{"@id":"https:\/\/www.codexworld.com\/#organization"},"image":{"@id":"https:\/\/www.codexworld.com\/generate-invoice-pdf-with-php-ajax\/#primaryimage"},"thumbnailUrl":"https:\/\/www.codexworld.com\/wp-content\/uploads\/2025\/12\/generate-invoice-pdf-with-php-ajax-codexworld.jpg","keywords":["Ajax","Dompdf","Invoice","PDF","PHP"],"articleSection":["PHP"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.codexworld.com\/generate-invoice-pdf-with-php-ajax\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.codexworld.com\/generate-invoice-pdf-with-php-ajax\/","url":"https:\/\/www.codexworld.com\/generate-invoice-pdf-with-php-ajax\/","name":"Generate Invoice PDF with PHP & AJAX - CodexWorld","isPartOf":{"@id":"https:\/\/www.codexworld.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.codexworld.com\/generate-invoice-pdf-with-php-ajax\/#primaryimage"},"image":{"@id":"https:\/\/www.codexworld.com\/generate-invoice-pdf-with-php-ajax\/#primaryimage"},"thumbnailUrl":"https:\/\/www.codexworld.com\/wp-content\/uploads\/2025\/12\/generate-invoice-pdf-with-php-ajax-codexworld.jpg","datePublished":"2025-12-22T05:32:07+00:00","dateModified":"2026-01-16T14:47:34+00:00","description":"Learn how to generate a professional invoice PDF using PHP and AJAX. Dynamic items, tax calculation, logo upload, and instant PDF download.","breadcrumb":{"@id":"https:\/\/www.codexworld.com\/generate-invoice-pdf-with-php-ajax\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.codexworld.com\/generate-invoice-pdf-with-php-ajax\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.codexworld.com\/generate-invoice-pdf-with-php-ajax\/#primaryimage","url":"https:\/\/www.codexworld.com\/wp-content\/uploads\/2025\/12\/generate-invoice-pdf-with-php-ajax-codexworld.jpg","contentUrl":"https:\/\/www.codexworld.com\/wp-content\/uploads\/2025\/12\/generate-invoice-pdf-with-php-ajax-codexworld.jpg","width":1536,"height":864,"caption":"generate-invoice-pdf-with-php-ajax-codexworld"},{"@type":"BreadcrumbList","@id":"https:\/\/www.codexworld.com\/generate-invoice-pdf-with-php-ajax\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.codexworld.com\/"},{"@type":"ListItem","position":2,"name":"Generate Invoice PDF with PHP &#038; AJAX"}]},{"@type":"WebSite","@id":"https:\/\/www.codexworld.com\/#website","url":"https:\/\/www.codexworld.com\/","name":"CodexWorld","description":"Web &amp; Mobile App Development Company","publisher":{"@id":"https:\/\/www.codexworld.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.codexworld.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.codexworld.com\/#organization","name":"CodexWorld","url":"https:\/\/www.codexworld.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.codexworld.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.codexworld.com\/wp-content\/uploads\/2014\/09\/codexworld-logo.png","contentUrl":"https:\/\/www.codexworld.com\/wp-content\/uploads\/2014\/09\/codexworld-logo.png","width":200,"height":19,"caption":"CodexWorld"},"image":{"@id":"https:\/\/www.codexworld.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/codexworld","https:\/\/x.com\/codexworldweb","https:\/\/www.linkedin.com\/company\/codexworld","https:\/\/www.youtube.com\/codexworld"]},{"@type":"Person","@id":"https:\/\/www.codexworld.com\/#\/schema\/person\/9da51d8fa3cdefeb5ec9c69136d4baf0","name":"CodexWorld","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/cf4999db3b409de559f80677afa01729bb2eeda19be273c254e8b2c22729e386?s=96&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/cf4999db3b409de559f80677afa01729bb2eeda19be273c254e8b2c22729e386?s=96&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/cf4999db3b409de559f80677afa01729bb2eeda19be273c254e8b2c22729e386?s=96&r=g","caption":"CodexWorld"},"description":"CodexWorld is a programming blog, one-stop destination for web professionals \u2014 developers, programmers, freelancers, and site owners.","sameAs":["http:\/\/www.codexworld.com","https:\/\/www.facebook.com\/codexworld","https:\/\/x.com\/codexworldblog"],"url":"https:\/\/www.codexworld.com\/author\/nitya192265\/"}]}},"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/www.codexworld.com\/wp-content\/uploads\/2025\/12\/generate-invoice-pdf-with-php-ajax-codexworld.jpg","jetpack_shortlink":"https:\/\/wp.me\/p6bxIh-1yz","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.codexworld.com\/wp-json\/wp\/v2\/posts\/5987","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.codexworld.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.codexworld.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.codexworld.com\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.codexworld.com\/wp-json\/wp\/v2\/comments?post=5987"}],"version-history":[{"count":3,"href":"https:\/\/www.codexworld.com\/wp-json\/wp\/v2\/posts\/5987\/revisions"}],"predecessor-version":[{"id":6031,"href":"https:\/\/www.codexworld.com\/wp-json\/wp\/v2\/posts\/5987\/revisions\/6031"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.codexworld.com\/wp-json\/wp\/v2\/media\/5989"}],"wp:attachment":[{"href":"https:\/\/www.codexworld.com\/wp-json\/wp\/v2\/media?parent=5987"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.codexworld.com\/wp-json\/wp\/v2\/categories?post=5987"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.codexworld.com\/wp-json\/wp\/v2\/tags?post=5987"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}