Document Templates

From AgileApps Support Wiki

Designer > Print Templates

Print templates let you generate PDF documents for selected records.

About Print Templates

Using Print Templates, you merge record data into a formatted document to create a PDF with rich formatting. You can use such templates to create prefilled forms, invoices, contracts, and other types of documents using data stored in your application.

A Print Template can be based on an HTML file, a Word document, a PowerPoint presentation, or a JSP Page stored in the platform. You can use them to print individual records, or to print multiple records displayed in a View.

Notepad.png

Note: HTML, Word, and PowerPoint files are created outside of the platform, and then uploaded for use. Once created, they can be downloaded, edited, and uploaded again. JSP Pages are created and edited either in the platform, or using the Eclipse Plug-in.

Examples

  • Create an Expense Report to be used in expense management application
  • Print an Employee Benefit Form
  • Print Invoices for a collection of records selected in a View
Learn more: Sample Print Templates you can customize and use.

How Print Templates Work

At bottom, Print templates are formatted documents with variables you create by inserting specific codes. When you generate a PDF, the codes are replaced by record data, images, and charts, to create a customized version of the template.

For even more dynamic documents, the platform uses the Apache Velocity templating engine, which allows you to vary the content of the document based on record data, and to create repeating parts for related records, like the OrderItems in an Order.

Learn more: http://velocity.apache.org/engine/releases/velocity-1.5/user-guide.html

In outline, the process for creating a Print Template looks like this:

  1. You create a document (on your local file system) or an HTML/JSP Page in the platform that includes all of the fixed text and images you want to include in your template.
    Learn more: HTML Resources
  2. While creating the document, you make note of the platform data you want to add:
    • Record fields
    • Record images
    • Charts created from Reports
    • User fields
    • Company fields
    • Fields from Related Records
  3. You use the Template Variable Tool to get the field names you need to customize the HTML file with fields and images taken from data records.
  4. You use the Reports tool to get the identifiers for charts you want to add.
  5. You use the Velocity scripting language to build logic into the template, changing the content based on data parameters.
Considerations
  • CSS styles can be embedded into HTML files. External CSS files can also be referenced in the template, if they are first uploaded as Static Resources.
  • Fixed images can be inserted into Word and PowerPoint files directly.
  • Fixed images in an HTML file need to be stored on the platform either as Static Resources, or as Public Documents.

Notepad.png

Note: A Static Resource is available only to a logged-in user. A Public Document is visible to anyone who has the link. From the standpoint of a Print Template, the difference is immaterial, since a user has to be logged in to print a record.

Working with Print Templates

Add a Print Template

Add a Print Template

Edit a Print Template based on a Platform JSP/HTML Page

  1. Click Designer > Pages > {page}
  2. Edit the page.
    Learn more: Pages
  3. If you need the names of additional variables:
    a. Click Designer > Objects > {object} > Print Templates
    b. View the template to access the Template Variable Tool:
    TemplateVariableTool.jpg

Edit a File-Based Print Template

  1. Click Designer > Objects > {object} > Print Templates
  2. Click the Download link on the template you want to copy to your local system.
  3. Make changes to the template.
  4. If you need the names of additional variables, click the [New Template] button to access the Template Variable Tool:
    TemplateVariableTool.jpg
  5. If the New Template window is open, click [Cancel] to close it and go back to the Templates (record list) view.
  6. Click the Replace link on the template to upload the modified template.

Warn.png

Warning: Be sure to click the right link. The existing template page will be replaced by the new one.

Use a Template to Print a Record

  1. Open an object record.
  2. Click the [Print] button.
  3. Select Template based to create an HTML page using the Print Template.
  4. Select the Template
  5. Optionally, select PDF format to generate a PDF. (Default is HTML.)
  6. Click [Print].
    A new window opens to display the results.
  7. Copy content from the resulting HTML page, print it, or save the page to your local system.

Use a Template to Print a List of Records

  1. Visit Workspace > {object}
  2. Select a view
  3. Do a search or add criteria to modify the view
  4. Select the records to print.
    (Click All to select all displayed records.)
  5. Select More Actions > Print
  6. Use the current view, choose a new one, or select records manually.
  7. For Print Layout, choose Use a Print Template
  8. Select the template to use
  9. Set the page orientation
  10. Click [Print]

Insert Images and Template Variables

See the instructions for the kind of template you are creating:

Create a Compound Print Template

It is also possible to create a print template that is a composite of multiple parts.

Learn more: Create a Compound Print Template

