Question

I'm attempting to create a pdf table on my flex application using AlivePdf:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
                xmlns:mh="mh.components.*"
                layout="absolute" width="500" height="500">



<mx:Script>
    <![CDATA[
        import mx.collections.ArrayCollection;

        import org.alivepdf.colors.RGBColor;
        import org.alivepdf.display.Display;
        import org.alivepdf.drawing.Caps;
        import org.alivepdf.fonts.FontFamily;
        import org.alivepdf.fonts.Style;
        import org.alivepdf.grid.Grid;
        import org.alivepdf.images.ImageFormat;
        import org.alivepdf.layout.Orientation;
        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.Method;
        import org.alivepdf.visibility.Visibility;

        import org.alivepdf.grid.*;





        private var myPDF:PDF;


        //print chart in pdf format
        protected function savePDF(e:MouseEvent):void
        {
            var myPDF:PDF = new PDF ( Orientation.PORTRAIT, Unit.MM);
            myPDF.setDisplayMode(Display.FULL_PAGE);
            myPDF.addPage();



            myPDF.setXY( 10, 70);
            myPDF.textStyle ( new RGBColor ( 0x000000 ) );

            var dp:ArrayCollection = new ArrayCollection();
            dp.addItem( { firstName : "Bob Geldorf akjaskaj skajs as kajs kaj k dklfj sdkfjl sdkjf ksdj fkjs dkfj ksdj ", lastName : "Groove", city : "Paris" } );
            dp.addItem( { firstName : "Bob", lastName : "Wise", city : "Paris" } );
            dp.addItem( { firstName : "Bob", lastName : "Wise", city : "Paris" } );
            dp.addItem( { firstName : "Bob", lastName : "Wise", city : "Paris" } );


            var grid:Grid = new Grid ( dp.toArray(), 200, 100, new RGBColor (0x00DEFF));


            myPDF.addGrid( grid, 0, 0, true );
            myPDF.save( Method.REMOTE, "coldfusion/pdf.cfm", "inline", "test.pdf" );;
        }



    ]]>
</mx:Script>    

<mx:VBox width="100%" height="100%">


    <mx:HBox width="100%" backgroundColor="#FFFFFF">
        <mx:Spacer width="100%"/>

        <mx:Button horizontalCenter="0" label="Save to PDF" height="22"  click="savePDF(event)"  id="savePDFBtn" toolTip="SAVE TO PDF"/>

    </mx:HBox>
</mx:VBox>

The strange thing is that the script create a table with double header and I don't know why. You can see the pdf generated at this link: https://docs.google.com/viewer?url=prestitiinpdap.biz/pdf/myPDF.pdf

Was it helpful?

Solution

Which version of the library do you use? I have tried to compile your code with the current version 0.1.5RC and the compiler could not find some classes.

After correction of the class paths I have found that the "new Grid(...)" constructor needs 7 parameters (in your case only 4).

Another issue is "width" in "Grid(...)". I don't know, what the developers wanted to express with it. I could get I normal view only with 60.

I have got the following PDF after all:

AlivePDF Grid

Here is my code:

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
           xmlns:s="library://ns.adobe.com/flex/spark" 
           xmlns:mx="library://ns.adobe.com/flex/mx" width="500" height="500">
<fx:Script>
    <![CDATA[
    import mx.collections.ArrayCollection;
    import org.alivepdf.colors.RGBColor;
    import org.alivepdf.data.Grid;
    import org.alivepdf.display.Display;
    import org.alivepdf.drawing.Caps;
    import org.alivepdf.fonts.FontFamily;
    import org.alivepdf.fonts.Style;
    import org.alivepdf.images.ImageFormat;
    import org.alivepdf.layout.Orientation;
    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.Method;
    import org.alivepdf.visibility.Visibility;
    import org.alivepdf.layout.*;
    private var myPDF:PDF;

    protected function savePDF(e:MouseEvent):void
    {
        var myPDF:PDF = new PDF( Orientation.PORTRAIT, Unit.MM); 
        myPDF.setDisplayMode( Display.FULL_PAGE, Layout.SINGLE_PAGE );

        var newPage:Page = new Page ( Orientation.PORTRAIT, Unit.MM);
        myPDF.addPage(newPage);

        myPDF.textStyle ( new RGBColor ( 0x000000 ) );

        var dp:ArrayCollection = new ArrayCollection();
        dp.addItem( { firstName : "Bob Geldorf akjaskaj skajs as kajs kaj k dklfj sdkfjl sdkjf ksdj fkjs dkfj ksdj ", lastName : "Groove", city : "Paris" } );
        dp.addItem( { firstName : "Bob", lastName : "Wise", city : "Paris" } );
        dp.addItem( { firstName : "Bob", lastName : "Wise", city : "Paris" } );
        dp.addItem( { firstName : "Bob", lastName : "Wise", city : "Paris" } );

        //var grid:Grid = new Grid ( dp.toArray(), 200, 100, new RGBColor (0x00DEFF));

        var grid:Grid = new Grid (dp.toArray(), 60, 100, new RGBColor(0x00DEFF), new RGBColor (0xFFFFFF), false, new RGBColor (0x000000));
        myPDF.addGrid( grid, 0, 0, true );

        //myPDF.save( Method.REMOTE, "coldfusion/pdf.cfm", "inline", "test.pdf" );

        var f:FileReference = new FileReference();
        var b:ByteArray = myPDF.save(Method.LOCAL);
        f.save(b, "test.pdf");
    }

    ]]>
