Last week, I have shown you how to create a downloadable PDF using Flex + PHP + the Alive PDF library. As for this week, I shall move on to the step of printing out & breaking up a big datagrid into multiple pages.
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
creationComplete="creationCompleteHandler(event)">
<mx:Script>
<![CDATA[
//Import the classes that are needed.
import com.extentPDF.ExtendingPDF;
import mx.collections.ArrayCollection;
import mx.controls.dataGridClasses.DataGridColumn;
import mx.events.FlexEvent;
//Array to store the random data that I'm going to create
private var dataArray:Array = new Array();
private var dataColArray:ArrayCollection = new ArrayCollection();
//Array to store the column sequence
private var dgColumns:Array = new Array();
protected function creationCompleteHandler(event:FlexEvent):void
{
//Add the respective column names into the array.
dgColumns.push(new DataGridColumn("Name"));
dgColumns.push(new DataGridColumn("Description"));
dgColumns.push(new DataGridColumn("Price"));
dgColumns.push(new DataGridColumn("Unit"));
//Set the columns of the datagrid.
dgDisplay.columns = dgColumns;
//Create random data
var j:int = 0;
var tempObject:Object;
for(var i:int = 1; i <= 100; i ++)
{
tempObject = new Object();
if(i % 2 == 1)
{
tempObject.Name = "Item " + i;
}else{
tempObject.Name = "Product " + i;
}
tempObject.Price = "S$" + i;
j = Math.round(Math.random() * 100);
tempObject.Unit = i * j;
tempObject.Description = "Description " + i;
dataArray.push(tempObject);
}
//Pass the data into the datagrid
dataColArray.source = dataArray;
dgDisplay.dataProvider = dataColArray;
}
//Upon clicking on the button, make a downloadable pdf.
protected function clickHandler(event:MouseEvent):void
{
saveContent();
}
//Function that will be creating the downloadable PDF
//with the help of PHP
private function saveContent():void
{
//Create a new instance of ExtendingPDF class.
var tempPDF:ExtendingPDF = new ExtendingPDF();
//Add it to this application.
this.addChild(tempPDF);
this.validateNow();
//Specify the first row that you are displaying
var start:int = 0;
//Specify the last row that you are displaying
var end:int = 1;
//Used to specify the row number of the data
var row:int = 0;
//Array to create a reference to the 'dataArray'
//based on the start and the end
var dummyArray:Array;
//Array to store the result of the check upon
//the PDF
var checkResult:Array = null;
//Should be add the last known good view to the PDF?
var mustInsertPrev:Boolean = false;
//Loop through all the rows of the 'dataArray'
//Add the view into the PDF if the view can fit in
//else keep on adding a new row until it reach a point
//where the new row cannot be added and then add the
//last known good view into the PDF.
while(end <= dataArray.length)
{
dummyArray = new Array();
row = 0;
for(var i:int = start; i < end; i ++)
{
dummyArray[row] = dataArray[i];
row ++;
}
dataColArray.source = dummyArray;
dgDisplay.dataProvider = dataColArray;
dgDisplay.verticalScrollPolicy = "off";
dgDisplay.height = dgDisplay.headerHeight +
dgDisplay.measureHeightOfItems(start, end - start);
dgDisplay.validateNow();
mustInsertPrev = false;
checkResult = tempPDF.checkContentSize2PDFPage(dgDisplay);
if(checkResult[0] == 1)
{
if((start + 1) == end)
{
tempPDF.addPage();
checkResult = tempPDF.checkContentSize2PDFPage(dgDisplay);
if(checkResult[0] == 0)
{
mustInsertPrev = false;
}else{
mustInsertPrev = true;
}
}else{
mustInsertPrev = true;
}
if(mustInsertPrev)
{
end --;
dummyArray = new Array();
row = 0;
for(i = start; i < end; i ++)
{
dummyArray[row] = dataArray[i];
row ++;
}
dataColArray.source = dummyArray;
dgDisplay.dataProvider = dataColArray;
dgDisplay.verticalScrollPolicy = "off";
dgDisplay.height = dgDisplay.headerHeight +
dgDisplay.measureHeightOfItems(start, end - start);
dgDisplay.validateNow();
tempPDF.addContent2PDFPage(dgDisplay);
start = end;
end ++;
}
}else{
end ++;
if(end > dataArray.length)
{
tempPDF.addContent2PDFPage(dgDisplay);
}
}
}
//Create the PDF file that can be downloaded
tempPDF.createContent();
//Restore everything back to the state before
//the PDF was created.
dataColArray.source = dataArray;
dgDisplay.dataProvider = dataColArray;
dgDisplay.verticalScrollPolicy = "auto";
dgDisplay.height = 200;
container.addChildAt(dgDisplay,0);
this.removeChild(tempPDF);
this.validateNow();
}
]]>
</mx:Script>
<mx:VBox id="container" width="100%" height="100%"
horizontalAlign="center" verticalAlign="middle">
<mx:DataGrid id="dgDisplay" height="200"/>
<mx:Button label="Print Content Now!" click="clickHandler(event)"/>
</mx:VBox>
</mx:Application>A Custom Class that I had created to handle the printing...
package com.extentPDF
{
import flash.display.DisplayObject;
import flash.geom.Point;
import mx.containers.Canvas;
import org.alivepdf.display.Display;
import org.alivepdf.layout.Layout;
import org.alivepdf.layout.Mode;
import org.alivepdf.layout.Orientation;
import org.alivepdf.layout.Position;
import org.alivepdf.layout.Resize;
import org.alivepdf.layout.Size;
import org.alivepdf.layout.Unit;
import org.alivepdf.pages.Page;
import org.alivepdf.pdf.PDF;
import org.alivepdf.saving.Download;
import org.alivepdf.saving.Method;
public class ExtendingPDF extends Canvas
{
//Path to the Php file used to generate the pdf file
private var phpUrl:String = "http://bestkirdape.freeiz.com/php/create.php";
//File Name that I'm giving the pdf file
private var strFilename:String = "PrintOut_Of_MultipleViewWithAlivePDF.pdf";
private var myPDF:PDF;
private var pdfHeight:int = 0;
public function ExtendingPDF()
{
//Specify the settings of the PDF
//In my case, I'm using a PORTRAIT view, a size of A4
//and everything will be calculated in POINT.
myPDF = new PDF(Orientation.PORTRAIT,
Unit.POINT, Size.A4);
//Set the Display Mode of the PDF when it was opened.
myPDF.setDisplayMode (Display.FULL_PAGE, Layout.SINGLE_PAGE);
//Set the Margins (left, top, right, bottom)
myPDF.setMargins(40,60,40,60);
addPage();
}
//Create a new page into the PDF.
public function addPage():void
{
var newPage:Page = new Page ( Orientation.PORTRAIT,
Unit.POINT, Size.A4 );
//Add a Page to the PDF
myPDF.addPage(newPage);
pdfHeight = 0;
}
//This function is used to add the content into the current page
public function addContent2PDFPage(content:DisplayObject):void
{
var resultArray:Array = checkContentSize2PDFPage(content);
//Check if the content can fit into the current page
//else need to create a new page
if (resultArray[0] == 1)
{
addPage();
}
//Add the content into a Canvas first before adding into
//the current page of the pdf.
var tempContainer:Canvas = new Canvas();
this.addChild(tempContainer);
tempContainer.width = Math.floor(content.width) + 4;
tempContainer.height = Math.floor(content.height) + 4;
tempContainer.setStyle("backgroundAlpha",0);
tempContainer.addChild(content);
content.x = 0;
content.y = 0;
tempContainer.validateNow();
this.validateNow();
//Adds like a screen capture and capture a screen shot
//of the content
myPDF.addImage(tempContainer, new Resize(Mode.NONE,
Position.LEFT), 0, pdfHeight, (resultArray[1] as Point).x,
(resultArray[1] as Point).y);
pdfHeight = pdfHeight + (resultArray[1] as Point).y + 10;
//remove views that are not needed
this.removeChild(tempContainer);
}
//This function is used to check whether the content
//can fit into the current page
public function checkContentSize2PDFPage(content:DisplayObject):Array
{
var pageWidth:Number = myPDF.getCurrentPage().w - 80;
var pageHeight:Number = myPDF.getCurrentPage().h - 120;
var imgScaleFactor:Number = content.width/content.height;
var pw:int = 0;
var ph:int = 0;
pw = Math.floor(pageWidth);
ph = Math.floor(pw/imgScaleFactor);
var tempArray:Array = new Array();
var tempPoint:Point = new Point();
tempPoint.x = pw;
tempPoint.y = ph;
if ((pdfHeight + ph) > pageHeight)
{
tempArray[0] = 1;
}else{
tempArray[0] = 0;
}
tempArray[1] = tempPoint;
return tempArray;
}
//Create the PDF file that can be downloaded
public function createContent():void
{
myPDF.save( Method.REMOTE, phpUrl, Download.ATTACHMENT, strFilename);
}
}
}* Click here to view the demo of this example.
^ Click here for the source files of this demo.
~ Click here for the website of 'Alive PDF'.
- Click here for the Documentation of the classes of 'Alive PDF'.
** Click here for the older tutorials on 'Alive PDF'.
No comments:
Post a Comment