/// <summary>
        /// Add a row of pdfpcell to table.
        /// return True, current page have enought size for that row
        /// return False, current page not enought size for that row, row will be remove and need to draw on
        /// next page
        /// 20130606 :: jaimelopez :: mellorasinxelas to support absolute footer.
        /// </summary>
        /// <param name="table"></param>
        /// <param name="tableRowElement"></param>
        /// <param name="data"></param>
        /// <returns></returns>
        protected bool DrawTableRow(
            PdfPTable table,
            TableRow tableRowElement,
            IDictionary data)
        {
            bool enoughSpace = true;

            PDFDrawItextSharp.PDFDrawItextSharp pdfDraw = (PDFDrawItextSharp.PDFDrawItextSharp)pdfDrawer;
            foreach (TableCell tableCell in tableRowElement.TableCells)
            {
                PdfPCell cell = pdfDraw.CreateTableCell(tableCell.Attributes, data);
                foreach (DrawElement drawElement in tableCell.DrawElements)
                {
                    if (drawElement is TextBox)
                    {
                        //iTextSharp.text.Phrase phrase = _pdfDraw.CreatePhrase(
                        //    ((PDFTemplate.TextBox)drawElement).GetText(data), drawElement.FontAttributes);
                        Paragraph paragraph = pdfDraw.CreateParagraph(((TextBox)drawElement).GetText(data), drawElement.FontAttributes);
                        paragraph.Alignment = PDFDrawItextSharpHelper.Align(Helper.GetAttributeValue("align", drawElement.Attributes, "Left"));

                        cell.AddElement(paragraph);
                    }
                    else if (drawElement is PDFTemplate.Image)
                    {
                        //iTextSharp.text.Image image = pdfDraw.CreateImageFromAttribute(drawElement.Attributes);
                        //image.Alignment = PDFDrawItextSharpHelper.Align(Helper.GetAttributeValue("align", drawElement.Attributes, "Left"));

                        //cell.AddElement(image);

                        // 2017-11-23 : fix error image in table
                        string src = Moon.PDFDraw.Helper.GetAttributeValue("src", drawElement.Attributes, "");
                        if (data.Contains(src))
                        {
                            iTextSharp.text.Image image = pdfDraw.CreateImageFromAttribute(data[src].ToString(), drawElement.Attributes);
                            image.Alignment = PDFDrawItextSharpHelper.Align(Helper.GetAttributeValue("align", drawElement.Attributes, "Left"));

                            cell.AddElement(image);
                        }
                    }
                }
                table.AddCell(cell);
            }
            table.CompleteRow();

            //if(table.row
            //fixme need to check if any row span
            if (pdfDrawer.isNoMoreY(table.TotalHeight, DocumentGroup.Table))
            {
                enoughSpace = false;
                table.DeleteLastRow();
            }

            return(enoughSpace);
        }
        private void DrawPageNumber(Font font)
        {
#if DEBUG
            //Console.WriteLine("pageNumberBox: " + pageNumberBox.X + ", " + pageNumberBox.Y);
#endif
            PdfReader    reader  = new PdfReader(stream.ToArray());
            MemoryStream _stream = new MemoryStream();
            PdfStamper   stamper = new PdfStamper(reader, _stream);

            int currentPage = 1;
            int totalPage   = 0;
            int drawPage    = 1;

            PDFDrawItextSharp.PDFDrawItextSharp pDraw = (PDFDrawItextSharp.PDFDrawItextSharp)PdfDrawer;
            FontSelector selector = pDraw.FontSelector(font);

            foreach (int eachCount in EachPageCount)
            {
                if (drawPage == 1)
                {
                    currentPage = 1;
                    totalPage   = eachCount;
                }
                else
                {
                    currentPage = 1;
                    totalPage   = eachCount - totalPage;
                }
                while (drawPage <= eachCount)
                {
#if DEBUG
                    //Console.WriteLine("PDFTemplateItextSharp.DrawPageNumber: " + currentPage + "/" + totalPage);
#endif
                    if (PageNumberBoxes.Count < currentPage)
                    {
                        break;
                    }
                    var pageNumberBox = PageNumberBoxes[currentPage - 1];

                    Hashtable data = new Hashtable
                    {
                        { "{__PAGE__}", currentPage },
                        { "{__TOTALPAGE__}", totalPage }
                    };

                    PdfContentByte cb = stamper.GetOverContent(drawPage);
                    //iTextSharp.text.Phrase phrase = new iTextSharp.text.Chunk(pageNumberBox.GetText(data), font);
                    Phrase phrase = selector.Process(pageNumberBox.GetText(data));

                    //Console.WriteLine("chunk.Content: " + chunk.Content);
                    //iTextSharp.text.pdf.ColumnText column = new iTextSharp.text.pdf.ColumnText(cb);
                    int align = PDFDrawItextSharpHelper.Align(
                        Helper.GetAttributeValue(
                            "align",
                            pageNumberBox.Attributes, "Left"));

                    //20130610 :: mellorasinxelas :: change to static class
                    //20130721 :: cmwong :: change to PDFDrawItextSharp.DrawString()
                    pDraw.DrawString(cb, phrase, pageNumberBox.X, pageNumberBox.Y, pageNumberBox.Width, align, null);

                    currentPage++;
                    drawPage++;
                }
            }
            stamper.Close();
            stream = _stream;
        }