How to create multi page report with sum in each page footer of PDF document using C#
The Syncfusion Essential® PDF is a .NET PDF library used to create, read, and edit PDF documents. Using this library, you can create a multi-page report with a sum in each page's footer of a PDF document using C#.
Steps to create a multi-page report with a sum in each page’s footer of a PDF document
- Create a new Windows Forms application project.
- Install the Syncfusion.Pdf.WinForms NuGet package as a reference to your .NET Framework application from NuGet.org.
- Include the following namespaces in the Form1.cs file.
C#
using Syncfusion.Pdf; using Syncfusion.Pdf.Graphics; using Syncfusion.Pdf.Grid; using System.Drawing;
- Add the following code in the button1_Click to create a multi-page report with a sum in each page’s footer of a PDF document.
C#
private float sumOfCell2 = 0; private float sumOfCell3 = 0; private float sumOfCell4 = 0; private float sumOfCell5 = 0; private float sumOfCell6 = 0; private float sumOfCell7 = 0; private float sumOfCell8 = 0; private float sumOfCell9 = 0; //Create a PDF grid. PdfGrid pdfGrid; //Create a PDF page. PdfPage previousPage; private void button1_Click(object sender, EventArgs e) { //Create a new PDF document. PdfDocument pdfDocument = new PdfDocument(); //Add a page. PdfPage pdfPage = pdfDocument.Pages.Add(); previousPage = pdfPage; //Create a page added event to get the paginated page. pdfDocument.Pages.PageAdded += Pages_PageAdded; ; //Create a new PdfGrid. pdfGrid = new PdfGrid(); //Get a data table. DataTable dataTable = CreateDataTable(); //Assign a data source. pdfGrid.DataSource = dataTable; //Set a string format to align the header content in the center. for (int i = 0; i < pdfGrid.Columns.Count; i++) { pdfGrid.Columns[i].Format = new PdfStringFormat(PdfTextAlignment.Center); } //Set the column width. pdfGrid.Columns[1].Width = 100; //Call the BeginCellLayout event handler to apply the style and calculate the total. pdfGrid.BeginCellLayout += PdfGrid_BeginCellLayout; ; //Create a grid style to apply to pad for the entire grid. PdfGridStyle gridStyle = new PdfGridStyle(); gridStyle.CellPadding = new PdfPaddings(3, 3, 3, 3); //Apply the style to the grid. pdfGrid.Style = gridStyle; //Draw the PdfGrid. PdfLayoutResult result = pdfGrid.Draw(pdfPage, new RectangleF(0, 0, pdfPage.GetClientSize().Width, pdfPage.GetClientSize().Height - 50)); List<float> sumOfCells = new List<float>(); sumOfCells.Add(sumOfCell2); sumOfCells.Add(sumOfCell3); sumOfCells.Add(sumOfCell4); sumOfCells.Add(sumOfCell5); sumOfCells.Add(sumOfCell6); sumOfCells.Add(sumOfCell7); sumOfCells.Add(sumOfCell8); sumOfCells.Add(sumOfCell9); //Draw the footer table. DrawFooter(previousPage, pdfGrid, sumOfCells); //Save the document. pdfDocument.Save("Output.pdf"); //Close the document. pdfDocument.Close(true); Process.Start("Output.pdf"); }
Helper methods and evet handers:
private void PdfGrid_BeginCellLayout(object sender, PdfGridBeginCellLayoutEventArgs args) { if (!args.IsHeaderRow) { if (args.CellIndex == 2) sumOfCell2 += float.Parse(args.Value); else if (args.CellIndex == 3) sumOfCell3 += float.Parse(args.Value); else if (args.CellIndex == 4) sumOfCell4 += float.Parse(args.Value); else if (args.CellIndex == 5) sumOfCell5 += float.Parse(args.Value); else if (args.CellIndex == 6) sumOfCell6 += float.Parse(args.Value); else if (args.CellIndex == 7) sumOfCell7 += float.Parse(args.Value); else if (args.CellIndex == 8) sumOfCell8 += float.Parse(args.Value); else if (args.CellIndex == 9) sumOfCell9 += float.Parse(args.Value); } //Create a PDF grid. PdfGrid grid = sender as PdfGrid; //If it is not a header row, then apply the string format and grid style. if (!args.IsHeaderRow) { if (args.RowIndex != grid.Rows.Count - 1) { grid.Rows[args.RowIndex].Cells[args.CellIndex].Style.Borders.Top = PdfPens.Transparent; grid.Rows[args.RowIndex].Cells[args.CellIndex].Style.Borders.Bottom = PdfPens.Transparent; } else if (args.RowIndex == grid.Rows.Count - 1) { grid.Rows[args.RowIndex].Cells[args.CellIndex].Style.Borders.Top = PdfPens.Transparent; } } if (!args.IsHeaderRow) { if (args.CellIndex == 0 || args.CellIndex == 1) { grid.Rows[args.RowIndex].Cells[args.CellIndex].StringFormat = new PdfStringFormat(PdfTextAlignment.Left); } else if (args.CellIndex != 0 && args.CellIndex != 1) { grid.Rows[args.RowIndex].Cells[args.CellIndex].StringFormat = new PdfStringFormat(PdfTextAlignment.Right); } } } private void Pages_PageAdded(object sender, PageAddedEventArgs args) { //Add the calculated cell values to the list. List<float> sumOfCells = new List<float>(); sumOfCells.Add(sumOfCell2); sumOfCells.Add(sumOfCell3); sumOfCells.Add(sumOfCell4); sumOfCells.Add(sumOfCell5); sumOfCells.Add(sumOfCell6); sumOfCells.Add(sumOfCell7); sumOfCells.Add(sumOfCell8); sumOfCells.Add(sumOfCell9); //Draw the footer table. DrawFooter(previousPage, pdfGrid, sumOfCells); //Assign the current page. previousPage = args.Page; } /// <summary> /// Draw a table in the document footer. /// </summary> /// <param name="page"></param> /// <param name="pdfGrid"></param> /// <param name="sumOfCells"></param> private void DrawFooter(PdfPage page, PdfGrid pdfGrid, List<float> sumOfCells) { //Create a PDF template. PdfTemplate template = new PdfTemplate(page.GetClientSize().Width, 80); //Create a table in the footer. PdfGrid footerGrid = new PdfGrid(); //Get a DataTable. DataTable dataTable = CreateFooterDataTable(sumOfCells); //Assign a data source. footerGrid.DataSource = dataTable; //Assign a column with the same existing grid width. footerGrid.Columns[0].Width = pdfGrid.Columns[0].Width + pdfGrid.Columns[1].Width; ////Create a grid style to apply to pad for the entire grid. PdfGridStyle gridStyle = new PdfGridStyle(); gridStyle.CellPadding = new PdfPaddings(3, 3, 3, 3); //Apply the style to the grid. footerGrid.Style = gridStyle; //Call the BeginCellLayout event handler to apply the style and string format. footerGrid.BeginCellLayout += FooterGrid_BeginCellLayout; ; //Draw a table in the template graphics. footerGrid.Draw(template.Graphics, new RectangleF(0, 0, page.GetClientSize().Width, 80)); //Draw the template on the page graphics of the document. page.Graphics.DrawPdfTemplate(template, new PointF(0, page.GetClientSize().Height - 80), new SizeF(page.GetClientSize().Width, 80)); } private void FooterGrid_BeginCellLayout(object sender, PdfGridBeginCellLayoutEventArgs args) { //Hide the header in the table. if (args.IsHeaderRow) { args.Skip = true; } //Create a PDF grid PdfGrid grid = sender as PdfGrid; //If it is not a header row, then apply the cell style and string format. if (!args.IsHeaderRow) { //create and customize the string formats. grid.Rows[args.RowIndex].Cells[args.CellIndex].StringFormat = new PdfStringFormat(PdfTextAlignment.Right); if (args.CellIndex != grid.Rows[0].Cells.Count - 1) { //Set transparent to the respective borders. grid.Rows[0].Cells[args.CellIndex].Style.Borders.Bottom = PdfPens.Transparent; grid.Rows[0].Cells[args.CellIndex].Style.Borders.Right = PdfPens.Transparent; grid.Rows[1].Cells[args.CellIndex].Style.Borders.Top = PdfPens.Transparent; grid.Rows[1].Cells[args.CellIndex].Style.Borders.Right = PdfPens.Transparent; } else { grid.Rows[0].Cells[args.CellIndex].Style.Borders.Bottom = PdfPens.Transparent; grid.Rows[1].Cells[args.CellIndex].Style.Borders.Top = PdfPens.Transparent; } } } public DataTable CreateDataTable() { //Create a DataTable. DataTable dataTable = new DataTable(); //Add columns to the DataTable. dataTable.Columns.Add("OrderID"); dataTable.Columns.Add("ShipName"); dataTable.Columns.Add("Volume"); dataTable.Columns.Add("Quantity"); dataTable.Columns.Add("Amount"); dataTable.Columns.Add("Amount1"); dataTable.Columns.Add("Amount2"); dataTable.Columns.Add("Amount3"); dataTable.Columns.Add("Amount4"); dataTable.Columns.Add("Amount5"); //Add rows to the DataTable. dataTable.Rows.Add(new object[] { "204.009", "Northwind Tradersd", "0.00", "8934.00", "9056.009", "10070.01", "19357.004", "24761.03", "0.00", "5404.00" }); for (int i = 0; i < 15; i++) { dataTable.Rows.Add(new object[] { "204.009", "Queso Cabrales", "100.75", "8934.00", "9056.00", "5404.00", "100.75", "24761.00", "798.04", "5404.00" }); dataTable.Rows.Add(new object[] { "220.1", "Singaporean Hokkien Fried Mee", "00.00", "0.00", "345.00", "0.74", "0.75", "24761.00", "94.05", "98.01" }); dataTable.Rows.Add(new object[] { "231", "Mozzarella di Giovanniu", "50.00", "534.00", "8415.00", "90.00", "94.01", "0.00", "94.00", "0.10" }); } return dataTable; } public DataTable CreateFooterDataTable(List<float> sumOfCells) { //Create a DataTable. DataTable dataTable = new DataTable(); //Add columns to the DataTable. for (int i = 0; i < 9; i++) { dataTable.Columns.Add(); } //Add rows to the DataTable. dataTable.Rows.Add(new object[] { "Hanari Carne", "189081.19", "10949.75", "45880.24", "50306.60", "312013.78", "189739.24", "133186.24", "10911.70" }); dataTable.Rows.Add(new object[] { "Sum of cells", sumOfCells[0], sumOfCells[1], sumOfCells[2], sumOfCells[3], sumOfCells[4], sumOfCells[5], sumOfCells[6], sumOfCells[7] }); return dataTable; }
A complete working sample can be download from CreateTableSample.zip.
By executing the program, you will get the output document as follows,
Take a moment to peruse the documentation. You can find options like create a table using the PdfGrid and PdfLightTable, Paginating table, rows, column, and table customization. Also, the features like add header and footer in PDF document.
Refer to this link to explore a rich set of Syncfusion Essential® PDF features.
Starting with v16.2.0.x, if you reference Syncfusion® assemblies from trial setup or the NuGet feed, include a license key in your product. Refer to this link to learn about generating and registering the Syncfusion® license key in your application to use the components without trail message.
Also see:
Add header and footer to PDF document
Create a table in a PDF document
Create a table in a PDF file from DataTable