You can convert HTML-based reports into PDF or FlashPaper output by wrapping the HTML in the cfdocument start and end tags, and specifying cfdocument attributes, as appropriate, to customize the following items:
For complete information on these options, see the cfdocument tag discussion in the CFML Reference.
The following example displays a list of employees, using a cfoutput tag to loop through the query:
<cfdocument format="flashpaper"> <h1>Employee List</h1> <!--- Inline query used for example purposes only. ---> <cfquery name="EmpList" datasource="cfdocexamples"> SELECT FirstName, LastName, Salary, Contract FROM Employee </cfquery> <cfoutput query="EmpList"> #EmpList.FirstName#, #EmpList.LastName#, #LSCurrencyFormat(EmpList.Salary)#, #EmpList.Contract#<br> </cfoutput> </cfdocument>
You can use the cfdocument and cfdocumentsection tags to fine-tune your printable output, as follows:
You use one or more cfdocumentitem tags to specify headers and footers or to create a page break. You can use cfdocumentitem tags with or without the cfdocumentsection tag, as follows:
You can use the cfdocumentitem tag to create a running header for an entire document, as the following example shows:
<cfdocument format="PDF"> <!--- Running header ---> <cfdocumentitem type="header"> <font size="-3"><i>Directory Report</i></font> </cfdocumentitem> <h3>cfdirectory Example</h3> <!--- Use cfdirectory to display directories by name and size ---> <cfdirectory directory="#GetDirectoryFromPath(GetTemplatePath())#" name="myDirectory" recurse="yes" sort="directory ASC, name ASC, size DESC"> <!---- Output the contents of the cfdirectory as a cftable -----> <cftable query="myDirectory" htmltable colheaders> <cfcol header="DIRECTORY:" text="#directory#"> <cfcol header="NAME:" text="#Name#"> <cfcol header="SIZE:" text="#Size#"> </cftable> </cfdocument>
When using cfdocumentsection, all text in the document must be enclosed within cfdocumentsection tags. ColdFusion ignores HTML and CFML outside of cfdocumentsection tags. The margin attributes override margins specified in previous sections or in the parent cfdocument tag. If you specify margin attributes, the units are controlled by the unit attribute of the parent cfdocument tag; the default for the unit attribute is inches.
Within a section, use the cfdocumentitem tag to specify unique headers and footers for each section and a page break before each section, as the following example shows:
<cfquery datasource="cfdocexamples" name="empSalary"> SELECT Emp_ID, firstname, lastname, e.dept_id, salary, d.dept_name FROM employee e, departmt d WHERE e.dept_id = d.dept_id ORDER BY d.dept_name </cfquery> <cfdocument format="PDF"> <cfoutput query="empSalary" group="dept_id"> <cfdocumentsection> <cfdocumentitem type="header"> <font size="-3"><i>Salary Report</i></font> </cfdocumentitem> <cfdocumentitem type="footer"> <font size="-3">Page #cfdocument.currentpagenumber#</font> </cfdocumentitem> <h2>#dept_name#</h2> <table width="95%" border="2" cellspacing="2" cellpadding="2" > <tr> <th>Employee</th> <th>Salary</th> </tr> <cfset deptTotal = 0 > <!--- inner cfoutput ---> <cfoutput> <tr> <td><font size="-1"> #empSalary.lastname#, #empSalary.firstname#</font> </td> <td align="right"><font size="-1"> #DollarFormat(empSalary.salary)#</font> </td> </tr> <cfset deptTotal = deptTotal + empSalary.salary> </cfoutput> <tr> <td align="right"><font size="-1">Total</font></td> <td align="right"><font size="-1">#DollarFormat(deptTotal)#</font></td> </tr> <cfset deptTotal = 0> </table> </cfdocumentsection> </cfoutput> </cfdocument>
When you use the cfdocument tag, ColdFusion creates a new scope named cfdocument. This scope contains the following variables:
currentpagenumber: Displays the current page number.
totalpagecount: Displays the total page count.
currentsectionpagenumber: Displays the current section number.
totalsectionpagecount: Displays the total number of sections.
You typically use these variables in a header or footer to display the current page number and total number or pages, as the following example shows:
<cfdocumentitem type= "footer> #cfdocument.currentpagenumber# of #cfdocument.totalpagecount#</cfdocumentitem>
You can use the cfdocument bookmark attribute to create bookmarks for each section within a PDF document, as the following example shows:
<cfdocument format="PDF" bookmark="yes"> <cfdocumentitem type="header"> <font size="-1" align="center"><i>Building Better Applications</i></font> </cfdocumentitem> <cfdocumentitem type="footer"> <font size="-1"><i>Page <cfoutput>#cfdocument.currentpagenumber# of #cfdocument.totalpagecount#</cfoutput></i></font> </cfdocumentitem> <cfdocumentsection name="Introduction"> <h3>Introduction</h3> <p>The introduction goes here.</p> </cfdocumentsection> <cfdocumentsection name="Chapter 1"> <h3>Chapter 1: Getting Started</h3> <p>Chapter 1 goes here.</p> </cfdocumentsection> <cfdocumentsection name="Chapter 2"> <h3>Chapter 2: Building Applications</h3> <p>Chapter 2 goes here.</p> </cfdocumentsection> <cfdocumentsection name="Conclusion"> <h3>Conclusion</h3> <p>The conclusion goes here.</p> </cfdocumentsection> </cfdocument>
The bookmarks appear in the bookmarks panel of the PDF document.