Ejemplo n.º 1
0
        /// <inheritdoc />
        /// <summary>
        /// Generates output in Portable Document Format [ pdf ].
        /// </summary>
        protected override void Execute()
        {
            using (var stream = new MemoryStream())
            {
                using (var document = new Document())
                {
                    #region initialize
                    var fields = Table.Fields;
                    #endregion

                    #region get input data
                    var rows = Service.RawDataFiltered;
                    #endregion

                    #region add data
                    var cells       = new Collection <PdfPCell>();
                    var fieldsTable = new Dictionary <BaseDataFieldModel, int>();
                    foreach (var row in rows)
                    {
                        foreach (var field in fields)
                        {
                            field.DataSource = row;
                            var value       = field.Value.GetValue(Provider.SpecialChars);
                            var valueLenght = value.FormattedValue.Length;

                            if (!fieldsTable.ContainsKey(field))
                            {
                                fieldsTable.Add(field, valueLenght);
                            }
                            else
                            {
                                var entry = fieldsTable[field];
                                if (valueLenght > entry)
                                {
                                    fieldsTable[field] = valueLenght;
                                }
                            }

                            cells.Add(PdfHelper.CreateCell(value));
                        }
                    }
                    #endregion

                    #region create pdf document, sets document orientation and create an empty table
                    var writer = PdfWriter.GetInstance(document, stream);

                    var hostDocument = Host.Document;
                    var pageSize     = hostDocument.Size.ToPageSize();
                    if (hostDocument.Orientation == KnownDocumentOrientation.Landscape)
                    {
                        pageSize = pageSize.Rotate();
                    }

                    document.SetPageSize(pageSize);
                    document.SetMarginsFromModel(hostDocument.Margins);

                    var table = new PdfPTable(fields.Count);
                    table.SetHorizontalLocationFrom(Table.Location);
                    #endregion

                    #region autofitcolumns?
                    table.AutoFitColumns(fieldsTable, this);
                    #endregion

                    #region assign class to handle document events
                    writer.PageEvent = new PdfPageEvent(this, table, rows);
                    #endregion

                    #region opens document
                    document.Open();
                    #endregion

                    #region add cells to table
                    table.AddCells(cells);
                    #endregion

                    #region add bottom aggregate
                    table.AddAggregateByLocation(Table, rows, Provider.SpecialChars.ToArray(), KnownAggregateLocation.Bottom);
                    #endregion

                    #region add table to document
                    document.Add(table);
                    #endregion
                }

                #region save
                Result.Add(stream.ToArray());
                #endregion
            }
        }