Accessing Related Records

In a Custom Object, fields from related records can be added to a Print Template. (That is, records from an Object that has a Lookup to the current object.)

For example, OrderItems has a lookup to Orders, so in a Print Template for Orders, related OrderItems records can be accessed. (In an object Form, related records are typically displayed in a Subform, although they need not be.)

When formatting a record in the current object for printing, those related records and the fields they contain can be processed in a loop.

Finding and Using Related Record Variables

Finding Related-Record Variables

Related Object variables can be found using the Template Variable Tool. Here, the related OrderItems objects are being chosen from the category list:

TemplateVariableToolRelatedObjects.png

Here, the Tag Name field is being selected from the Many to Many relationship with the Tags object:

File:TemplateVariableToolRelatedManyToManyObject.png

The object that is directly connected to Orders is Orders_Tags -- a Junction Object that has Lookups to both Orders and Tags. In that object, the Lookup to Tags is called Related to Tags. Within that group, the Tag Name field is listed, along with other fields in the Tags object.

Once selected, the variable name appears in the Variable area:

$Orders_Tags_record.related_to_Tags.tag_name

where:

  • $Orders_Tags_record is the expected loop variable for the $Orders_Tags Junction Object records
  • related_to__Tags is the name of the Lookup field in the Junction Object that references a Tags record
  • tag_name is the field we want to display
  • The "dot" separator (.) joins each of the segments in the variable name

Processing Related Records in a Loop

Typically, you'll create a table for the related records, define its headings, and then create a row for a single record, putting the related-record variables into the cells of the row. You then enclose that row in a loop, using the #foreach instruction defined by the Velocity templating engine.

Related records are returned in an array, so the loop creates a new table row for each record in the array.

For example (with formatting attributes removed for simplicity):

<table>
<tbody>
<tr>
    <th>Quantity</th>
    <th>Product </th>               
    <th>Unit Price</th>
    <th>Amount</th>
</tr>
</tbody>

#foreach( $OrderItems_record in $OrderItems )
<tr>        
    <td>$OrderItems_record.item_quantity</td>
    <td>$OrderItems_record.related_to_ProductInventory.product_name</td>
    <td>$OrderItems_record.item_price</td>
    <td>$OrderItems_record.total</td>
</tr>
#end

...
</table>

where:

  • The <tbody> element is required around the header row.
  • The Velocity #foreach directive does the looping.
Learn more: http://velocity.apache.org/engine/releases/velocity-1.5/user-guide.html
  • The looping construct defines $OrderItems_record as a loop variable.
  • The loop variable iterates over the $OrderItems array.
  • The $OrderItems array is automatically available in the template, because OrderItems is a Related Object. (All related objects are available. Each is an array.)

Special Considerations for Subform Variables

Totals and additional computation fields defined for a Subform are also available in the Template Variable Tool. To find them, you access the main object (not the object displayed in the Subform), because those fields are added to the object that contains the Subform.

For example, the Subform for OrderItems totals the $Amount column, and then does additional computations on it to add a surcharge. Those values are shown in the $Orders Fields category as Total $Amount and Shipping for $Amount, respectively. (The final total is shown as Net Total $Amount.)

Sample Print Template for an Order Invoice

This sample:

  • Creates an invoice for an order, showing all items in it
  • Gets the name and price of order items from the ProductInventory object
  • Uses Velocity #foreach processing to process OrderItems records for an Order
  • Uses Velocity #if conditionals to display surcharge and discount rows only if those values are present
<html><head>
<title></title>
<style>
 div {  
      padding-top: 5px;  
      padding-bottom: 5px;  
      padding-right: 5px;  
      padding-left: 30px;  
      border: 3px;  
	  margin-top: 5%;
	  margin-right: 40%;
	  margin-bottom: 5%;
	  margin-left: 5%;
    }
</style>

</head><body bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">

<div style="width:100%">

<img  width="100" height="100"  src="http://justanothermobilemonday.com/Wordpress/wp-content/uploads/2009/10/android-robot-logo2.jpg" alt="Company logo" />&nbsp;&nbsp;&nbsp; <---- Company Logo Here<br/>
<font size="5"><b>$company.name</b></font><b><br />
<br/>
$company.street&nbsp;&nbsp;<br>
$company.city, $company.state, <br>
$company.country - $company.zip
 
&nbsp;<br>
&nbsp;(Phone): $user.phone
<hr width="100%" size="1" />
<br />

