Each group of 'line items' in a spreadsheet produce an email with attached PDF.
Adjacent rows in the spreadsheet with the same email address are used to produce a single PDF invoice with line items. This is an advanced example where the 'rows to email' method is 'One or more rows generates a email'. This example also demonstrates use of a HTML file as a template.
HTML templates are ideally used for this, as they can use Javascript or the Liquid Templating language to format the document.
Step 1. Create CSV or Excel spreadsheet
The spreadsheet has merge fields as column headings. Each row must have an email address. Create consecutive rows with the same email address for each line item that you want in the PDF.
In this example 3 emails will be sent each with a single attachment.
- The first will have 5 line items
- The second will have 4 line items
- The third will have 1 line item
Step 2. Create HTML with Javascript.
pdfMachine merge installs with ready made profiles to get you started.
This
example is "Test Profile - HTML template with line items"
Surround the merge fields that are not to be used as line items with {{ }}. The names of the merge fields must exactly correspond to the column names in the data source. The merge fields can be formatted using the Liquid Templating Language.
<tr>
<td>Invoice Number</td>
<td>{{invoice_id}}</td>
</tr>
Create the javascript to iterate through the bundled rows (as shown below).
Sample Javascript
Your HTML template should contain the following special tag:
var data = {{json_here}};
When processed by pdfMachine merge HMTL templates will have
this substituted
with
a JSON (JavaScript Object Notation) string containing all the data for the
bundled rows. This allows a you to write javascript that iterates through
the
data, for calculation or rendering.
This allows a you to write javascript that iterates through the data, for
calculation or rendering. The "json_here" tag will look like:
var data = [
{"email": "wayne@acme.com","customer": "Acme
Corp","invoice_id":223,"invoice_date": "23/01/2011 12:00:00 AM","item":
"blue
widget","unit_cost":23,"quantity":4,"amt_due":391},
{"email": "wayne@acme.com","customer": "Acme
Corp","invoice_id":223,"invoice_date": "23/01/2011 12:00:00 AM","item": "red
widget","unit_cost":21,"quantity":2,"amt_due":391},
];
Javascript can then be used to iterate through the data array to create HTML to display the line items.
function generateLineItems()
{
var html = "<table class='hor-minimalist-b'><thead><tr><th>Item</th><th>Quantity</th><th>Unit Cost</th><th>Price</th></tr></thead>\
<tfoot><tr><td></td><td></td><td></td><td class='amountDue'>${{amt_due}}</td></tr></tfoot><tbody>";
for (var i = 0; i < data.length; i++)
{
var ob = data[i];
html += "<tr><td>" +
ob.item + "</td><td>" +
ob.quantity + "</td><td>" +
ob.unit_cost + "</td><td>" +
"$" + ob.quantity*ob.unit_cost + "</td></tr>";
}
html += "</tbody></table>";
document.getElementById("lineItemsTable").innerHTML =html;
}
When using HTML templates, don't forget set your page setup in Internet Explorer for things such as Paper Size and Orientation, Headers, Footers, Margins, Background printing, and shrink to fit page. You should also set your Broadgun pdfMachine print preferences. This example should be set up as :