CHANGELOG Version 1.5, released 10-Feb-2008 Patches from Dietrich Streifert A background coloring function similar to the colour_func implementation. Additionally the current cell rendering options should be passed to both rendering functions The possibility to set the aligment of the row header Documented above Fixed scaling image down if they're too big to fit on page Fixed more optimisations that were breaking rendering of blank lines ( \n ) page_template() now supports being passed a path to a template file ( ie you can override the default template ) Fixed off-by-one error in wrap_text Completed multi-line row support ( ie 'row' definitions can spill over 100% of x-space, in effect covering >1 rows ) Added text justification support ( and documented ) ( set 'align' property to 'justified' ) Fixed clobbering of a cell's text_whitespace property Version 1.4, released 01-Jul-2007 Patches from Cosimo Streppone : Improved management of image files according to underlying PDF::API2 installed version. If you specify an image type that PDF::API2 can't handle, the image is skipped and a warning is produced. Fixed and documented custom cell type mechanism, and added automatic require of formatter classes. Patches Patrik Eschle : Added support for code39 barcodes Fixed rendering of the character 0 by itself Fixed setup of group footer definition if aggregate source is cell 0 Fixed bad calling of calculate_y_needed ( was passing 'fields' in the options hash instead of 'cells' ) Added support for multi-line text in data ( ie cells can expand vertically ) Fixed printing of data headers if there are no groups defined Fixed x_pos of text in render_cell_text() for multiline text Moved execution of custom render functions to happen before rendering all other cell types Added return hash for custom render functions, with support for passing stuff back for traditional rendering Added fetch_group_results() function ( use this with custom_render_func ) Fixed splitting of columns inside a delimited group value for group headers ( sorry Bill ) Fixed printing of group headers if we have to reset them while we're calculating whether we need a new page INCOMPATIBLE CHANGE: colour_func() functions now get passed ( $value, $row ) instead of just $row Removed dependancy on Number::Format Fixed rendering of footers if reprinting_header is on Fixed corruption of group aggregate values in some cases Added text wrapping option to cells for text that is wider than the current width Added option to cells to strip line breaks from text Fixed bug in calculate_y_space for non-data cells ( eg where $cell->{text} is rendered ) Create a new page before the 1st invocation of calculate_y_space so we have a text object Improved numeric and currency formatting - see the cell's new 'format' key Fixed rendering of cell where text begins with a space ( bad optimisation ) Version 1.3, released 31-Mar-2006 Patches from Cosimo Streppone : Fixed out-of-memory errors when defining cells that exceed page height. Many fixes about text and barcode cells alignment of content even when using absolute x, y coordinates. Refactored cell font object retrieving code, to be used both in barcode and text cells. Added and documented more barcode properties (upper/lower mending zones, custom font/font_size) Added current_page() method to retrieve PDF::API2::Page underlying object where we are rendering content. One can choose to draw directly on that. Added another example of barcode document (PDF as a barcode label) Added page duplication example (cool!) Version 1.2, released 26-Mar-2006 Patches from Cosimo Streppone : Added "one-step" loading and rendering of reports from external XML files. XML::Simple now is a pre-requisite for PDF::ReportWriter. Added data sources definition in the xml report, with a basic DBI data-source plugin already available. Invented a new syntax for text cells to refer to external data sources (`%datasource_name[record_no,column_no]%'). Added an examples folder with some basic cool xml reports. Added print() method to directly print pdf reports to CUPS print queues. Added saveas() method just like PDF::API2 class. Added `max', `min' aggregate functions. Added basic handling of multi-line text on text cells, with proper calculation of cell height. Added ReportWriter->stringify() method that returns all the pdf document in a scalar, useful when you want to stream your document to a browser. Refactored the cell text processing code in new `get_cell_text()' method. Now every part of report should have macro expansion (%PAGE%, ...). Now the `field_headers_upper_buffer' works as advertised. Now document info->Creator field can be overridden. [EXPERIMENTAL] New cell type "custom:xxxx" to allow arbitrary formatting. Various fixes with barcode cells rendering (code 39 and 128). Minor optimizations around the group aggregate calculation. Documentation updates. Many thanks Cosimo :) Added support for image types: tiff, gif, pnm Version 1.0, released 11-Mar-2006 Patches from Cosimo Streppone: Added rendering of absolute-positioned cells with x,y properties. Added rendering of barcodes of type 39 and 128. Added support for PDF template pages. Some refactoring of code at the cell/row rendering level. Added basic testing of module. Various optimisations. Documentation updates. Many thanks Cosimo for the above work :) Added 'thousands_separated' type - similar to currency type, but no dollar sign in front Added 'buffer' key to image definition - minimum whitespace around an image ( defaults to 1 ) Changed $cell->{border_width} to $cell->{full_width}. 'border_width' is a very bad description ... Added field_headers object and cleaned up mess of code that previously existed to deal with headers Code cleanup: renamed remaining $field variables to $cell Added warnings on image issues: - Can't detect image dimensions ( including image not found ) - Unknown image type Added 'bold' key to cell definition ( and support legacy behaviour ) Store temporary image metadata inside cell's image hash instead of passing it round This adds support for rendering > 1 image per row :) Automatically set the data_column for the GrandTotals group so you don't need to specify it Optimisation: Cache image data ( dimensions, type ) in the image hash Added support for custom rendering functions ( ie direct use of PDF::API2 ) for each cell *Please* consider submitting useful functions for inclusion into PDF::ReportWriter :) Fixed initial rendering of field headers if there are no groups defined Fixed bad calling of calculate_y_needed ( changed 'fields' key to 'cells' in options hash ) Fixed error on multiple render() invocations with images ( cache being destroyed ) Version 0.9, released 16-Jan-2006 Patches from Bill Hess: Added support for defining Top, Bottom, Left, Right cell borders to render Added support for splitting multiple columns of data into a group header Many thanks to Bill for the above work :) Fixed calculation of $field->{text_width} ( take into account user-defined text_whitespace ) Replaced max_font_size with max_cell_height - better way of handling Y-space Incorporated groups into setup_cell_definitions() Changed $field in setup_cell_definitions() to $cell Added support for reprinting group headers on a new page Fixed error in rendering final group footers if there is no footer defined. How did this happen? Added upper_buffer and lower_buffer keys to group & data definitions for defining whitespace buffers Added support for page breaking before a group header Reprint higher-level 'reprinting_header' group headers when a lower-level group triggers a page break Broke out queuing group headers into separate assemble_group_header_queue() method Removed $no_group_footer variable Calculate size of group header queue, and if too big, re-assemble entire queue based on assumption that we're printing on a new page ( which could pull in more group headers that are reprinting_headers ) - thanks for Bill Hess for tirelessly reporting this bug until I fixed it :) Added support for dynamic images - image path comes from the data array Updated TODO with final feature additions for a 1.0 release, and plans for 2.0 Version 0.81, released 22-Oct-2005 Fixed stoopid mistake ( missing bracket close ) in previous release Version 0.8, released 22-Oct-2005 Added page headers and footers, dealt with in same style as data ( ie an array of cells ) Added special tags %PAGE%, %PAGES%, and %TIME% for page headers and footers Added cell-level control of cell borders, including colour support Added legacy page footers ( default if no page footer specified ) Added support for setting PDF info Don't create a new page in the constuctor - wait until we get passed some data Added setup_cell_definitions() to generically fill out details of all different types of cells Broke out calculation of Y needed into calculate_y_needed() Fixed typo in paper setup ( 'portait' should be 'portrait' ) - thanks to Bill Hess for spotting this one Added 'bsize' and 'legal' paper sizes - thanks to Bill Hess for these additions Removed all global variables Updated documentation & cleaned up POD somewhat Version 0.7, released 22-Aug-2005 Move down before rendering instead of after in group_header ( and not in GrandTotals header ) Fixed small bug in calculation of Y-space needed for current data block ( take into account whitespace between previous row and group header ) Version 0.6, released 02-Aug-2005 Major, major rewrite. Many new features. Squashed all bugs I know of. Fixed bug in resetting aggregate fields when entering a new group Fixed bug in colour_func when called on non-data stuff ( eg headers, footers, etc ) Better comments in source, use constants for TRUE / FALSE Replaced $field->{picture} with $field->{image} hash Set $self->{default_font_size} to 12 if one isn't supplied Renamed internal variables for more consistancy Replaced $cell_spacing with dynamic calculation of $field->{text_whitespace} ( user can define own values ) Replaced user-defined $self->{data}->{max_font_size} with calculated value - any max_font_size value you set will be overriden Added far more robust calculation of Y-space needed for current block of data Keep group headings with data ( ie don't print a group header at the bottom of a page ) ... FIGJAM Move down the page immediately *before* rendering each line, instead of after Added image scaling ... that actually works ( added dependancy on Image::Size ) Added image alignment Recognise "center" as well as "centre" in alignment definition Get rid of warnings about unintialised variables ( 'no warnings' directive ) Added support for colour background setting for cells - current options are 'box' or 'ellipse' Separated demo app from main package Version 0.5, released 15-Jun-2005 Added support for images - scaled to fit to the current cell ( not finalised - comments welcome ) Support multiple 'render_data' operations - you can keep passing new data ( or new groups / fields / data ) Added support for colour Added support colour_func - a user-defined function to set the colour based on the current data Version 0.4, released 09-May-2005 Check for group footer definitions in final run before actually calling group_footer() on them Added currency:no_fill field type ... if you don't want your amounts filled out to 2 decimal places Remove requirement of setting the 'text' key to the group name for aggregate results in group footers Version 0.3, released 08-May-2005 Bold & Centre field headers Fixed bug in page counting that would 'remember' ( somehow ) the page count from previous reports Do page footers in a separate pass when saving so we can write 'Page N of M' instead of just 'Page N' Version 0.2, released 27-Apr-2005 Fixed bug in group handling that was preventing the special 'GrandTotal' group header from being rendered Added a much-requested demo application Version 0.1, released 26-Apr-2005 First Version :) Table-based text layout engine with cell borders Text alignment inside cells Basic aggregate commands ( sum, count ) Page headers / footers Group headers / footers ( unlimited ) POD documentation