<h2 align="center">Order<b> Invoice</b></h2>
<p></p>
<p align="center"><b>Invoice Date:</b> $Orders.date_created </p>

<br/><br/>
<b><u>Bill To: </u></b><br />
<font size="2">$Orders.account.name - $Orders.account.number</font></b>
<br />$Orders.account.street<br />
$Orders.account.city,&nbsp;$Orders.account.state, <br>
$Orders.account.country - $Orders.account.zip<br /> 

(Phone): $Orders.account.phone <br />
<br />
<br />
<b>Invoice #: $Orders.order_number <br />
</b>&nbsp;
</p>

<table border="1" cellpadding="5" cellspacing="0" width="600">

<!-- HEADER -->
<tbody>
<tr>
    <th>Quantity</th>
    <th>Product </th>               
    <th>Unit Price</th>
    <th>Amount</th>
</tr>
</tbody>

#foreach( $OrderItems_record in $OrderItems )
<tr>
<td width="350">$OrderItems_record.item_quantity</td>
<td width="100" align="CENTER">$OrderItems_record.related_to_ProductInventory.product_name</td>
<td width="100" align="CENTER"> $OrderItems_record.item_price</td>
<td width="100" align="CENTER"> $OrderItems_record.total    </td>
</tr>
#end

<tr>
<td colspan="2">&nbsp;</td>
<td style="border: solid 1px #000000;" align="Right">Sub Total</td>
<td style="border: solid 1px #000000;" align="center">$Order.grid_comptn_f5631e34b39f4ba39a98559c7215a3b4</td>
</tr>

#if( $Orders.grid_surcharge_031f67dd4b3946949df2da276e5c82a6 > 0 )
<tr>
<td colspan="2">&nbsp;</td>
<td style="border: solid 1px #000000;" align="Right">Surcharge</td>
<td style="border: solid 1px #000000;" align="center">$Orders.grid_surcharge_f5631e34b39f4ba39a98559c7215a3b4</td>
</tr>
#end 

#if( $Orders.grid_discount_031f67dd4b3946949df2da276e5c82a6 > 0 )
<tr>
<td colspan="2">&nbsp;</td>
<td style="border: solid 1px #000000;" align="Right">Discount</td>
<td style="border: solid 1px #000000;" align="center">$Orders.grid_discount_f5631e34b39f4ba39a98559c7215a3b4</td>
</tr>
#end 

<tr>
<td colspan="2">&nbsp;</td>
<td style="border: solid 1px #000000;" align="Right">Tax</td>
<td style="border: solid 1px #000000;" align="center">$Orders.grid_tax_f5631e34b39f4ba39a98559c7215a3b4</td>
</tr>

<tr>
<td colspan="2">&nbsp;</td>
<td style="border: solid 1px #000000;" align="Right">Shipping</td>
<td style="border: solid 1px #000000;" align="center">$Orders.grid_shipping_f5631e34b39f4ba39a98559c7215a3b4</td>
</tr>

<tr>
<td colspan="2">&nbsp;</td>
<td style="border: solid 1px #000000;" align="Right"><b>TOTAL AMOUNT DUE</b></td>
<td style="border: solid 1px #000000;" align="center"><b>$Orders.grid_net_total_f5631e34b39f4ba39a98559c7215a3b4</b></td>
</tr>     
</table>

<br /><br />
Payment Due upon reciept<br />
Thank you for your business!
</div>
       
<p></p>
</body>
</html>

The Subform part of the resulting invoice then looks something like this:

OrderInvoiceSampleSegment.png

(The Order Invoice template and the Order Invoice sample file are both available in the downloads area.)

Customizing Data Sent to the Template with a Print Template Class

Print Template Classes

Troubleshooting Tips

  • Velocity syntax errors cause the Velocity process to die.
  • Not all browsers display an error message when such errors occur. (Firefox does)
  • If you're seeing what appears to be a "silent failure', try switching browsers.
  • When the error occurs in a Word or PowerPoint template, it can be difficult to pinpoint the cause of the error.
  • Converting the template to HTML helps to pinpoint the line that has the problem.
  • When a Word or PowerPoint template fails, a process instance is left running, with a corrupted document that can't be read. Subsequent attempts to open the document report an error message, and an additional process is left running.
  • On a PC, the processes can be found and killed from the Task Manager.
  • Each open process makes a temporary copy of the template, with a name like, "Template.docx (1)".
  • The existence of those undeletable template copies is a sign that processes have been left running.
  • When the processes are killed, the template copies disappear.

[[Category:Template:Features]]