</fx:Script>    

<mx:VBox width="100%" height="100%">
    <mx:HBox width="100%" backgroundColor="#FFFFFF">
        <mx:Spacer width="100%"/>
        <mx:Button horizontalCenter="0" label="Save to PDF" height="22"  click="savePDF(event)"  id="savePDFBtn" toolTip="SAVE TO PDF"/>
    </mx:HBox>
</mx:VBox>
</s:Application>

Try it, may be it will help you.

OTHER TIPS

When creating a PDF with a Grid, I had the same problem of duplicate headers, as reported here. It's a few years after your problem, but since i came across it now, here's my solution...

To ensure using the latest AlivePDF version, I have downloaded the latest source code from their SVN: http://alivepdf.googlecode.com/svn/trunk/AlivePDFBeta/src

I believe this is distributed as AlivePDF 0.1.5 RC, however the distributed SWCs seem to have differences in some method signatures.

While scanning the AlivePDF source code for behaviour related with adding the Grid header, I noticed the class org.alivepdf.pdf.PDF, public method addGrid. That method is indeed adding the Grid header 2 times, possibly by mistake. This was fixed by commenting lines 4178 to 4180, as shown in the following source code.

Full method with the commented portion included:

public function addGrid ( grid:Grid, x:Number=0, y:Number=0, repeatHeader:Boolean=true ):void
        {   
            if ( textColor == null ) 
                throw new Error("Please call the setFont and textStyle method before adding a Grid.");

            currentGrid = grid;
            currentGrid.x = x;
            currentGrid.y = y;
            var i:int = 0;
            var j:int = 0;

            currentGrid.generateColumns(false);
            columns = currentGrid.columns;

            var row:Array;
            columnNames = new Array();
            var lngColumns:int = columns.length;    
            var item:*;

            for (i = 0; i< lngColumns; i++)
                columnNames.push ( new GridCell(columns[i].headerText, currentGrid.headerColor ) );

            var rect:Rectangle = getRect ( columnNames, currentGrid.headerHeight );
            if ( checkPageBreak(rect.height) )
                addPage();

            // Commented to avoid the duplicate header issue:
            //setXY (x +currentGrid.x, y+getY() );
            //addRow( columnNames,'', rect);
            //endFill();

            setXY ( x+getX(), y+getY() );
            addRow( columnNames, GridRowType.HEADER, rect );

            if (grid.cells == null)
                grid.generateCells();

            var buffer:Array = grid.cells;
            var lngRows:int = buffer.length;

            for (i = 0; i< lngRows; i++)
            {

                item = buffer[i];
                row = new Array();
                for (j = 0; j< lngColumns; j++)
                {
                    row.push (item[columns[j].dataField] != null ? item[columns[j].dataField] : "");
                    nb = Math.min(nb,nbLines(columns[j].width,row[j]));
                }

                row = buffer[i];


                rect = getRect ( row, currentGrid.rowHeight );
                setX ( x + getX());

                if ( checkPageBreak(rect.height) )
                {
                    addPage();
                    setXY ( x+getX(),nextPageY );
                    //setXY ( x+getX(),y+getY() ); hacked to allow user to set the next Page Y of Grid
                    if ( repeatHeader ) 
                    {
                        addRow (columnNames, GridRowType.HEADER, getRect(columnNames, currentGrid.headerHeight) ); // header
                        setX ( x + getX() );
                    }
                }

                if ( grid.useAlternativeRowColor && Boolean(isEven = i&1) )
                    addRow( row, GridRowType.ALTERNATIVE, rect );
                else addRow( row, GridRowType.NORMAL, rect );
            }
        } 
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top