From a011e76a72913868af5482bfe0430426fa036d8f Mon Sep 17 00:00:00 2001 From: Nithya Date: Fri, 31 Oct 2025 17:17:44 +0530 Subject: [PATCH 1/4] 989389: Content check in blazor platform - Pdf Export --- blazor-toc.html | 3 +- blazor/gantt-chart/cell-selection.md | 6 +- blazor/gantt-chart/customizing-pdf-export.md | 1430 +++++++++++++++++ blazor/gantt-chart/header-and-footer.md | 206 +++ .../open-add-edit-dialog-dynamically.md | 35 +- .../blazor-gantt-chart-open-edit-dialog.png | Bin 87489 -> 0 bytes blazor/gantt-chart/pdf-export.md | 1228 +------------- blazor/gantt-chart/template-pdf-export.md | 425 ----- 8 files changed, 1674 insertions(+), 1659 deletions(-) create mode 100644 blazor/gantt-chart/customizing-pdf-export.md create mode 100644 blazor/gantt-chart/header-and-footer.md delete mode 100644 blazor/gantt-chart/images/blazor-gantt-chart-open-edit-dialog.png delete mode 100644 blazor/gantt-chart/template-pdf-export.md diff --git a/blazor-toc.html b/blazor-toc.html index e7db549928..d447215c11 100644 --- a/blazor-toc.html +++ b/blazor-toc.html @@ -3131,7 +3131,8 @@
  • Excel Export
  • PDF Export
  • Timezone
  • diff --git a/blazor/gantt-chart/cell-selection.md b/blazor/gantt-chart/cell-selection.md index 484e6b0311..90a9b73b21 100644 --- a/blazor/gantt-chart/cell-selection.md +++ b/blazor/gantt-chart/cell-selection.md @@ -13,7 +13,7 @@ Cell selection in the Gantt Chart component enables interactive selection of spe ## Single cell selection -Single cell selection in the Gantt chart is enabled by setting [GanttSelectionSettings.Mode](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttSelectionSettings.html#Syncfusion_Blazor_Gantt_GanttSelectionSettings_Mode) to **Cell** and [selectionSettings.type](https://ej2.syncfusion.com/angular/documentation/api/gantt/selectionSettings/#type) to **Single**. This allows selecting only one cell at a time. +Single cell selection in the Gantt chart is enabled by setting [GanttSelectionSettings.Mode](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttSelectionSettings.html#Syncfusion_Blazor_Gantt_GanttSelectionSettings_Mode) to **Cell** and [SelectionSettings.Type](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttSelectionSettings.html#Syncfusion_Blazor_Gantt_GanttSelectionSettings_Type) to **Single**. This allows selecting only one cell at a time. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -70,7 +70,7 @@ Single cell selection in the Gantt chart is enabled by setting [GanttSelectionSe ## Multiple cell selection -Multiple cell selection in the Gantt Chart is enabled by setting [selectionSettings.mode](https://ej2.syncfusion.com/angular/documentation/api/gantt/selectionSettings/#mode) to **Cell** and [selectionSettings.type](https://ej2.syncfusion.com/angular/documentation/api/gantt/selectionSettings/#type) to **Multiple**. This allows selecting multiple cells at a time by holding the Ctrl key while clicking on each desired cell. +Multiple cell selection in the Gantt Chart is enabled by setting [selectionSettings.mode](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttSelectionSettings.html#Syncfusion_Blazor_Gantt_GanttSelectionSettings_Mode) to **Cell** and [SelectionSettings.Type](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttSelectionSettings.html#Syncfusion_Blazor_Gantt_GanttSelectionSettings_Type) to **Multiple**. This allows selecting multiple cells at a time by holding the Ctrl key while clicking on each desired cell. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -194,7 +194,7 @@ Select a specific cell in the Gantt Chart by calling the [SelectCellAsync](http ## Customize cell selection action -You may customize cell selection behavior in the Gantt Chart using [cellSelecting](https://ej2.syncfusion.com/angular/documentation/api/gantt/events/#cellselecting), [cellSelected](https://ej2.syncfusion.com/angular/documentation/api/gantt/events/#cellselected), [cellDeselecting](https://ej2.syncfusion.com/angular/documentation/api/gantt/events/#celldeselecting), and [cellDeselected](https://ej2.syncfusion.com/angular/documentation/api/gantt/events/#celldeselected) events. +You may customize cell selection behavior in the Gantt Chart using [CellSelecting](https://blazor.syncfusion.com/documentation/gantt-chart/events#cellselecting), [CellSelected](https://blazor.syncfusion.com/documentation/gantt-chart/events#cellselected), [CellDeselecting](https://blazor.syncfusion.com/documentation/gantt-chart/events#celldeselecting), and [CellDeselected](https://blazor.syncfusion.com/documentation/gantt-chart/events#celldeselected) events. The following sample demonstrates selection is canceled in the `cellSelecting` event when the **TaskName** is **Perform Soil test**. diff --git a/blazor/gantt-chart/customizing-pdf-export.md b/blazor/gantt-chart/customizing-pdf-export.md new file mode 100644 index 0000000000..50f00114bf --- /dev/null +++ b/blazor/gantt-chart/customizing-pdf-export.md @@ -0,0 +1,1430 @@ +--- +layout: post +title: Customize PDF exporting in Blazor Gantt Chart component | Syncfusion +description: Learn here all about Customize PDF exporting in Syncfusion Blazor Gantt Chart component and much more. +platform: Blazor +control: Customize pdf export +documentation: ug +--- + +# To customize PDF export + +Customizing PDF export in the Blazor Gantt Chart component allows tailoring exported documents for specific needs, using [GanttPdfExportProperties](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttPdfExportProperties.html) to adjust file names, page orientation, size, columns, headers, footers, timelines, and templates. Ensuring focused content like selected rows or styled taskbars and [AllowPdfExport](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.SfGantt-1.html#Syncfusion_Blazor_Gantt_SfGantt_1_AllowPdfExport) enabled. Use [PdfExporting](https://blazor.syncfusion.com/documentation/gantt-chart/events#pdfexporting) and [PdfExported](https://blazor.syncfusion.com/documentation/gantt-chart/events#pdfexported) events for pre-export and post-export modifications, and [PdfQueryTaskbarInfo](https://blazor.syncfusion.com/documentation/gantt-chart/events#pdfquerytaskbarinfo) for taskbar styling. + +## Customize file name + +Set the exported PDF file name using the [FileName](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PdfExportPropertiesBase.html#Syncfusion_Blazor_Grids_PdfExportPropertiesBase_FileName) property in [GanttPdfExportProperties](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttPdfExportProperties.html), such as **ProjectSchedule.pdf**, for personalized document naming. + +{% tabs %} +{% highlight razor tabtitle="Index.razor" %} + +@using Syncfusion.Blazor.Gantt +@using Syncfusion.Blazor.Navigations + + + + + + + +@code { + private List TaskCollection { get; set; } + private SfGantt Gantt; + private List toolbarItem = new List() { new Syncfusion.Blazor.Navigations.ToolbarItem() { Text = "PDF Export", TooltipText = "PDF Export", Id = "PdfExport", PrefixIcon = "e-pdfexport" } }; + protected override void OnInitialized() + { + this.TaskCollection = GetTaskCollection(); + } + public async void ToolbarClickHandler(Syncfusion.Blazor.Navigations.ClickEventArgs args) + { + if (args.Item.Id == "PdfExport") + { + GanttPdfExportProperties exportProperties = new GanttPdfExportProperties(); + exportProperties.FileName = "ProjectSchedule.pdf"; + await Gantt.ExportToPdfAsync(exportProperties); + } + } + + public class TaskData + { + public int TaskID { get; set; } + public string TaskName { get; set; } + public DateTime StartDate { get; set; } + public DateTime? EndDate { get; set; } + public string Duration { get; set; } + public int Progress { get; set; } + public int? ParentID { get; set; } + public string Predecessor { get; set; } + } + + public static List GetTaskCollection() + { + List Tasks = new List() + { + new TaskData() { TaskID = 1, TaskName = "Project initiation", StartDate = new DateTime(2022, 04, 05), EndDate = new DateTime(2022, 04, 08), }, + new TaskData() { TaskID = 2, TaskName = "Identify Site location", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, ParentID = 1 }, + new TaskData() { TaskID = 3, TaskName = "Perform soil test", StartDate = new DateTime(2022, 04, 05), Duration = "4", Progress = 40, ParentID = 1, Predecessor = "2" }, + new TaskData() { TaskID = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, ParentID = 1 , Predecessor = "3" }, + new TaskData() { TaskID = 5, TaskName = "Project estimation", StartDate = new DateTime(2022, 04, 06), EndDate = new DateTime(2022, 04, 08), }, + new TaskData() { TaskID = 6, TaskName = "Develop floor plan for estimation", StartDate = new DateTime(2022, 04, 06), Duration = "3", Progress = 30, ParentID = 5 }, + new TaskData() { TaskID = 7, TaskName = "List materials", StartDate = new DateTime(2022, 04, 06), Duration = "3", Progress = 40, ParentID = 5 }, + new TaskData() { TaskID = 8, TaskName = "Estimation approval", StartDate = new DateTime(2022, 04, 06), Duration = "0", Progress = 30, ParentID = 5 } + }; + return Tasks; + } +} + +{% endhighlight %} +{% endtabs %} + +{% previewsample "https://blazorplayground.syncfusion.com/embed/BjBSCZNAhALZXWKG?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} + +## How to change the page orientation + +You can customize the page orientation of the exported PDF document in the Blazor Gantt chart by using the [PageOrientation](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PdfExportPropertiesBase.html#Syncfusion_Blazor_Grids_PdfExportPropertiesBase_PageOrientation) property in the [GanttPdfExportProperties](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttPdfExportProperties.html) class. +This property allows you to choose between [Portrait](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PageOrientation.html#Syncfusion_Blazor_Grids_PageOrientation_Portrait) (default) and [Landscape](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PageOrientation.html#Syncfusion_Blazor_Grids_PageOrientation_Landscape) orientations based on your layout requirements. Use `Portrait` for documents that require more vertical space, and `Landscape` when you need to fit more columns or wider taskbars. + +The following code snippet demonstrates how to set the page orientation to `Landscape` for the exported PDF document: + +{% tabs %} +{% highlight razor tabtitle="Index.razor" %} + +@using Syncfusion.Blazor.Gantt +@using Syncfusion.Blazor.Navigations + + + + + + + +@code { + private List TaskCollection { get; set; } + private SfGantt Gantt; + private List toolbarItem = new List() { new Syncfusion.Blazor.Navigations.ToolbarItem() { Text = "PDF Export", TooltipText = "PDF Export", Id = "PdfExport", PrefixIcon = "e-pdfexport" } }; + protected override void OnInitialized() + { + this.TaskCollection = GetTaskCollection(); + } + public async void ToolbarClickHandler(Syncfusion.Blazor.Navigations.ClickEventArgs args) + { + if (args.Item.Id == "PdfExport") + { + GanttPdfExportProperties exportProperties = new GanttPdfExportProperties(); + exportProperties.PageOrientation = Syncfusion.Blazor.Grids.PageOrientation.Landscape; + await Gantt.ExportToPdfAsync(exportProperties); + } + } + + public class TaskData + { + public int TaskID { get; set; } + public string TaskName { get; set; } + public DateTime StartDate { get; set; } + public DateTime? EndDate { get; set; } + public string Duration { get; set; } + public int Progress { get; set; } + public int? ParentID { get; set; } + public string Predecessor { get; set; } + } + + public static List GetTaskCollection() + { + List Tasks = new List() + { + new TaskData() { TaskID = 1, TaskName = "Project initiation", StartDate = new DateTime(2022, 04, 05), EndDate = new DateTime(2022, 04, 08), }, + new TaskData() { TaskID = 2, TaskName = "Identify Site location", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, ParentID = 1 }, + new TaskData() { TaskID = 3, TaskName = "Perform soil test", StartDate = new DateTime(2022, 04, 05), Duration = "4", Progress = 40, ParentID = 1, Predecessor = "2" }, + new TaskData() { TaskID = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, ParentID = 1 , Predecessor = "3" }, + new TaskData() { TaskID = 5, TaskName = "Project estimation", StartDate = new DateTime(2022, 04, 06), EndDate = new DateTime(2022, 04, 08), }, + new TaskData() { TaskID = 6, TaskName = "Develop floor plan for estimation", StartDate = new DateTime(2022, 04, 06), Duration = "3", Progress = 30, ParentID = 5 }, + new TaskData() { TaskID = 7, TaskName = "List materials", StartDate = new DateTime(2022, 04, 06), Duration = "3", Progress = 40, ParentID = 5 }, + new TaskData() { TaskID = 8, TaskName = "Estimation approval", StartDate = new DateTime(2022, 04, 06), Duration = "0", Progress = 30, ParentID = 5 } + }; + return Tasks; + } +} + +{% endhighlight %} +{% endtabs %} + +{% previewsample "https://blazorplayground.syncfusion.com/embed/BtVyMjNgBzDbCnDU?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} + +## Customize page size + +Page size can be customized for the exported document using the [PageSize](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PdfPageSize.html) property in [GanttPdfExportProperties](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttPdfExportProperties.html). +The supported page sizes are: + +* Letter +* Note +* Legal +* A0 to A9 +* B0 to B5 +* Archa +* Archb +* Archc +* Archd +* Arche +* Flsa +* HalfLetter +* Letter11x17 +* Ledger + +{% tabs %} +{% highlight razor tabtitle="Index.razor" %} + +@using Syncfusion.Blazor.Gantt +@using Syncfusion.Blazor.Navigations + + + + + + + +@code { + private List TaskCollection { get; set; } + private SfGantt Gantt; + private List toolbarItem = new List() { new Syncfusion.Blazor.Navigations.ToolbarItem() { Text = "PDF Export", TooltipText = "PDF Export", Id = "PdfExport", PrefixIcon = "e-pdfexport" } }; + protected override void OnInitialized() + { + this.TaskCollection = GetTaskCollection(); + } + public async void ToolbarClickHandler(Syncfusion.Blazor.Navigations.ClickEventArgs args) + { + if (args.Item.Id == "PdfExport") + { + GanttPdfExportProperties exportProperties = new GanttPdfExportProperties(); + exportProperties.PageSize = Syncfusion.Blazor.Grids.PdfPageSize.A4; + await Gantt.ExportToPdfAsync(exportProperties); + } + } + + public class TaskData + { + public int TaskID { get; set; } + public string TaskName { get; set; } + public DateTime StartDate { get; set; } + public DateTime? EndDate { get; set; } + public string Duration { get; set; } + public int Progress { get; set; } + public int? ParentID { get; set; } + public string Predecessor { get; set; } + } + + public static List GetTaskCollection() + { + List Tasks = new List() + { + new TaskData() { TaskID = 1, TaskName = "Project initiation", StartDate = new DateTime(2022, 04, 05), EndDate = new DateTime(2022, 04, 08), }, + new TaskData() { TaskID = 2, TaskName = "Identify Site location", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, ParentID = 1 }, + new TaskData() { TaskID = 3, TaskName = "Perform soil test", StartDate = new DateTime(2022, 04, 05), Duration = "4", Progress = 40, ParentID = 1, Predecessor = "2" }, + new TaskData() { TaskID = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, ParentID = 1 , Predecessor = "3" }, + new TaskData() { TaskID = 5, TaskName = "Project estimation", StartDate = new DateTime(2022, 04, 06), EndDate = new DateTime(2022, 04, 08), }, + new TaskData() { TaskID = 6, TaskName = "Develop floor plan for estimation", StartDate = new DateTime(2022, 04, 06), Duration = "3", Progress = 30, ParentID = 5 }, + new TaskData() { TaskID = 7, TaskName = "List materials", StartDate = new DateTime(2022, 04, 06), Duration = "3", Progress = 40, ParentID = 5 }, + new TaskData() { TaskID = 8, TaskName = "Estimation approval", StartDate = new DateTime(2022, 04, 06), Duration = "0", Progress = 30, ParentID = 5 } + }; + return Tasks; + } +} + +{% endhighlight %} +{% endtabs %} + +{% previewsample "https://blazorplayground.syncfusion.com/embed/BNhyiZZKhzLBWLhu?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} + +## Export current view records + +The PDF export functionality allows you to export only the records that are currently visible on the Gantt chart to a PDF document. This can be achieved by enabling the [IsCurrentViewExport](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.PdfExportEventArgs.html#Syncfusion_Blazor_Gantt_PdfExportEventArgs_IsCurrentViewExport) boolean property in the [PdfExporting](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttEvents-1.html#Syncfusion_Blazor_Gantt_GanttEvents_1_PdfExporting) event. + +> Exporting current view records is only applicable when the virtualization feature is enabled, and it does not retain the state of collapsed rows during export. + +The following code demonstrates how to use the `PdfExporting` event to export the current view data of the Gantt chart to a PDF document: + +{% tabs %} +{% highlight razor tabtitle="Index.razor" %} + +@using Syncfusion.Blazor.Gantt +@using Syncfusion.Blazor.Navigations + + + + + + + + + + + + + + + + + + + + +@code { + private SfGantt Gantt { get; set; } + private List toolbarItem = new List() { new Syncfusion.Blazor.Navigations.ToolbarItem() { Text = "PDF Export", TooltipText = "PDF Export", Id = "PdfExport", PrefixIcon = "e-pdfexport" } }; + private List TaskCollection { get; set; } + protected override void OnInitialized() + { + this.TaskCollection = VirtualData.GetTreeVirtualData(30); + } + public async void ToolbarClickHandler(Syncfusion.Blazor.Navigations.ClickEventArgs args) + { + if (args.Item.Id == "PdfExport") + { + await Gantt.ExportToPdfAsync(); + } + } + public void PdfExportingHandler(PdfExportEventArgs args) + { + args.IsCurrentViewExport = true; + } + public class VirtualData + { + public static List GetTreeVirtualData(int count) + { + List DataCollection = new List(); + Random rand = new Random(); + var x = 0; + int duration = 0; + DateTime startDate = new DateTime(2000, 1, 5); + DateTime endDate = new DateTime(2000, 1, 12); + string[] assignee = { "Allison Janney", "Bryan Fogel", "Richard King", "Alex Gibson" }; + string[] reporter = { "James Ivory", "Jordan Peele", "Guillermo del Toro", "Gary Oldman" }; + for (var i = 1; i <= count / 5; i++) + { + var name = rand.Next(0, 100); + TaskData Parent = new TaskData() + { + ID = ++x, + TaskName = "Task " + x, + StartDate = startDate, + EndDate = startDate.AddDays(26), + Duration = "20", + Assignee = "Mark Bridges", + Reporter = "Kobe Bryant", + Progress = 50, + }; + DataCollection.Add(Parent); + for (var j = 1; j <= 4; j++) + { + startDate = startDate.AddDays(j == 1 ? 0 : duration + 2); + duration = 5; + DataCollection.Add(new TaskData() + { + ID = ++x, + TaskName = "Task " + x, + StartDate = startDate, + EndDate = startDate.AddDays(5), + Duration = duration.ToString(), + Assignee = assignee[j - 1], + Reporter = reporter[j - 1], + Progress = 50, + ParentID = Parent.ID, + }); + } + } + return DataCollection; + } + } + public class TaskData + { + public int ID { get; set; } + public string TaskName { get; set; } + public DateTime? StartDate { get; set; } + public DateTime? EndDate { get; set; } + public string Duration { get; set; } + public string Assignee { get; set; } + public string Reporter { get; set; } + public int Progress { get; set; } + public int? ParentID { get; set; } + public string Predecessor { get; set; } + } +} + +{% endhighlight %} +{% endtabs %} + +{% previewsample "https://blazorplayground.syncfusion.com/embed/hjhyWjtqBfpHsisd?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} + +## How to export Gantt chart with custom timeline range + +The PDF export functionality allows you to export a specific timeline range of the Gantt chart to a PDF document. To define the custom range, set the [RangeStart](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.PdfExportEventArgs.html#Syncfusion_Blazor_Gantt_PdfExportEventArgs_RangeStart) and [RangeEnd](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.PdfExportEventArgs.html#Syncfusion_Blazor_Gantt_PdfExportEventArgs_RangeEnd) properties within the [PdfExporting](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttEvents-1.html#Syncfusion_Blazor_Gantt_GanttEvents_1_PdfExporting) event. + +The `RangeStart` property specifies the start date, and the `RangeEnd` property specifies the end date of the timeline range to be exported. + +The following code demonstrates how to use the `PdfExporting` event to export a custom timeline range of the Gantt chart to a PDF document: + +{% tabs %} +{% highlight razor tabtitle="Index.razor" %} + +@using Syncfusion.Blazor.Gantt +@using Syncfusion.Blazor.Navigations + + + + + + + + + + + + + + + + + + + + +@code { + private SfGantt Gantt { get; set; } + private List toolbarItem = new List() { new Syncfusion.Blazor.Navigations.ToolbarItem() { Text = "PDF Export", TooltipText = "PDF Export", Id = "PdfExport", PrefixIcon = "e-pdfexport" } }; + private List TaskCollection { get; set; } + protected override void OnInitialized() + { + this.TaskCollection = VirtualData.GetTreeVirtualData(30); + } + public async void ToolbarClickHandler(Syncfusion.Blazor.Navigations.ClickEventArgs args) + { + if (args.Item.Id == "PdfExport") + { + await Gantt.ExportToPdfAsync(); + } + } + public void PdfExportingHandler(PdfExportEventArgs args) + { + args.RangeStart = new DateTime(2000, 1, 14); + args.RangeEnd = new DateTime(2000, 05, 12); + } + public class VirtualData + { + public static List GetTreeVirtualData(int count) + { + List DataCollection = new List(); + var x = 0; + int duration = 0; + DateTime startDate = new DateTime(2000, 1, 5); + DateTime endDate = new DateTime(2000, 1, 12); + string[] assignee = { "Allison Janney", "Bryan Fogel", "Richard King", "Alex Gibson" }; + string[] reporter = { "James Ivory", "Jordan Peele", "Guillermo del Toro", "Gary Oldman" }; + for (var i = 1; i <= count / 5; i++) + { + TaskData Parent = new TaskData() + { + ID = ++x, + TaskName = "Task " + x, + StartDate = startDate, + EndDate = startDate.AddDays(26), + Duration = "20", + Assignee = "Mark Bridges", + Reporter = "Kobe Bryant", + Progress = 50, + }; + DataCollection.Add(Parent); + for (var j = 1; j <= 4; j++) + { + startDate = startDate.AddDays(j == 1 ? 0 : duration + 2); + duration = 5; + DataCollection.Add(new TaskData() + { + ID = ++x, + TaskName = "Task " + x, + StartDate = startDate, + EndDate = startDate.AddDays(5), + Duration = duration.ToString(), + Assignee = assignee[j - 1], + Reporter = reporter[j - 1], + Progress = 50, + ParentID = Parent.ID, + }); + } + } + return DataCollection; + } + } + public class TaskData + { + public int ID { get; set; } + public string TaskName { get; set; } + public DateTime? StartDate { get; set; } + public DateTime? EndDate { get; set; } + public string Duration { get; set; } + public string Assignee { get; set; } + public string Reporter { get; set; } + public int Progress { get; set; } + public int? ParentID { get; set; } + public string Predecessor { get; set; } + } +} + +{% endhighlight %} +{% endtabs %} + +{% previewsample "https://blazorplayground.syncfusion.com/embed/rtByWjjUrpHrtFIB?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} + +## Export hidden columns + +PDF export provides an option to export hidden columns of Gantt by defining the [IncludeHiddenColumn](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PdfExportPropertiesBase.html#Syncfusion_Blazor_Grids_PdfExportPropertiesBase_IncludeHiddenColumn) to **true**. + +{% tabs %} +{% highlight razor tabtitle="Index.razor" %} + +@using Syncfusion.Blazor.Gantt +@using Syncfusion.Blazor.Navigations + + + + + + + + + + + + + + + +@code { + private List TaskCollection { get; set; } + private SfGantt Gantt; + private List toolbarItem = new List() { new Syncfusion.Blazor.Navigations.ToolbarItem() { Text = "PDF Export", TooltipText = "PDF Export", Id = "PdfExport", PrefixIcon = "e-pdfexport" } }; + protected override void OnInitialized() + { + this.TaskCollection = GetTaskCollection(); + } + public async void ToolbarClickHandler(Syncfusion.Blazor.Navigations.ClickEventArgs args) + { + if (args.Item.Id == "PdfExport") + { + GanttPdfExportProperties exportProperties = new GanttPdfExportProperties(); + exportProperties.IncludeHiddenColumn = true; + await Gantt.ExportToPdfAsync(exportProperties); + } + } + + public class TaskData + { + public int TaskID { get; set; } + public string TaskName { get; set; } + public DateTime StartDate { get; set; } + public DateTime? EndDate { get; set; } + public string Duration { get; set; } + public int Progress { get; set; } + public int? ParentID { get; set; } + public string Predecessor { get; set; } + } + + public static List GetTaskCollection() + { + List Tasks = new List() + { + new TaskData() { TaskID = 1, TaskName = "Project initiation", StartDate = new DateTime(2022, 04, 05), EndDate = new DateTime(2022, 04, 08), }, + new TaskData() { TaskID = 2, TaskName = "Identify Site location", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, ParentID = 1 }, + new TaskData() { TaskID = 3, TaskName = "Perform soil test", StartDate = new DateTime(2022, 04, 05), Duration = "4", Progress = 40, ParentID = 1, Predecessor = "2" }, + new TaskData() { TaskID = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, ParentID = 1 , Predecessor = "3" }, + new TaskData() { TaskID = 5, TaskName = "Project estimation", StartDate = new DateTime(2022, 04, 06), EndDate = new DateTime(2022, 04, 08), }, + new TaskData() { TaskID = 6, TaskName = "Develop floor plan for estimation", StartDate = new DateTime(2022, 04, 06), Duration = "3", Progress = 30, ParentID = 5 }, + new TaskData() { TaskID = 7, TaskName = "List materials", StartDate = new DateTime(2022, 04, 06), Duration = "3", Progress = 40, ParentID = 5 }, + new TaskData() { TaskID = 8, TaskName = "Estimation approval", StartDate = new DateTime(2022, 04, 06), Duration = "0", Progress = 30, ParentID = 5 } + }; + return Tasks; + } +} + +{% endhighlight %} +{% endtabs %} + +{% previewsample "https://blazorplayground.syncfusion.com/embed/VtreCNXgVTcKHkcY?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} + +## Customize column width in exported PDF document + +To customize column widths in the exported PDF document, set the [Width](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttColumn.html#Syncfusion_Blazor_Gantt_GanttColumn_Width) property for each column using the [Columns](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttPdfExportProperties.html#Syncfusion_Blazor_Gantt_GanttPdfExportProperties_Columns) property of the [GanttPdfExportProperties](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttPdfExportProperties.html) class. + +{% tabs %} +{% highlight razor tabtitle="Index.razor" %} + +@using Syncfusion.Blazor.Gantt +@using Syncfusion.Blazor.Grids +@using Syncfusion.Blazor.Navigations +@using Syncfusion.PdfExport + + + + + + + + + + + + + + + +@code { + private List TaskCollection { get; set; } + private SfGantt Gantt; + private List toolbarItem = new List() { new Syncfusion.Blazor.Navigations.ToolbarItem() { Text = "PDF Export", TooltipText = "PDF Export", Id = "PdfExport", PrefixIcon = "e-pdfexport" } }; + protected override void OnInitialized() + { + this.TaskCollection = GetTaskCollection(); + } + public async void ToolbarClickHandler(Syncfusion.Blazor.Navigations.ClickEventArgs args) + { + if (args.Item.Id == "PdfExport") + { + GanttPdfExportProperties exportProperties = new GanttPdfExportProperties(); + exportProperties.Columns = new List() + { + new GanttColumn(){ Field = "TaskID", HeaderText = "Task Id", Width = "200" }, + new GanttColumn(){ Field = "TaskName", HeaderText = "Task Name", Width = "250"}, + new GanttColumn(){ Field = "StartDate", HeaderText = "Start Date", Width = "150"}, + }; + await Gantt.ExportToPdfAsync(exportProperties); + } + } + + public class TaskData + { + public int TaskID { get; set; } + public string TaskName { get; set; } + public DateTime StartDate { get; set; } + public DateTime? EndDate { get; set; } + public string Duration { get; set; } + public int Progress { get; set; } + public int? ParentID { get; set; } + public string Predecessor { get; set; } + } + + public static List GetTaskCollection() + { + List Tasks = new List() + { + new TaskData() { TaskID = 1, TaskName = "Project initiation", StartDate = new DateTime(2022, 04, 05), EndDate = new DateTime(2022, 04, 08), }, + new TaskData() { TaskID = 2, TaskName = "Identify Site location", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, ParentID = 1 }, + new TaskData() { TaskID = 3, TaskName = "Perform soil test", StartDate = new DateTime(2022, 04, 05), Duration = "4", Progress = 40, ParentID = 1, Predecessor = "2" }, + new TaskData() { TaskID = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, ParentID = 1 , Predecessor = "3" }, + new TaskData() { TaskID = 5, TaskName = "Project estimation", StartDate = new DateTime(2022, 04, 06), EndDate = new DateTime(2022, 04, 08), }, + new TaskData() { TaskID = 6, TaskName = "Develop floor plan for estimation", StartDate = new DateTime(2022, 04, 06), Duration = "3", Progress = 30, ParentID = 5 }, + new TaskData() { TaskID = 7, TaskName = "List materials", StartDate = new DateTime(2022, 04, 06), Duration = "3", Progress = 40, ParentID = 5 }, + new TaskData() { TaskID = 8, TaskName = "Estimation approval", StartDate = new DateTime(2022, 04, 06), Duration = "0", Progress = 30, ParentID = 5 } + }; + return Tasks; + } +} + +{% endhighlight %} +{% endtabs %} + +{% previewsample "https://blazorplayground.syncfusion.com/embed/LtBostXgrIjeKZvL?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} + +## How to export Gantt chart with specific columns + +### Through property + +The PDF export functionality enables you to export only specific columns from the Gantt chart, rather than exporting all columns by default. To achieve this, set the [Columns](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttPdfExportProperties.html#Syncfusion_Blazor_Gantt_GanttPdfExportProperties_Columns) property of the [GanttPdfExportProperties](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttPdfExportProperties.html) class. This allows you to tailor the exported PDF to include only the columns that are relevant to your needs. + +The following code snippet demonstrates how to configure the `Columns` property to export specific columns from the Gantt chart to a PDF document: + +{% tabs %} +{% highlight razor tabtitle="Index.razor" %} + +@using Syncfusion.Blazor.Gantt +@using Syncfusion.Blazor.Grids +@using Syncfusion.Blazor.Navigations +@using Syncfusion.PdfExport + + + + + + + + + + + + + + + +@code { + private List TaskCollection { get; set; } + private SfGantt Gantt; + private List toolbarItem = new List() { new Syncfusion.Blazor.Navigations.ToolbarItem() { Text = "PDF Export", TooltipText = "PDF Export", Id = "PdfExport", PrefixIcon = "e-pdfexport" } }; + protected override void OnInitialized() + { + this.TaskCollection = GetTaskCollection(); + } + public async void ToolbarClickHandler(Syncfusion.Blazor.Navigations.ClickEventArgs args) + { + if (args.Item.Id == "PdfExport") + { + GanttPdfExportProperties exportProperties = new GanttPdfExportProperties(); + exportProperties.Columns = new List() + { + new GanttColumn(){ Field = "TaskID", HeaderText = "Task Id", Width = "100" }, + new GanttColumn(){ Field = "TaskName", HeaderText = "Task Name", Width = "200"}, + new GanttColumn(){ Field = "StartDate", HeaderText = "Start Date", Width = "150"}, + }; + await Gantt.ExportToPdfAsync(exportProperties); + } + } + + public class TaskData + { + public int TaskID { get; set; } + public string TaskName { get; set; } + public DateTime StartDate { get; set; } + public DateTime? EndDate { get; set; } + public string Duration { get; set; } + public int Progress { get; set; } + public int? ParentID { get; set; } + public string Predecessor { get; set; } + } + + public static List GetTaskCollection() + { + List Tasks = new List() + { + new TaskData() { TaskID = 1, TaskName = "Project initiation", StartDate = new DateTime(2022, 04, 05), EndDate = new DateTime(2022, 04, 08), }, + new TaskData() { TaskID = 2, TaskName = "Identify Site location", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, ParentID = 1 }, + new TaskData() { TaskID = 3, TaskName = "Perform soil test", StartDate = new DateTime(2022, 04, 05), Duration = "4", Progress = 40, ParentID = 1, Predecessor = "2" }, + new TaskData() { TaskID = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, ParentID = 1 , Predecessor = "3" }, + new TaskData() { TaskID = 5, TaskName = "Project estimation", StartDate = new DateTime(2022, 04, 06), EndDate = new DateTime(2022, 04, 08), }, + new TaskData() { TaskID = 6, TaskName = "Develop floor plan for estimation", StartDate = new DateTime(2022, 04, 06), Duration = "3", Progress = 30, ParentID = 5 }, + new TaskData() { TaskID = 7, TaskName = "List materials", StartDate = new DateTime(2022, 04, 06), Duration = "3", Progress = 40, ParentID = 5 }, + new TaskData() { TaskID = 8, TaskName = "Estimation approval", StartDate = new DateTime(2022, 04, 06), Duration = "0", Progress = 30, ParentID = 5 } + }; + return Tasks; + } +} + +{% endhighlight %} +{% endtabs %} + +{% previewsample "https://blazorplayground.syncfusion.com/embed/hXhIiXZAVoCQueAU?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} + +### Through event + +The PDF export functionality allows you to export only specific columns from the Gantt chart, rather than exporting all columns by default. This can be achieved by using the `Columns` argument in the [PdfExporting](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttEvents-1.html#Syncfusion_Blazor_Gantt_GanttEvents_1_PdfExporting) event. + +The following code demonstrates how to use the `PdfExporting` event to export specific columns of the Gantt chart to a PDF document, + +{% tabs %} +{% highlight razor tabtitle="Index.razor" %} + +@using Syncfusion.Blazor.Gantt +@using Syncfusion.Blazor.Grids +@using Syncfusion.Blazor.Navigations +@using Syncfusion.PdfExport + + + + + + + + + + + + + + + +@code { + private List TaskCollection { get; set; } + private SfGantt Gantt; + private List toolbarItem = new List() { new Syncfusion.Blazor.Navigations.ToolbarItem() { Text = "PDF Export", TooltipText = "PDF Export", Id = "PdfExport", PrefixIcon = "e-pdfexport" } }; + protected override void OnInitialized() + { + this.TaskCollection = GetTaskCollection(); + } + public async void ToolbarClickHandler(Syncfusion.Blazor.Navigations.ClickEventArgs args) + { + if (args.Item.Id == "PdfExport") + { + await Gantt.ExportToPdfAsync(); + } + } + public void PdfExportingHandler(PdfExportEventArgs args) + { + args.Columns = new List() + { + new GanttColumn(){ Field = "TaskID", HeaderText = "Task Id", Width = "100" }, + new GanttColumn(){ Field = "TaskName", HeaderText = "Task Name", Width = "200"}, + new GanttColumn(){ Field = "StartDate", HeaderText = "Start Date", Width = "150"}, + }; + } + + public class TaskData + { + public int TaskID { get; set; } + public string TaskName { get; set; } + public DateTime StartDate { get; set; } + public DateTime? EndDate { get; set; } + public string Duration { get; set; } + public int Progress { get; set; } + public int? ParentID { get; set; } + public string Predecessor { get; set; } + } + + public static List GetTaskCollection() + { + List Tasks = new List() + { + new TaskData() { TaskID = 1, TaskName = "Project initiation", StartDate = new DateTime(2022, 04, 05), EndDate = new DateTime(2022, 04, 08), }, + new TaskData() { TaskID = 2, TaskName = "Identify Site location", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, ParentID = 1 }, + new TaskData() { TaskID = 3, TaskName = "Perform soil test", StartDate = new DateTime(2022, 04, 05), Duration = "4", Progress = 40, ParentID = 1, Predecessor = "2" }, + new TaskData() { TaskID = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, ParentID = 1 , Predecessor = "3" }, + new TaskData() { TaskID = 5, TaskName = "Project estimation", StartDate = new DateTime(2022, 04, 06), EndDate = new DateTime(2022, 04, 08), }, + new TaskData() { TaskID = 6, TaskName = "Develop floor plan for estimation", StartDate = new DateTime(2022, 04, 06), Duration = "3", Progress = 30, ParentID = 5 }, + new TaskData() { TaskID = 7, TaskName = "List materials", StartDate = new DateTime(2022, 04, 06), Duration = "3", Progress = 40, ParentID = 5 }, + new TaskData() { TaskID = 8, TaskName = "Estimation approval", StartDate = new DateTime(2022, 04, 06), Duration = "0", Progress = 30, ParentID = 5 } + }; + return Tasks; + } +} + +{% endhighlight %} +{% endtabs %} + +{% previewsample "https://blazorplayground.syncfusion.com/embed/hXVoCjXAVSBmCcUQ?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} + +## Customizing taskbar appearance + +You can customize the appearance of taskbars in the exported PDF document using either properties or events, based on your requirements. + +### Through property + +The PDF export functionality allows you to customize the appearance of taskbars in the exported PDF document using the [TaskbarColor](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.PdfGanttStyle.html#Syncfusion_Blazor_Gantt_PdfGanttStyle_TaskbarColor) property in the [GanttPdfExportProperties](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttPdfExportProperties.html) class. This property lets you define custom colors for different types of taskbars, including: + +* Parent Taskbars +* Child Taskbars +* Milestones +* Critical Paths +* Manual Taskbars +* Baselines + +The following code snippet demonstrates how to customize taskbar colors in the exported PDF document: + +{% tabs %} +{% highlight razor tabtitle="Index.razor" %} + +@using Syncfusion.Blazor.Gantt +@using Syncfusion.Blazor.Grids +@using Syncfusion.Blazor.Navigations +@using Syncfusion.PdfExport + + + + + + + + + + + + + + +@code { + private List TaskCollection { get; set; } + private SfGantt Gantt; + private List toolbarItem = new List() { new Syncfusion.Blazor.Navigations.ToolbarItem() { Text = "PDF Export", TooltipText = "PDF Export", Id = "PdfExport", PrefixIcon = "e-pdfexport" } }; + protected override void OnInitialized() + { + this.TaskCollection = GetTaskCollection(); + } + public async void ToolbarClickHandler(Syncfusion.Blazor.Navigations.ClickEventArgs args) + { + if (args.Item.Id == "PdfExport") + { + GanttPdfExportProperties pdfExport = new GanttPdfExportProperties(); + pdfExport.Style = new PdfGanttStyle(); + pdfExport.Style.TaskbarColor = new PdfTaskbarColor(); + pdfExport.Style.TaskbarColor.ParentTaskbarColor = new PdfColor(220, 118, 51); + pdfExport.Style.TaskbarColor.ParentProgressColor = new PdfColor(203, 67, 53); + pdfExport.Style.TaskbarColor.ChildProgressColor = new PdfColor(35, 155, 86); + pdfExport.Style.TaskbarColor.ChildTaskbarColor = new PdfColor(130, 224, 170); + pdfExport.Style.TaskbarColor.CriticalPathTaskbarColor = new PdfColor(173, 121, 64); + pdfExport.Style.TaskbarColor.CriticalPathProgressColor = new PdfColor(145, 76, 0); + pdfExport.Style.TaskbarColor.BaselineColor = new PdfColor(179, 38, 30); + pdfExport.Style.TaskbarColor.MilestoneColor = new PdfColor(141, 124, 187); + await Gantt.ExportToPdfAsync(pdfExport); + } + } + + public class TaskData + { + public int TaskID { get; set; } + public string TaskName { get; set; } + public DateTime? BaselineStartDate { get; set; } + public DateTime? BaselineEndDate { get; set; } + public DateTime StartDate { get; set; } + public DateTime? EndDate { get; set; } + public string Duration { get; set; } + public int Progress { get; set; } + public int? ParentID { get; set; } + } + + public static List GetTaskCollection() + { + List Tasks = new List() + { + new TaskData() { TaskID = 1, TaskName = "Project initiation", BaselineStartDate = new DateTime(2021, 04, 02), BaselineEndDate = new DateTime(2021, 04, 04), StartDate = new DateTime(2021, 04, 02), EndDate = new DateTime(2021, 04, 08) }, + new TaskData() { TaskID = 2, TaskName = "Identify site location", StartDate = new DateTime(2021, 04, 02), EndDate = new DateTime(2021, 04, 02), Duration = "0", BaselineStartDate = new DateTime(2021, 04, 02), BaselineEndDate = new DateTime(2021, 04, 02), Progress = 30, ParentID = 1 }, + new TaskData() { TaskID = 3, TaskName = "Perform soil test", StartDate = new DateTime(2021, 04, 02), Duration = "5", Progress = 40, BaselineStartDate = new DateTime(2021, 04, 02), BaselineEndDate = new DateTime(2021, 04, 06), ParentID = 1 }, + new TaskData() { TaskID = 4, TaskName = "Soil test approval", StartDate = new DateTime(2021, 04, 08), Duration = "0", EndDate = new DateTime(2021, 04, 08), BaselineStartDate = new DateTime(2021, 04, 08), BaselineEndDate = new DateTime(2021, 04, 08), Progress = 30, ParentID = 1 }, + new TaskData() { TaskID = 5, TaskName = "Project initiation", StartDate = new DateTime(2021, 04, 02), EndDate = new DateTime(2021, 04, 08) }, + new TaskData() { TaskID = 6, TaskName = "Identify site location", StartDate = new DateTime(2021, 04, 02), Duration = "2", Progress = 30, ParentID = 5, BaselineStartDate = new DateTime(2021, 04, 02), BaselineEndDate = new DateTime(2021, 04, 02) }, + new TaskData() { TaskID = 7, TaskName = "Perform soil test", StartDate = new DateTime(2021, 04, 02), Duration = "4", Progress = 40, ParentID = 5, BaselineStartDate = new DateTime(2021, 04, 02), BaselineEndDate = new DateTime(2021, 04, 03) }, + new TaskData() { TaskID = 8, TaskName = "Soil test approval", StartDate = new DateTime(2021, 04, 02), Duration = "5", Progress = 30, ParentID = 5, BaselineStartDate = new DateTime(2021, 04, 02), BaselineEndDate = new DateTime(2021, 04, 04) } + }; + return Tasks; + } +} + +{% endhighlight %} +{% endtabs %} + +{% previewsample "https://blazorplayground.syncfusion.com/embed/BXVyijDKBofOIgSk?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} + +### Through event + +The PDF export functionality allows you to customize the appearance of taskbars in the exported PDF document using the [PdfQueryTaskbarInfo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttEvents-1.html#Syncfusion_Blazor_Gantt_GanttEvents_1_PdfQueryTaskbarInfo) event. This event provides flexibility to format various taskbar types, including parent taskbars, individual taskbars, and milestone templates. + +The following code snippet demonstrates how to use the `PdfQueryTaskbarInfo` event to customize taskbar appearance in the exported PDF document: + +{% tabs %} +{% highlight razor tabtitle="Index.razor" %} + +@using Syncfusion.Blazor.Gantt +@using Syncfusion.Blazor.Grids +@using Syncfusion.Blazor.Navigations +@using Syncfusion.PdfExport + + + + + + + + + + + + + + + +@code { + private List TaskCollection { get; set; } + private SfGantt Gantt; + private List toolbarItem = new List() { new Syncfusion.Blazor.Navigations.ToolbarItem() { Text = "PDF Export", TooltipText = "PDF Export", Id = "PdfExport", PrefixIcon = "e-pdfexport" } }; + protected override void OnInitialized() + { + this.TaskCollection = GetTaskCollection(); + } + public async void ToolbarClickHandler(Syncfusion.Blazor.Navigations.ClickEventArgs args) + { + if (args.Item.Id == "PdfExport") + { + await Gantt.ExportToPdfAsync(); + } + } + public void PdfQueryTaskbarInfoHandler(PdfQueryTaskbarInfoEventArgs args) + { + if (args.Data.TaskID == 3) + { + args.TaskbarStyle.Color = new PdfTaskbarColor(); + args.TaskbarStyle.Color.ChildProgressColor = new Syncfusion.PdfExport.PdfColor(103, 80, 164); + args.TaskbarStyle.Color.ChildTaskbarColor = new Syncfusion.PdfExport.PdfColor(141, 124, 187); + } + if (args.Data.TaskID == 4) + { + args.TaskbarStyle.Color = new PdfTaskbarColor(); + args.TaskbarStyle.Color.MilestoneColor = new Syncfusion.PdfExport.PdfColor(103, 80, 164); + } + + } + public class TaskData + { + public int TaskID { get; set; } + public string TaskName { get; set; } + public DateTime StartDate { get; set; } + public DateTime? EndDate { get; set; } + public string Duration { get; set; } + public int Progress { get; set; } + public int? ParentID { get; set; } + public string Predecessor { get; set; } + } + + public static List GetTaskCollection() + { + List Tasks = new List() + { + new TaskData() { TaskID = 1, TaskName = "Project initiation", StartDate = new DateTime(2022, 04, 05), EndDate = new DateTime(2022, 04, 08), }, + new TaskData() { TaskID = 2, TaskName = "Identify Site location", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, ParentID = 1 }, + new TaskData() { TaskID = 3, TaskName = "Perform soil test", StartDate = new DateTime(2022, 04, 05), Duration = "4", Progress = 40, ParentID = 1, Predecessor = "2" }, + new TaskData() { TaskID = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, ParentID = 1 , Predecessor = "3" }, + new TaskData() { TaskID = 5, TaskName = "Project estimation", StartDate = new DateTime(2022, 04, 06), EndDate = new DateTime(2022, 04, 08), }, + new TaskData() { TaskID = 6, TaskName = "Develop floor plan for estimation", StartDate = new DateTime(2022, 04, 06), Duration = "3", Progress = 30, ParentID = 5 }, + new TaskData() { TaskID = 7, TaskName = "List materials", StartDate = new DateTime(2022, 04, 06), Duration = "3", Progress = 40, ParentID = 5 }, + new TaskData() { TaskID = 8, TaskName = "Estimation approval", StartDate = new DateTime(2022, 04, 06), Duration = "0", Progress = 30, ParentID = 5 } + }; + return Tasks; + } +} + +{% endhighlight %} +{% endtabs %} + +{% previewsample "https://blazorplayground.syncfusion.com/embed/VDheittqhyxNSXIj?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} + +## Exporting with templates + +### Exporting with column template + +The PDF export functionality allows for advanced customization of Gantt chart columns, including the inclusion of images, background colors, and custom text. This can be achieved using the [PdfQueryCellInfo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttEvents-1.html#Syncfusion_Blazor_Gantt_GanttEvents_1_PdfQueryCellInfo) event. By handling this event, you can define how individual cells in the Gantt chart are rendered in the exported PDF. + +The following code snippet demonstrates how to use the `PdfQueryCellInfo` event to export Gantt columns with custom text and different cell background colors, + +{% tabs %} +{% highlight razor tabtitle="Index.razor" %} + +@using Syncfusion.Blazor.Gantt +@using Syncfusion.Blazor.Grids +@using Syncfusion.Blazor.Navigations +@using Syncfusion.PdfExport + + + + + + + + + + + + + + + +@code { + private List TaskCollection { get; set; } + private SfGantt Gantt; + private List toolbarItem = new List() { new Syncfusion.Blazor.Navigations.ToolbarItem() { Text = "PDF Export", TooltipText = "PDF Export", Id = "PdfExport", PrefixIcon = "e-pdfexport" } }; + protected override void OnInitialized() + { + this.TaskCollection = GetTaskCollection(); + } + public async void ToolbarClickHandler(Syncfusion.Blazor.Navigations.ClickEventArgs args) + { + if (args.Item.Id == "PdfExport") + { + await Gantt.ExportToPdfAsync(); + } + } + public void PdfQueryCellInfoHandler(Syncfusion.Blazor.Gantt.PdfQueryCellInfoEventArgs args) + { + if (args.Column.Field == "TaskName" && args.Data.TaskID == 5) + { + args.Cell.Value = "Updated Value"; + args.Cell.CellStyle = new PdfElementStyle() + { + FillBackgroundColor = "Orange", + Font = new PdfGridFont() + { + FontFamily = PdfFontFamily.TimesRoman, + FontSize = 6, + FontStyle = PdfFontStyle.Italic, + IsTrueType = false, + TextColor = "Red", + TextHighlightColor = "Green" + } + }; + args.Cell.CellStyle.Border = new Syncfusion.Blazor.Grids.PdfBorder() + { + Color = "Black", + DashStyle = Syncfusion.Blazor.Grids.PdfDashStyle.Dot, + Width = 0.1 + }; + } + } + public class TaskData + { + public int TaskID { get; set; } + public string TaskName { get; set; } + public DateTime StartDate { get; set; } + public DateTime? EndDate { get; set; } + public string Duration { get; set; } + public int Progress { get; set; } + public int? ParentID { get; set; } + public string Predecessor { get; set; } + } + + public static List GetTaskCollection() + { + List Tasks = new List() + { + new TaskData() { TaskID = 1, TaskName = "Project initiation", StartDate = new DateTime(2022, 04, 05), EndDate = new DateTime(2022, 04, 08), }, + new TaskData() { TaskID = 2, TaskName = "Identify Site location", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, ParentID = 1 }, + new TaskData() { TaskID = 3, TaskName = "Perform soil test", StartDate = new DateTime(2022, 04, 05), Duration = "4", Progress = 40, ParentID = 1, Predecessor = "2" }, + new TaskData() { TaskID = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, ParentID = 1 , Predecessor = "3" }, + new TaskData() { TaskID = 5, TaskName = "Project estimation", StartDate = new DateTime(2022, 04, 06), EndDate = new DateTime(2022, 04, 08), }, + new TaskData() { TaskID = 6, TaskName = "Develop floor plan for estimation", StartDate = new DateTime(2022, 04, 06), Duration = "3", Progress = 30, ParentID = 5 }, + new TaskData() { TaskID = 7, TaskName = "List materials", StartDate = new DateTime(2022, 04, 06), Duration = "3", Progress = 40, ParentID = 5 }, + new TaskData() { TaskID = 8, TaskName = "Estimation approval", StartDate = new DateTime(2022, 04, 06), Duration = "0", Progress = 30, ParentID = 5 } + }; + return Tasks; + } +} + +{% endhighlight %} +{% endtabs %} + +{% previewsample "https://blazorplayground.syncfusion.com/embed/VDLejELSpVTlPVsF?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} + +### Exporting with column header template + +The PDF export functionality allows to export header template that include `images` and `text` to an PDF document using [PdfColumnHeaderQueryCellInfo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttEvents-1.html#Syncfusion_Blazor_Gantt_GanttEvents_1_PdfColumnHeaderQueryCellInfo) event. + +In the following sample, header template with images and text are exported to PDF using [HeaderTemplate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttColumn.html#Syncfusion_Blazor_Gantt_GanttColumn_HeaderTemplate) properties in the `PdfColumnHeaderQueryCellInfo` event. + +> PDF Export supports base64 string to export the images. + +{% tabs %} +{% highlight razor tabtitle="Index.razor" %} + +@using Syncfusion.Blazor.Gantt +@using Syncfusion.Blazor.Grids +@using Syncfusion.PdfExport +@using System.Net.Http +@using System.IO +@inject HttpClient Http + + + + + + +
    + + @((context as GridColumn).HeaderText) +
    +
    +
    + + +
    + + @((context as GridColumn).HeaderText) +
    +
    +
    +
    + +
    +@code{ + private List TaskCollection { get; set; } + private SfGantt Gantt; + private List toolbarItem = new List() { + new Syncfusion.Blazor.Navigations.ToolbarItem() { + Text = "PDF Export", TooltipText = "PDF Export", Id = "PdfExport", PrefixIcon = "e-pdfexport" + } + }; + + public PdfImage image; + protected override async Task OnInitializedAsync() + { + TaskCollection = GetTaskCollection(); + var imageBytes = await Http.GetByteArrayAsync("https://cdn.syncfusion.com/content/images/landing-page/yes.png"); + using var imageStream = new MemoryStream(imageBytes); + image = PdfImage.FromStream(imageStream); + } + + + public async void ToolbarClickHandler(Syncfusion.Blazor.Navigations.ClickEventArgs args) + { + if (args.Item.Id == "PdfExport") + { + await Gantt.ExportToPdfAsync(); + } + } + + public void PdfHeaderQueryCellInfoHandler(Syncfusion.Blazor.Gantt.PdfHeaderQueryCellInfoEventArgs args) + { + args.Cell.CellStyle = new PdfElementStyle(){ Image = image }; + } + + public class TaskData + { + public int TaskID { get; set; } + public string TaskName { get; set; } + public DateTime StartDate { get; set; } + public DateTime? EndDate { get; set; } + public string Duration { get; set; } + public int Progress { get; set; } + public int? Parent_Id { get; set; } + + } + + public static List GetTaskCollection() + { + List Tasks = new List() + { + new TaskData() { TaskID = 1, TaskName = "Project initiation", StartDate = new DateTime(2022, 04, 05), EndDate = new DateTime(2022, 04, 21)}, + new TaskData() { TaskID = 2, TaskName = "Identify Site location", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, Parent_Id = 1}, + new TaskData() { TaskID = 3, TaskName = "Perform soil test", StartDate = new DateTime(2022, 04, 05), Duration = "4", Progress = 40, Parent_Id = 1}, + new TaskData() { TaskID = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, Parent_Id =1}, + new TaskData() { TaskID = 5, TaskName = "Project estimation", StartDate = new DateTime(2022, 04, 06), EndDate = new DateTime(2022, 04, 21)}, + new TaskData() { TaskID = 6, TaskName = "Develop floor plan for estimation", StartDate = new DateTime(2022, 04, 06), Duration = "3", Progress = 30, Parent_Id =5}, + new TaskData() { TaskID = 7, TaskName = "List materials", StartDate = new DateTime(2022, 04, 06), Duration = "3", Progress = 40, Parent_Id =5}, + new TaskData() { TaskID = 8, TaskName = "Estimation approval", StartDate = new DateTime(2022, 04, 06), Duration = "0", Progress = 30, Parent_Id =5} + + }; + return Tasks; + } +} + +{% endhighlight %} +{% endtabs %} + +{% previewsample "https://blazorplayground.syncfusion.com/embed/VtresXgMqlBQjXfl?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} + +### Exporting with task label template + +The PDF export functionality allows to export task label template that include `images` and `text` to an PDF document using [PdfQueryTaskbarInfo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttEvents-1.html#Syncfusion_Blazor_Gantt_GanttEvents_1_PdfQueryTaskbarInfo) event. + +In the following sample, task label template with images and text are exported to PDF using [LabelSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.PdfQueryTaskbarInfoEventArgs-1.html#Syncfusion_Blazor_Gantt_PdfQueryTaskbarInfoEventArgs_1_LabelSettings) properties in the [PdfQueryTaskbarInfoEventArgs](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.PdfQueryTaskbarInfoEventArgs-1.html) event. + +> PDF Export supports base64 string to export the images. + +{% tabs %} +{% highlight razor tabtitle="Index.razor" %} + +@using Syncfusion.Blazor.Gantt +@using Syncfusion.Blazor.Grids +@using Syncfusion.Blazor.Navigations +@using Syncfusion.PdfExport +@using System.Net.Http +@using System.IO + + + + + + + + + + + + + + + @{ + if ((context as TaskData).TaskID == 5) + { +
    + + @((context as TaskData).TaskName) +
    + } + } +
    + + @if ((context as TaskData).TaskID == 2) + { +
    + Updated Value +
    + } + else + { +
    + @((context as TaskData).TaskName) +
    + } +
    + + @if ((context as TaskData).TaskID == 3) + { +
    + -@((context as TaskData).Progress)% +
    + } + else + { +
    + @((context as TaskData).Progress)% +
    + } +
    +
    + +
    + +@code { + private List TaskCollection { get; set; } + private SfGantt Gantt; + private List toolbarItem = new List() + { + new Syncfusion.Blazor.Navigations.ToolbarItem() + { + Text = "PDF Export", + TooltipText = "PDF Export", + Id = "PdfExport", + PrefixIcon = "e-pdfexport" + } + }; + + public static PdfImage image; + + protected override async Task OnInitializedAsync() + { + this.TaskCollection = GetTaskCollection(); + + using var httpClient = new HttpClient(); + var imageBytes = await httpClient.GetByteArrayAsync("https://cdn.syncfusion.com/content/images/landing-page/yes.png"); + var imageStream = new MemoryStream(imageBytes); + image = PdfImage.FromStream(imageStream); + } + + public async void ToolbarClickHandler(Syncfusion.Blazor.Navigations.ClickEventArgs args) + { + if (args.Item.Id == "PdfExport") + { + await Gantt.ExportToPdfAsync(); + } + } + + public void PdfQueryTaskbarInfoHandler(PdfQueryTaskbarInfoEventArgs args) + { + if (args.Data.TaskID == 2) + { + args.LabelSettings.LeftLabelValue = "Updated Value"; + } + else + { + args.LabelSettings.LeftLabelValue = args.Data.TaskName; + } + + if (args.Data.TaskID == 5) + { + args.LabelSettings.RightLabel = new PdfElementStyle() { Image = image }; + } + else + { + args.LabelSettings.RightLabelValue = args.Data.TaskName; + } + + if (args.Data.TaskID == 3) + { + args.LabelSettings.TaskbarLabelValue = $"-{args.Data.Progress}%"; + } + else + { + args.LabelSettings.TaskbarLabelValue = $"{args.Data.Progress}%"; + } + } + + public class TaskData + { + public int TaskID { get; set; } + public string TaskName { get; set; } + public DateTime StartDate { get; set; } + public DateTime? EndDate { get; set; } + public string Duration { get; set; } + public int Progress { get; set; } + public int? ParentID { get; set; } + public string Predecessor { get; set; } + } + + public static List GetTaskCollection() + { + return new List() + { + new TaskData() { TaskID = 1, TaskName = "Project initiation", StartDate = new DateTime(2022, 04, 05), EndDate = new DateTime(2022, 04, 21) }, + new TaskData() { TaskID = 2, TaskName = "Identify Site location", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, ParentID = 1 }, + new TaskData() { TaskID = 3, TaskName = "Perform soil test", StartDate = new DateTime(2022, 04, 05), Duration = "4", Progress = 40, ParentID = 1, Predecessor = "2" }, + new TaskData() { TaskID = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, ParentID = 1 , Predecessor = "3" }, + new TaskData() { TaskID = 5, TaskName = "Project estimation", StartDate = new DateTime(2022, 04, 06), EndDate = new DateTime(2022, 04, 21) }, + new TaskData() { TaskID = 6, TaskName = "Develop floor plan for estimation", StartDate = new DateTime(2022, 04, 06), Duration = "3", Progress = 30, ParentID = 5 }, + new TaskData() { TaskID = 7, TaskName = "List materials", StartDate = new DateTime(2022, 04, 06), Duration = "3", Progress = 40, ParentID = 5 }, + new TaskData() { TaskID = 8, TaskName = "Estimation approval", StartDate = new DateTime(2022, 04, 06), Duration = "0", Progress = 30, ParentID = 5 } + }; + } +} + +{% endhighlight %} +{% endtabs %} + +{% previewsample "https://blazorplayground.syncfusion.com/embed/LtLyNOhefKeOHrhh?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} + +### Best practices for exporting PDF with templates + +- **Optimize PdfQueryCellInfo event usage**: Use the `PdfQueryCellInfo` event to customize individual cell appearances efficiently. Minimize complex logic to maintain performance. + +- **Utilize PdfColumnHeaderQueryCellInfo effectively**: Apply the `PdfColumnHeaderQueryCellInfo` event for custom header styles and content, focusing on clarity and readability. +- **Accessibility and clarity**: Keep header elements simple and accessible. Use straightforward text and icons to convey column purposes clearly. + +- **Efficient use of PdfQueryTaskbarInfo**: Utilize the `PdfQueryTaskbarInfo` event to apply label customizations based on task data conditions for effective communication of task statuses. +- **Consistent label styling**: Ensure consistent theme across labels with uniform font styles, colors, and sizes. + +### Image handling across events +- **Base64 and MemoryStream**: Convert images to Base64 strings, then use `MemoryStream` to convert them to `PdfImage`. This avoids reliance on potentially inaccessible web links. +- **Height and width management**: Scale images to fit designated areas to prevent default resizing that reflects cell or row heights. Maintain a professional PDF layout. +- **Compression and optimization**: Compress images prior to Base64 conversion to reduce file size while maintaining quality, optimizing the final PDF document size. + +### Troubleshooting PDF export + +1. **Customizations not appearing in PDF** + - **Check event handler**: Ensure that the `PdfQueryTaskbarInfo` event is correctly implemented and bound in your code. Double-check the event handler's logic to verify that conditions for customization are being met. + - **Data matching**: Ensure that the task data (like `TaskID`) used in the event matches the data in the task collection. Mismatches can prevent customizations from applying. + +2. **Images not displaying** + - **Image URL**: Verify that the image URLs are correct and accessible. Ensure that external images are hosted on a server with public access rights. + - **Supported formats**: Use compatible image formats such as JPG, PNG, or GIF. Unsupported formats may not render correctly in a PDF. + +3. **Performance issues** + - **Optimize resources**: Large images or complex styling may slow down the PDF export process. Consider optimizing image size and simplifying styles. + +4. **Color code customization** + - **Use valid color codes**: You can use HEX (`#RRGGBB`), or standard color names like `red`, `blue`, etc. Ensure all color codes or names used are supported and valid. + - **Consistency across styles**: Maintain consistent use of color codes in the styles to avoid unexpected color changes or conflicts during PDF rendering. \ No newline at end of file diff --git a/blazor/gantt-chart/header-and-footer.md b/blazor/gantt-chart/header-and-footer.md new file mode 100644 index 0000000000..e9280d2a39 --- /dev/null +++ b/blazor/gantt-chart/header-and-footer.md @@ -0,0 +1,206 @@ +--- +layout: post +title: Customizing PDF Headers and Footers in Blazor Gantt Chart Component | Syncfusion +description: Learn how to customize headers and footers in PDF exports of the Syncfusion Blazor Gantt Chart component with text, lines, page numbers, and images. +platform: Blazor +control: header and footer of PDF exporting +documentation: ug +--- + +# Header and footer of PDF exporting in Blazor Gantt Chart component + +Customizing headers and footers in PDF exports of the Blazor Gantt Chart component allows adding text, lines, page numbers, and images to enhance document professionalism for projects. Use [GanttPdfExportProperties](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttPdfExportProperties.html) with [Header](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PdfExportPropertiesBase.html#Syncfusion_Blazor_Grids_PdfExportPropertiesBase_Header) and [Footer](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PdfExportPropertiesBase.html#Syncfusion_Blazor_Grids_PdfExportPropertiesBase_Footer) to define content arrays, specifying `Type` (e.g., Text, Line), `Value`, `Position`, `Style`, or `Src` for images with `Base64` encoding. + +### Write a text in header and footer + +Customize text in headers or footers using the [Header](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PdfExportPropertiesBase.html#Syncfusion_Blazor_Grids_PdfExportPropertiesBase_Header) and [Footer](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PdfExportPropertiesBase.html#Syncfusion_Blazor_Grids_PdfExportPropertiesBase_Footer) properties in [GanttPdfExportProperties](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttPdfExportProperties.html). Set `Type` to **Text**, define `Value` for the text, `Position` for x/y coordinates, and `Style` for color or font size. + +{% tabs %} +{% highlight razor tabtitle="Index.razor" %} + +@using Syncfusion.Blazor.Gantt +@using Syncfusion.Blazor.Grids +@using Syncfusion.Blazor.Navigations + + + + + + + +@code { + private List TaskCollection { get; set; } + private SfGantt Gantt; + private List toolbarItem = new List() { new Syncfusion.Blazor.Navigations.ToolbarItem() { Text = "PDF Export", TooltipText = "PDF Export", Id = "PdfExport", PrefixIcon = "e-pdfexport" } }; + public List HeaderContent = new List + { + new PdfHeaderFooterContent() { Type = ContentType.Text, Value = "Gantt Chart PDF Export Header", Position = new PdfPosition() { X = 0, Y = 50 }, Style = new PdfContentStyle() { TextBrushColor = "#000000", FontSize = 13 } } + }; + public List FooterContent = new List + { + new PdfHeaderFooterContent() { Type = ContentType.Text, Value = "Gantt Chart PDF Export Footer", Position = new PdfPosition() { X = 0, Y = 350 }, Style = new PdfContentStyle() { TextBrushColor = "#000000", FontSize = 13 } } + }; + protected override void OnInitialized() + { + this.TaskCollection = GetTaskCollection(); + } + public async void ToolbarClickHandler(Syncfusion.Blazor.Navigations.ClickEventArgs args) + { + if (args.Item.Id == "PdfExport") + { + GanttPdfExportProperties exportProperties = new GanttPdfExportProperties(); + PdfHeader Header = new PdfHeader() + { + FromTop = 0, + Height = 100, + Contents = HeaderContent + }; + PdfFooter Footer = new PdfFooter() + { + FromBottom = 250, + Height = 100, + Contents = FooterContent + }; + exportProperties.Header = Header; + exportProperties.Footer = Footer; + await Gantt.ExportToPdfAsync(exportProperties); + } + } + + public class TaskData + { + public int TaskID { get; set; } + public string TaskName { get; set; } + public DateTime StartDate { get; set; } + public DateTime? EndDate { get; set; } + public string Duration { get; set; } + public int Progress { get; set; } + public int? ParentID { get; set; } + public string Predecessor { get; set; } + } + + public static List GetTaskCollection() + { + List Tasks = new List() + { + new TaskData() { TaskID = 1, TaskName = "Project initiation", StartDate = new DateTime(2022, 04, 05), EndDate = new DateTime(2022, 04, 08), }, + new TaskData() { TaskID = 2, TaskName = "Identify Site location", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, ParentID = 1 }, + new TaskData() { TaskID = 3, TaskName = "Perform soil test", StartDate = new DateTime(2022, 04, 05), Duration = "4", Progress = 40, ParentID = 1, Predecessor = "2" }, + new TaskData() { TaskID = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, ParentID = 1 , Predecessor = "3" }, + new TaskData() { TaskID = 5, TaskName = "Project estimation", StartDate = new DateTime(2022, 04, 06), EndDate = new DateTime(2022, 04, 08), }, + new TaskData() { TaskID = 6, TaskName = "Develop floor plan for estimation", StartDate = new DateTime(2022, 04, 06), Duration = "3", Progress = 30, ParentID = 5 }, + new TaskData() { TaskID = 7, TaskName = "List materials", StartDate = new DateTime(2022, 04, 06), Duration = "3", Progress = 40, ParentID = 5 }, + new TaskData() { TaskID = 8, TaskName = "Estimation approval", StartDate = new DateTime(2022, 04, 06), Duration = "0", Progress = 30, ParentID = 5 } + }; + return Tasks; + } +} + +{% endhighlight %} +{% endtabs %} + +{% previewsample "https://blazorplayground.syncfusion.com/embed/rDhyiDXArUzpgPqb?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} + +## Draw a line in header and footer + +Customize lines in headers or footers using the [Header](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PdfExportPropertiesBase.html#Syncfusion_Blazor_Grids_PdfExportPropertiesBase_Header) and [Footer](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PdfExportPropertiesBase.html#Syncfusion_Blazor_Grids_PdfExportPropertiesBase_Footer) properties in [GanttPdfExportProperties](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttPdfExportProperties.html). Set `type` to **Line**, define `points` for start/end coordinates, `pageNumberType` for position, and `style` for color, width, or dash style. + +Supported line styles are, + +* Dash +* Dot +* DashDot +* DashDotDot +* Solid + +{% tabs %} +{% highlight razor tabtitle="Index.razor" %} + +@using Syncfusion.Blazor.Gantt +@using Syncfusion.Blazor.Grids +@using Syncfusion.Blazor.Navigations + + + + + + + +@code { + private List TaskCollection { get; set; } + private SfGantt Gantt; + private List toolbarItem = new List() { new Syncfusion.Blazor.Navigations.ToolbarItem() { Text = "PDF Export", TooltipText = "PDF Export", Id = "PdfExport", PrefixIcon = "e-pdfexport" } }; + public List HeaderContent = new List + { + new PdfHeaderFooterContent() { Type = ContentType.Line, Points = new PdfPoints() { X1 = 0, Y1 = 4, X2 = 685, Y2 = 4 }, Style = new PdfContentStyle() { PenColor = "#000080", DashStyle = PdfDashStyle.Solid } } + }; + public List FooterContent = new List + { + new PdfHeaderFooterContent() { Type = ContentType.Line, Points = new PdfPoints() { X1 = 0, Y1 = 350, X2 = 685, Y2 = 350 }, Style = new PdfContentStyle() { PenColor = "#000080", DashStyle = PdfDashStyle.Solid } } + }; + protected override void OnInitialized() + { + this.TaskCollection = GetTaskCollection(); + } + public async void ToolbarClickHandler(Syncfusion.Blazor.Navigations.ClickEventArgs args) + { + if (args.Item.Id == "PdfExport") + { + GanttPdfExportProperties exportProperties = new GanttPdfExportProperties(); + PdfHeader Header = new PdfHeader() + { + FromTop = 0, + Height = 100, + Contents = HeaderContent + }; + PdfFooter Footer = new PdfFooter() + { + FromBottom = 250, + Height = 100, + Contents = FooterContent + }; + exportProperties.Header = Header; + exportProperties.Footer = Footer; + await Gantt.ExportToPdfAsync(exportProperties); + } + } + + public class TaskData + { + public int TaskID { get; set; } + public string TaskName { get; set; } + public DateTime StartDate { get; set; } + public DateTime? EndDate { get; set; } + public string Duration { get; set; } + public int Progress { get; set; } + public int? ParentID { get; set; } + public string Predecessor { get; set; } + } + + public static List GetTaskCollection() + { + List Tasks = new List() + { + new TaskData() { TaskID = 1, TaskName = "Project initiation", StartDate = new DateTime(2022, 04, 05), EndDate = new DateTime(2022, 04, 08), }, + new TaskData() { TaskID = 2, TaskName = "Identify Site location", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, ParentID = 1 }, + new TaskData() { TaskID = 3, TaskName = "Perform soil test", StartDate = new DateTime(2022, 04, 05), Duration = "4", Progress = 40, ParentID = 1, Predecessor = "2" }, + new TaskData() { TaskID = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, ParentID = 1 , Predecessor = "3" }, + new TaskData() { TaskID = 5, TaskName = "Project estimation", StartDate = new DateTime(2022, 04, 06), EndDate = new DateTime(2022, 04, 08), }, + new TaskData() { TaskID = 6, TaskName = "Develop floor plan for estimation", StartDate = new DateTime(2022, 04, 06), Duration = "3", Progress = 30, ParentID = 5 }, + new TaskData() { TaskID = 7, TaskName = "List materials", StartDate = new DateTime(2022, 04, 06), Duration = "3", Progress = 40, ParentID = 5 }, + new TaskData() { TaskID = 8, TaskName = "Estimation approval", StartDate = new DateTime(2022, 04, 06), Duration = "0", Progress = 30, ParentID = 5 } + }; + return Tasks; + } +} + +{% endhighlight %} +{% endtabs %} + +{% previewsample "https://blazorplayground.syncfusion.com/embed/BZBIWtXKVKPSwLAW?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} + +## See also +- [How to export to PDF?](https://blazor.syncfusion.com/documentation/gantt-chart/pdf-export) +- [How to manage task dependencies?](https://blazor.syncfusion.com/documentation/gantt-chart/task-dependencies) \ No newline at end of file diff --git a/blazor/gantt-chart/how-to/open-add-edit-dialog-dynamically.md b/blazor/gantt-chart/how-to/open-add-edit-dialog-dynamically.md index ba09a7a540..7564f693af 100644 --- a/blazor/gantt-chart/how-to/open-add-edit-dialog-dynamically.md +++ b/blazor/gantt-chart/how-to/open-add-edit-dialog-dynamically.md @@ -1,7 +1,7 @@ --- layout: post title: Open Add Edit Dialog in Blazor Gantt Chart Component | Syncfusion -description: Learn here all about Open Add Edit Dialog Dynamically in Syncfusion Blazor Gantt Chart component and more. +description: Learn how to open add and edit dialogs programmatically in the Syncfusion Blazor Gantt Chart component for efficient task creation and modification. platform: Blazor control: Gantt Chart documentation: ug @@ -11,12 +11,14 @@ documentation: ug Gantt Chart add and edit dialogs can be opened dynamically by using [OpenAddDialog](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.Action.html#Syncfusion_Blazor_Gantt_Action_OpenAddDialog) and [OpenEditDialog](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.Action.html#Syncfusion_Blazor_Gantt_Action_OpenEditDialog) methods. The following code example shows how to open add and edit dialog on separate button click actions. -```cshtml +{% tabs %} +{% highlight razor tabtitle="Index.razor" %} + @using Syncfusion.Blazor.Gantt - + @@ -39,31 +41,32 @@ Gantt Chart add and edit dialogs can be opened dynamically by using [OpenAddDial public class TaskData { - public int TaskId { get; set; } + public int TaskID { get; set; } public string TaskName { get; set; } public DateTime StartDate { get; set; } public DateTime EndDate { get; set; } public string Duration { get; set; } public int Progress { get; set; } - public List SubTasks { get; set; } + public int? ParentID { get; set; } } private static List GetTaskCollection() { List Tasks = new List() { - new TaskData() { TaskId = 1, TaskName = "Project initiation", StartDate = new DateTime(2022, 01, 04), EndDate = new DateTime(2022, 01, 23), }, - new TaskData() { TaskId = 2, TaskName = "Identify Site location", StartDate = new DateTime(2022, 01, 04), Duration = "0", Progress = 30, ParentId = 1 }, - new TaskData() { TaskId = 3, TaskName = "Perform soil test", StartDate = new DateTime(2022, 01, 04), Duration = "4", Progress = 40, ParentId = 1 }, - new TaskData() { TaskId = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 01, 04), Duration = "0", Progress = 30, ParentId = 1 }, - new TaskData() { TaskId = 5, TaskName = "Project estimation", StartDate = new DateTime(2022, 01, 04), EndDate = new DateTime(2022, 01, 23), }, - new TaskData() { TaskId = 6, TaskName = "Develop floor plan for estimation", StartDate = new DateTime(2022, 01, 04), Duration = "3", Progress = 30, ParentId = 5 }, - new TaskData() { TaskId = 7, TaskName = "List materials", StartDate = new DateTime(2022, 01, 04), Duration = "3", Progress = 40, ParentId = 5 }, - new TaskData() { TaskId = 8, TaskName = "Estimation approval", StartDate = new DateTime(2022, 01, 04), Duration = "0", Progress = 30, ParentId = 5 } + new TaskData() { TaskID = 1, TaskName = "Project initiation", StartDate = new DateTime(2022, 01, 04), EndDate = new DateTime(2022, 01, 07), }, + new TaskData() { TaskID = 2, TaskName = "Identify Site location", StartDate = new DateTime(2022, 01, 04), Duration = "0", Progress = 30, ParentID = 1 }, + new TaskData() { TaskID = 3, TaskName = "Perform soil test", StartDate = new DateTime(2022, 01, 04), Duration = "4", Progress = 40, ParentID = 1 }, + new TaskData() { TaskID = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 01, 04), Duration = "0", Progress = 30, ParentID = 1 }, + new TaskData() { TaskID = 5, TaskName = "Project estimation", StartDate = new DateTime(2022, 01, 04), EndDate = new DateTime(2022, 01, 06), }, + new TaskData() { TaskID = 6, TaskName = "Develop floor plan for estimation", StartDate = new DateTime(2022, 01, 04), Duration = "3", Progress = 30, ParentID = 5 }, + new TaskData() { TaskID = 7, TaskName = "List materials", StartDate = new DateTime(2022, 01, 04), Duration = "3", Progress = 40, ParentID = 5 }, + new TaskData() { TaskID = 8, TaskName = "Estimation approval", StartDate = new DateTime(2022, 01, 04), Duration = "0", Progress = 30, ParentID = 5 } }; return Tasks; } } -``` -## Demonstration image for dialogue -![Opening Edit Dialog in Blazor Gantt Chart](../images/blazor-gantt-chart-open-edit-dialog.png) \ No newline at end of file +{% endhighlight %} +{% endtabs %} + +{% previewsample "https://blazorplayground.syncfusion.com/embed/VXLeCtANAbQtiBAd?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} \ No newline at end of file diff --git a/blazor/gantt-chart/images/blazor-gantt-chart-open-edit-dialog.png b/blazor/gantt-chart/images/blazor-gantt-chart-open-edit-dialog.png deleted file mode 100644 index 9fafe04d1373b064941442ca1a041b007b560a3f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 87489 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 diff --git a/blazor/gantt-chart/pdf-export.md b/blazor/gantt-chart/pdf-export.md index 60a7f84a51..bef9c0089d 100644 --- a/blazor/gantt-chart/pdf-export.md +++ b/blazor/gantt-chart/pdf-export.md @@ -1,1225 +1,34 @@ --- layout: post title: PDF Export in Blazor Gantt Chart Component | Syncfusion -description: Checkout and learn here all about PDF Export in Syncfusion Blazor Gantt Chart component and much more. +description: Learn how to export Gantt to PDF in the Syncfusion Blazor Gantt Chart component, including indicators, blob objects, single-page, multiple Gantt, and theme options. platform: Blazor -control: Gantt Chart +control: PDF export documentation: ug --- # PDF Export in Blazor Gantt Chart Component -The PDF export feature enables exporting Gantt chart data to a PDF document. To perform the export, use the [ExportToPdfAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.SfGantt-1.html#Syncfusion_Blazor_Gantt_SfGantt_1_ExportToPdfAsync) method. Ensure that PDF export is enabled in the Gantt chart component by setting the [AllowPdfExport](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.SfGantt-1.html#Syncfusion_Blazor_Gantt_SfGantt_1_AllowPdfExport) property to true. +The PDF export feature enables exporting Blazor Gantt chart data to a PDF document. To perform the export, use the [ExportToPdfAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.SfGantt-1.html#Syncfusion_Blazor_Gantt_SfGantt_1_ExportToPdfAsync) method. Ensure that PDF export is enabled in the Gantt chart component by setting the [AllowPdfExport](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.SfGantt-1.html#Syncfusion_Blazor_Gantt_SfGantt_1_AllowPdfExport) property to true. +PDF export in the Blazor Gantt Chart component enables exporting project data to PDF documents for sharing or archiving, using the [ExportToPdfAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.SfGantt-1.html#Syncfusion_Blazor_Gantt_SfGantt_1_ExportToPdfAsync) method. with [AllowPdfExport](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.SfGantt-1.html#Syncfusion_Blazor_Gantt_SfGantt_1_AllowPdfExport) set to**true**. This feature supports exporting timelines, tasks, and dependencies, with options for indicators via `base64` images, blob objects for previews, single-page layouts, multiple Gantt instances in one file, and themes like Material or Bootstrap. Focus on auto-scheduled tasks for accurate export, as manual scheduling is not currently supported. -{% tabs %} -{% highlight razor tabtitle="Index.razor" %} - -@using Syncfusion.Blazor.Gantt -@using Syncfusion.Blazor.Navigations - - - - - - - -@code { - private List TaskCollection { get; set; } - private SfGantt Gantt; - private List toolbarItem = new List() { new Syncfusion.Blazor.Navigations.ToolbarItem() { Text = "PDF Export", TooltipText = "PDF Export", Id = "PdfExport", PrefixIcon = "e-pdfexport" } }; - protected override void OnInitialized() - { - this.TaskCollection = GetTaskCollection(); - } - public async void ToolbarClickHandler(Syncfusion.Blazor.Navigations.ClickEventArgs args) - { - if (args.Item.Id == "PdfExport") - { - await Gantt.ExportToPdfAsync(); - } - } - - public class TaskData - { - public int TaskID { get; set; } - public string TaskName { get; set; } - public DateTime StartDate { get; set; } - public DateTime? EndDate { get; set; } - public string Duration { get; set; } - public int Progress { get; set; } - public int? ParentID { get; set; } - public string Predecessor { get; set; } - } - - public static List GetTaskCollection() - { - List Tasks = new List() - { - new TaskData() { TaskID = 1, TaskName = "Project initiation", StartDate = new DateTime(2022, 04, 05), EndDate = new DateTime(2022, 04, 08), }, - new TaskData() { TaskID = 2, TaskName = "Identify Site location", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, ParentID = 1 }, - new TaskData() { TaskID = 3, TaskName = "Perform soil test", StartDate = new DateTime(2022, 04, 05), Duration = "4", Progress = 40, ParentID = 1, Predecessor = "2" }, - new TaskData() { TaskID = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, ParentID = 1 , Predecessor = "3" }, - new TaskData() { TaskID = 5, TaskName = "Project estimation", StartDate = new DateTime(2022, 04, 06), EndDate = new DateTime(2022, 04, 08), }, - new TaskData() { TaskID = 6, TaskName = "Develop floor plan for estimation", StartDate = new DateTime(2022, 04, 06), Duration = "3", Progress = 30, ParentID = 5 }, - new TaskData() { TaskID = 7, TaskName = "List materials", StartDate = new DateTime(2022, 04, 06), Duration = "3", Progress = 40, ParentID = 5 }, - new TaskData() { TaskID = 8, TaskName = "Estimation approval", StartDate = new DateTime(2022, 04, 06), Duration = "0", Progress = 30, ParentID = 5 } - }; - return Tasks; - } -} - -{% endhighlight %} -{% endtabs %} - -{% previewsample "https://blazorplayground.syncfusion.com/embed/rZLIsjZgrAtEMygE?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} - -## Customize the PDF export - -The PDF export functionality in the Syncfusion® Gantt Chart provides extensive customization options through the [GanttPdfExportProperties](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttPdfExportProperties.html) class. By configuring the properties within this class, you can control the layout, format, and content of the exported PDF. This customization ensures that the PDF accurately represents the Gantt chart's structure and allows for tailored exports. - -### Customize file name for exported document -The PDF export functionality in the Syncfusion® Gantt Chart allows you to customize the file name of the exported document. By configuring the [FileName](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PdfExportPropertiesBase.html#Syncfusion_Blazor_Grids_PdfExportPropertiesBase_FileName) property within the [GanttPdfExportProperties](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttPdfExportProperties.html) class, you can assign a specific name to the generated PDF. This is especially useful for keeping your exported documents organized and easily identifiable. - -In this example, the exported PDF will be saved as `ProjectSchedule.pdf`. - -{% tabs %} -{% highlight razor tabtitle="Index.razor" %} - -@using Syncfusion.Blazor.Gantt -@using Syncfusion.Blazor.Navigations - - - - - - - -@code { - private List TaskCollection { get; set; } - private SfGantt Gantt; - private List toolbarItem = new List() { new Syncfusion.Blazor.Navigations.ToolbarItem() { Text = "PDF Export", TooltipText = "PDF Export", Id = "PdfExport", PrefixIcon = "e-pdfexport" } }; - protected override void OnInitialized() - { - this.TaskCollection = GetTaskCollection(); - } - public async void ToolbarClickHandler(Syncfusion.Blazor.Navigations.ClickEventArgs args) - { - if (args.Item.Id == "PdfExport") - { - GanttPdfExportProperties exportProperties = new GanttPdfExportProperties(); - exportProperties.FileName = "ProjectSchedule.pdf"; - await Gantt.ExportToPdfAsync(exportProperties); - } - } - - public class TaskData - { - public int TaskID { get; set; } - public string TaskName { get; set; } - public DateTime StartDate { get; set; } - public DateTime? EndDate { get; set; } - public string Duration { get; set; } - public int Progress { get; set; } - public int? ParentID { get; set; } - public string Predecessor { get; set; } - } - - public static List GetTaskCollection() - { - List Tasks = new List() - { - new TaskData() { TaskID = 1, TaskName = "Project initiation", StartDate = new DateTime(2022, 04, 05), EndDate = new DateTime(2022, 04, 08), }, - new TaskData() { TaskID = 2, TaskName = "Identify Site location", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, ParentID = 1 }, - new TaskData() { TaskID = 3, TaskName = "Perform soil test", StartDate = new DateTime(2022, 04, 05), Duration = "4", Progress = 40, ParentID = 1, Predecessor = "2" }, - new TaskData() { TaskID = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, ParentID = 1 , Predecessor = "3" }, - new TaskData() { TaskID = 5, TaskName = "Project estimation", StartDate = new DateTime(2022, 04, 06), EndDate = new DateTime(2022, 04, 08), }, - new TaskData() { TaskID = 6, TaskName = "Develop floor plan for estimation", StartDate = new DateTime(2022, 04, 06), Duration = "3", Progress = 30, ParentID = 5 }, - new TaskData() { TaskID = 7, TaskName = "List materials", StartDate = new DateTime(2022, 04, 06), Duration = "3", Progress = 40, ParentID = 5 }, - new TaskData() { TaskID = 8, TaskName = "Estimation approval", StartDate = new DateTime(2022, 04, 06), Duration = "0", Progress = 30, ParentID = 5 } - }; - return Tasks; - } -} - -{% endhighlight %} -{% endtabs %} - -{% previewsample "https://blazorplayground.syncfusion.com/embed/BjBSCZNAhALZXWKG?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} - -### How to add a text in header/footer - -The PDF export functionality of the Gantt Chart allows you to add and style custom text in the header or footer of the exported PDF document. This customization can be achieved using the [Header](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PdfExportPropertiesBase.html#Syncfusion_Blazor_Grids_PdfExportPropertiesBase_Header) and [Footer](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PdfExportPropertiesBase.html#Syncfusion_Blazor_Grids_PdfExportPropertiesBase_Footer) properties of the [GanttPdfExportProperties](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttPdfExportProperties.html) class. By configuring these properties, you can include important information, such as titles, project names, or other relevant details, to enhance the exported document. - -The following sample code demonstrates how to add custom text and apply styling to the header and footer sections of the exported PDF document, - -{% tabs %} -{% highlight razor tabtitle="Index.razor" %} - -@using Syncfusion.Blazor.Gantt -@using Syncfusion.Blazor.Grids -@using Syncfusion.Blazor.Navigations - - - - - - - -@code { - private List TaskCollection { get; set; } - private SfGantt Gantt; - private List toolbarItem = new List() { new Syncfusion.Blazor.Navigations.ToolbarItem() { Text = "PDF Export", TooltipText = "PDF Export", Id = "PdfExport", PrefixIcon = "e-pdfexport" } }; - public List HeaderContent = new List - { - new PdfHeaderFooterContent() { Type = ContentType.Text, Value = "Gantt Chart PDF Export Header", Position = new PdfPosition() { X = 0, Y = 50 }, Style = new PdfContentStyle() { TextBrushColor = "#000000", FontSize = 13 } } - }; - public List FooterContent = new List - { - new PdfHeaderFooterContent() { Type = ContentType.Text, Value = "Gantt Chart PDF Export Footer", Position = new PdfPosition() { X = 0, Y = 350 }, Style = new PdfContentStyle() { TextBrushColor = "#000000", FontSize = 13 } } - }; - protected override void OnInitialized() - { - this.TaskCollection = GetTaskCollection(); - } - public async void ToolbarClickHandler(Syncfusion.Blazor.Navigations.ClickEventArgs args) - { - if (args.Item.Id == "PdfExport") - { - GanttPdfExportProperties exportProperties = new GanttPdfExportProperties(); - PdfHeader Header = new PdfHeader() - { - FromTop = 0, - Height = 100, - Contents = HeaderContent - }; - PdfFooter Footer = new PdfFooter() - { - FromBottom = 250, - Height = 100, - Contents = FooterContent - }; - exportProperties.Header = Header; - exportProperties.Footer = Footer; - await Gantt.ExportToPdfAsync(exportProperties); - } - } - - public class TaskData - { - public int TaskID { get; set; } - public string TaskName { get; set; } - public DateTime StartDate { get; set; } - public DateTime? EndDate { get; set; } - public string Duration { get; set; } - public int Progress { get; set; } - public int? ParentID { get; set; } - public string Predecessor { get; set; } - } - - public static List GetTaskCollection() - { - List Tasks = new List() - { - new TaskData() { TaskID = 1, TaskName = "Project initiation", StartDate = new DateTime(2022, 04, 05), EndDate = new DateTime(2022, 04, 08), }, - new TaskData() { TaskID = 2, TaskName = "Identify Site location", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, ParentID = 1 }, - new TaskData() { TaskID = 3, TaskName = "Perform soil test", StartDate = new DateTime(2022, 04, 05), Duration = "4", Progress = 40, ParentID = 1, Predecessor = "2" }, - new TaskData() { TaskID = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, ParentID = 1 , Predecessor = "3" }, - new TaskData() { TaskID = 5, TaskName = "Project estimation", StartDate = new DateTime(2022, 04, 06), EndDate = new DateTime(2022, 04, 08), }, - new TaskData() { TaskID = 6, TaskName = "Develop floor plan for estimation", StartDate = new DateTime(2022, 04, 06), Duration = "3", Progress = 30, ParentID = 5 }, - new TaskData() { TaskID = 7, TaskName = "List materials", StartDate = new DateTime(2022, 04, 06), Duration = "3", Progress = 40, ParentID = 5 }, - new TaskData() { TaskID = 8, TaskName = "Estimation approval", StartDate = new DateTime(2022, 04, 06), Duration = "0", Progress = 30, ParentID = 5 } - }; - return Tasks; - } -} - -{% endhighlight %} -{% endtabs %} - -{% previewsample "https://blazorplayground.syncfusion.com/embed/rDhyiDXArUzpgPqb?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} - -### How to draw a line in header/footer - -You can add lines to the Header or Footer area of the exported PDF document using the [Header](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PdfExportPropertiesBase.html#Syncfusion_Blazor_Grids_PdfExportPropertiesBase_Header) and [Footer](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PdfExportPropertiesBase.html#Syncfusion_Blazor_Grids_PdfExportPropertiesBase_Footer) properties in the [GanttPdfExportProperties](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttPdfExportProperties.html) class. - -Supported line styles are, - -* Dash -* Dot -* DashDot -* DashDotDot -* Solid - -The following sample code demonstrates adding line in the Header and Footer section of the exported document, - -{% tabs %} -{% highlight razor tabtitle="Index.razor" %} - -@using Syncfusion.Blazor.Gantt -@using Syncfusion.Blazor.Grids -@using Syncfusion.Blazor.Navigations - - - - - - - -@code { - private List TaskCollection { get; set; } - private SfGantt Gantt; - private List toolbarItem = new List() { new Syncfusion.Blazor.Navigations.ToolbarItem() { Text = "PDF Export", TooltipText = "PDF Export", Id = "PdfExport", PrefixIcon = "e-pdfexport" } }; - public List HeaderContent = new List - { - new PdfHeaderFooterContent() { Type = ContentType.Line, Points = new PdfPoints() { X1 = 0, Y1 = 4, X2 = 685, Y2 = 4 }, Style = new PdfContentStyle() { PenColor = "#000080", DashStyle = PdfDashStyle.Solid } } - }; - public List FooterContent = new List - { - new PdfHeaderFooterContent() { Type = ContentType.Line, Points = new PdfPoints() { X1 = 0, Y1 = 350, X2 = 685, Y2 = 350 }, Style = new PdfContentStyle() { PenColor = "#000080", DashStyle = PdfDashStyle.Solid } } - }; - protected override void OnInitialized() - { - this.TaskCollection = GetTaskCollection(); - } - public async void ToolbarClickHandler(Syncfusion.Blazor.Navigations.ClickEventArgs args) - { - if (args.Item.Id == "PdfExport") - { - GanttPdfExportProperties exportProperties = new GanttPdfExportProperties(); - PdfHeader Header = new PdfHeader() - { - FromTop = 0, - Height = 100, - Contents = HeaderContent - }; - PdfFooter Footer = new PdfFooter() - { - FromBottom = 250, - Height = 100, - Contents = FooterContent - }; - exportProperties.Header = Header; - exportProperties.Footer = Footer; - await Gantt.ExportToPdfAsync(exportProperties); - } - } - - public class TaskData - { - public int TaskID { get; set; } - public string TaskName { get; set; } - public DateTime StartDate { get; set; } - public DateTime? EndDate { get; set; } - public string Duration { get; set; } - public int Progress { get; set; } - public int? ParentID { get; set; } - public string Predecessor { get; set; } - } - - public static List GetTaskCollection() - { - List Tasks = new List() - { - new TaskData() { TaskID = 1, TaskName = "Project initiation", StartDate = new DateTime(2022, 04, 05), EndDate = new DateTime(2022, 04, 08), }, - new TaskData() { TaskID = 2, TaskName = "Identify Site location", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, ParentID = 1 }, - new TaskData() { TaskID = 3, TaskName = "Perform soil test", StartDate = new DateTime(2022, 04, 05), Duration = "4", Progress = 40, ParentID = 1, Predecessor = "2" }, - new TaskData() { TaskID = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, ParentID = 1 , Predecessor = "3" }, - new TaskData() { TaskID = 5, TaskName = "Project estimation", StartDate = new DateTime(2022, 04, 06), EndDate = new DateTime(2022, 04, 08), }, - new TaskData() { TaskID = 6, TaskName = "Develop floor plan for estimation", StartDate = new DateTime(2022, 04, 06), Duration = "3", Progress = 30, ParentID = 5 }, - new TaskData() { TaskID = 7, TaskName = "List materials", StartDate = new DateTime(2022, 04, 06), Duration = "3", Progress = 40, ParentID = 5 }, - new TaskData() { TaskID = 8, TaskName = "Estimation approval", StartDate = new DateTime(2022, 04, 06), Duration = "0", Progress = 30, ParentID = 5 } - }; - return Tasks; - } -} - -{% endhighlight %} -{% endtabs %} - -{% previewsample "https://blazorplayground.syncfusion.com/embed/BZBIWtXKVKPSwLAW?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} - -### How to change the page orientation - -The PDF export functionality allows you to customize the page orientation of the exported document. By setting the [PageOrientation](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PdfExportPropertiesBase.html#Syncfusion_Blazor_Grids_PdfExportPropertiesBase_PageOrientation) property in the [GanttPdfExportProperties](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttPdfExportProperties.html) class, you can choose between [Portrait](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PageOrientation.html#Syncfusion_Blazor_Grids_PageOrientation_Portrait) (default) and [Landscape](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PageOrientation.html#Syncfusion_Blazor_Grids_PageOrientation_Landscape) orientations based on your requirements. - -The following code snippet demonstrates how to set the page orientation to Landscape for the exported PDF document, - -{% tabs %} -{% highlight razor tabtitle="Index.razor" %} - -@using Syncfusion.Blazor.Gantt -@using Syncfusion.Blazor.Navigations - - - - - - - -@code { - private List TaskCollection { get; set; } - private SfGantt Gantt; - private List toolbarItem = new List() { new Syncfusion.Blazor.Navigations.ToolbarItem() { Text = "PDF Export", TooltipText = "PDF Export", Id = "PdfExport", PrefixIcon = "e-pdfexport" } }; - protected override void OnInitialized() - { - this.TaskCollection = GetTaskCollection(); - } - public async void ToolbarClickHandler(Syncfusion.Blazor.Navigations.ClickEventArgs args) - { - if (args.Item.Id == "PdfExport") - { - GanttPdfExportProperties exportProperties = new GanttPdfExportProperties(); - exportProperties.PageOrientation = Syncfusion.Blazor.Grids.PageOrientation.Landscape; - await Gantt.ExportToPdfAsync(exportProperties); - } - } - - public class TaskData - { - public int TaskID { get; set; } - public string TaskName { get; set; } - public DateTime StartDate { get; set; } - public DateTime? EndDate { get; set; } - public string Duration { get; set; } - public int Progress { get; set; } - public int? ParentID { get; set; } - public string Predecessor { get; set; } - } - - public static List GetTaskCollection() - { - List Tasks = new List() - { - new TaskData() { TaskID = 1, TaskName = "Project initiation", StartDate = new DateTime(2022, 04, 05), EndDate = new DateTime(2022, 04, 08), }, - new TaskData() { TaskID = 2, TaskName = "Identify Site location", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, ParentID = 1 }, - new TaskData() { TaskID = 3, TaskName = "Perform soil test", StartDate = new DateTime(2022, 04, 05), Duration = "4", Progress = 40, ParentID = 1, Predecessor = "2" }, - new TaskData() { TaskID = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, ParentID = 1 , Predecessor = "3" }, - new TaskData() { TaskID = 5, TaskName = "Project estimation", StartDate = new DateTime(2022, 04, 06), EndDate = new DateTime(2022, 04, 08), }, - new TaskData() { TaskID = 6, TaskName = "Develop floor plan for estimation", StartDate = new DateTime(2022, 04, 06), Duration = "3", Progress = 30, ParentID = 5 }, - new TaskData() { TaskID = 7, TaskName = "List materials", StartDate = new DateTime(2022, 04, 06), Duration = "3", Progress = 40, ParentID = 5 }, - new TaskData() { TaskID = 8, TaskName = "Estimation approval", StartDate = new DateTime(2022, 04, 06), Duration = "0", Progress = 30, ParentID = 5 } - }; - return Tasks; - } -} - -{% endhighlight %} -{% endtabs %} - -{% previewsample "https://blazorplayground.syncfusion.com/embed/BtVyMjNgBzDbCnDU?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} - -### How to change the page size - -The PDF export functionality allows you to customize the page size of the exported document to suit your needs. By setting the [PageSize](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PdfPageSize.html) property in the [GanttPdfExportProperties](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttPdfExportProperties.html) class, you can select from various standard page sizes. The default page size is Letter, but other options like A4, A3, and others. - -Supported page sizes are: -* Letter -* Note -* Legal -* A0 -* A1 -* A2 -* A3 -* A5 -* A6 -* A7 -* A8 -* A9 -* B0 -* B1 -* B2 -* B3 -* B4 -* B5 -* Archa -* Archb -* Archc -* Archd -* Arche -* Flsa -* HalfLetter -* Letter11x17 -* Ledger - -The following code demonstrates how to change the page size to A4 for the exported PDF document, - -{% tabs %} -{% highlight razor tabtitle="Index.razor" %} - -@using Syncfusion.Blazor.Gantt -@using Syncfusion.Blazor.Navigations - - - - - - - -@code { - private List TaskCollection { get; set; } - private SfGantt Gantt; - private List toolbarItem = new List() { new Syncfusion.Blazor.Navigations.ToolbarItem() { Text = "PDF Export", TooltipText = "PDF Export", Id = "PdfExport", PrefixIcon = "e-pdfexport" } }; - protected override void OnInitialized() - { - this.TaskCollection = GetTaskCollection(); - } - public async void ToolbarClickHandler(Syncfusion.Blazor.Navigations.ClickEventArgs args) - { - if (args.Item.Id == "PdfExport") - { - GanttPdfExportProperties exportProperties = new GanttPdfExportProperties(); - exportProperties.PageSize = Syncfusion.Blazor.Grids.PdfPageSize.A4; - await Gantt.ExportToPdfAsync(exportProperties); - } - } - - public class TaskData - { - public int TaskID { get; set; } - public string TaskName { get; set; } - public DateTime StartDate { get; set; } - public DateTime? EndDate { get; set; } - public string Duration { get; set; } - public int Progress { get; set; } - public int? ParentID { get; set; } - public string Predecessor { get; set; } - } - - public static List GetTaskCollection() - { - List Tasks = new List() - { - new TaskData() { TaskID = 1, TaskName = "Project initiation", StartDate = new DateTime(2022, 04, 05), EndDate = new DateTime(2022, 04, 08), }, - new TaskData() { TaskID = 2, TaskName = "Identify Site location", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, ParentID = 1 }, - new TaskData() { TaskID = 3, TaskName = "Perform soil test", StartDate = new DateTime(2022, 04, 05), Duration = "4", Progress = 40, ParentID = 1, Predecessor = "2" }, - new TaskData() { TaskID = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, ParentID = 1 , Predecessor = "3" }, - new TaskData() { TaskID = 5, TaskName = "Project estimation", StartDate = new DateTime(2022, 04, 06), EndDate = new DateTime(2022, 04, 08), }, - new TaskData() { TaskID = 6, TaskName = "Develop floor plan for estimation", StartDate = new DateTime(2022, 04, 06), Duration = "3", Progress = 30, ParentID = 5 }, - new TaskData() { TaskID = 7, TaskName = "List materials", StartDate = new DateTime(2022, 04, 06), Duration = "3", Progress = 40, ParentID = 5 }, - new TaskData() { TaskID = 8, TaskName = "Estimation approval", StartDate = new DateTime(2022, 04, 06), Duration = "0", Progress = 30, ParentID = 5 } - }; - return Tasks; - } -} - -{% endhighlight %} -{% endtabs %} - -{% previewsample "https://blazorplayground.syncfusion.com/embed/BNhyiZZKhzLBWLhu?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} - -### Export current view records - -The PDF export functionality allows you to export only the records that are currently in view on the Gantt chart to a PDF document. This can be achieved by enabling the [IsCurrentViewExport](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.PdfExportEventArgs.html#Syncfusion_Blazor_Gantt_PdfExportEventArgs_IsCurrentViewExport) boolean argument in the [PdfExporting](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttEvents-1.html#Syncfusion_Blazor_Gantt_GanttEvents_1_PdfExporting) event. - -N> Exporting current view records is only applicable when the virtualization feature is enabled, and it does not retain the state of collapsed rows during export. - -The following code demonstrates how to use the `PdfExporting` event to export current view data of the Gantt chart to a PDF document, - -{% tabs %} -{% highlight razor tabtitle="Index.razor" %} - -@using Syncfusion.Blazor.Gantt -@using Syncfusion.Blazor.Navigations - - - - - - - - - - - - - - - - - - - - -@code { - private SfGantt Gantt { get; set; } - private List toolbarItem = new List() { new Syncfusion.Blazor.Navigations.ToolbarItem() { Text = "PDF Export", TooltipText = "PDF Export", Id = "PdfExport", PrefixIcon = "e-pdfexport" } }; - private List TaskCollection { get; set; } - protected override void OnInitialized() - { - this.TaskCollection = VirtualData.GetTreeVirtualData(30); - } - public async void ToolbarClickHandler(Syncfusion.Blazor.Navigations.ClickEventArgs args) - { - if (args.Item.Id == "PdfExport") - { - await Gantt.ExportToPdfAsync(); - } - } - public void PdfExportingHandler(PdfExportEventArgs args) - { - args.IsCurrentViewExport = true; - } - public class VirtualData - { - public static List GetTreeVirtualData(int count) - { - List DataCollection = new List(); - Random rand = new Random(); - var x = 0; - int duration = 0; - DateTime startDate = new DateTime(2000, 1, 5); - DateTime endDate = new DateTime(2000, 1, 12); - string[] assignee = { "Allison Janney", "Bryan Fogel", "Richard King", "Alex Gibson" }; - string[] reporter = { "James Ivory", "Jordan Peele", "Guillermo del Toro", "Gary Oldman" }; - for (var i = 1; i <= count / 5; i++) - { - var name = rand.Next(0, 100); - TaskData Parent = new TaskData() - { - ID = ++x, - TaskName = "Task " + x, - StartDate = startDate, - EndDate = startDate.AddDays(26), - Duration = "20", - Assignee = "Mark Bridges", - Reporter = "Kobe Bryant", - Progress = 50, - }; - DataCollection.Add(Parent); - for (var j = 1; j <= 4; j++) - { - startDate = startDate.AddDays(j == 1 ? 0 : duration + 2); - duration = 5; - DataCollection.Add(new TaskData() - { - ID = ++x, - TaskName = "Task " + x, - StartDate = startDate, - EndDate = startDate.AddDays(5), - Duration = duration.ToString(), - Assignee = assignee[j - 1], - Reporter = reporter[j - 1], - Progress = 50, - ParentID = Parent.ID, - }); - } - } - return DataCollection; - } - } - public class TaskData - { - public int ID { get; set; } - public string TaskName { get; set; } - public DateTime? StartDate { get; set; } - public DateTime? EndDate { get; set; } - public string Duration { get; set; } - public string Assignee { get; set; } - public string Reporter { get; set; } - public int Progress { get; set; } - public int? ParentID { get; set; } - public string Predecessor { get; set; } - } -} - -{% endhighlight %} -{% endtabs %} - -{% previewsample "https://blazorplayground.syncfusion.com/embed/hjhyWjtqBfpHsisd?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} - -### How to export Gantt chart with custom timeline range - -The PDF export functionality allows you to export with custom timeline range of the Gantt chart to the PDF document. To specify the range, set the [RangeStart](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.PdfExportEventArgs.html#Syncfusion_Blazor_Gantt_PdfExportEventArgs_RangeStart) and [RangeEnd](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.PdfExportEventArgs.html#Syncfusion_Blazor_Gantt_PdfExportEventArgs_RangeEnd) arguments within the [PdfExporting](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttEvents-1.html#Syncfusion_Blazor_Gantt_GanttEvents_1_PdfExporting) event. The `RangeStart` argument defines the start date, and the `RangeEnd` argument defines the end date of the timeline range. - -The following code demonstrates how to use the `RangeStart` and `RangeEnd` arguments of the PdfExporting event to export a custom timeline range of the Gantt chart to a PDF document, - -{% tabs %} -{% highlight razor tabtitle="Index.razor" %} - -@using Syncfusion.Blazor.Gantt -@using Syncfusion.Blazor.Navigations - - - - - - - - - - - - - - - - - - - - -@code { - private SfGantt Gantt { get; set; } - private List toolbarItem = new List() { new Syncfusion.Blazor.Navigations.ToolbarItem() { Text = "PDF Export", TooltipText = "PDF Export", Id = "PdfExport", PrefixIcon = "e-pdfexport" } }; - private List TaskCollection { get; set; } - protected override void OnInitialized() - { - this.TaskCollection = VirtualData.GetTreeVirtualData(30); - } - public async void ToolbarClickHandler(Syncfusion.Blazor.Navigations.ClickEventArgs args) - { - if (args.Item.Id == "PdfExport") - { - await Gantt.ExportToPdfAsync(); - } - } - public void PdfExportingHandler(PdfExportEventArgs args) - { - args.RangeStart = new DateTime(2000, 1, 14); - args.RangeEnd = new DateTime(2000, 05, 12); - } - public class VirtualData - { - public static List GetTreeVirtualData(int count) - { - List DataCollection = new List(); - var x = 0; - int duration = 0; - DateTime startDate = new DateTime(2000, 1, 5); - DateTime endDate = new DateTime(2000, 1, 12); - string[] assignee = { "Allison Janney", "Bryan Fogel", "Richard King", "Alex Gibson" }; - string[] reporter = { "James Ivory", "Jordan Peele", "Guillermo del Toro", "Gary Oldman" }; - for (var i = 1; i <= count / 5; i++) - { - TaskData Parent = new TaskData() - { - ID = ++x, - TaskName = "Task " + x, - StartDate = startDate, - EndDate = startDate.AddDays(26), - Duration = "20", - Assignee = "Mark Bridges", - Reporter = "Kobe Bryant", - Progress = 50, - }; - DataCollection.Add(Parent); - for (var j = 1; j <= 4; j++) - { - startDate = startDate.AddDays(j == 1 ? 0 : duration + 2); - duration = 5; - DataCollection.Add(new TaskData() - { - ID = ++x, - TaskName = "Task " + x, - StartDate = startDate, - EndDate = startDate.AddDays(5), - Duration = duration.ToString(), - Assignee = assignee[j - 1], - Reporter = reporter[j - 1], - Progress = 50, - ParentID = Parent.ID, - }); - } - } - return DataCollection; - } - } - public class TaskData - { - public int ID { get; set; } - public string TaskName { get; set; } - public DateTime? StartDate { get; set; } - public DateTime? EndDate { get; set; } - public string Duration { get; set; } - public string Assignee { get; set; } - public string Reporter { get; set; } - public int Progress { get; set; } - public int? ParentID { get; set; } - public string Predecessor { get; set; } - } -} - -{% endhighlight %} -{% endtabs %} - -{% previewsample "https://blazorplayground.syncfusion.com/embed/rtByWjjUrpHrtFIB?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} - -### Export hidden columns - -The PDF export functionality allows you to include hidden columns from the Gantt chart in the exported PDF document. To achieve this, set the [IncludeHiddenColumn](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PdfExportPropertiesBase.html#Syncfusion_Blazor_Grids_PdfExportPropertiesBase_IncludeHiddenColumn) property to true within the [GanttPdfExportProperties](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttPdfExportProperties.html) class. This ensures that columns not visible in the Gantt chart are included in the PDF export. - -The following code demonstrates how to export hidden columns in the Gantt chart to a PDF document, - -{% tabs %} -{% highlight razor tabtitle="Index.razor" %} - -@using Syncfusion.Blazor.Gantt -@using Syncfusion.Blazor.Navigations - - - - - - - - - - - - - - - -@code { - private List TaskCollection { get; set; } - private SfGantt Gantt; - private List toolbarItem = new List() { new Syncfusion.Blazor.Navigations.ToolbarItem() { Text = "PDF Export", TooltipText = "PDF Export", Id = "PdfExport", PrefixIcon = "e-pdfexport" } }; - protected override void OnInitialized() - { - this.TaskCollection = GetTaskCollection(); - } - public async void ToolbarClickHandler(Syncfusion.Blazor.Navigations.ClickEventArgs args) - { - if (args.Item.Id == "PdfExport") - { - GanttPdfExportProperties exportProperties = new GanttPdfExportProperties(); - exportProperties.IncludeHiddenColumn = true; - await Gantt.ExportToPdfAsync(exportProperties); - } - } - - public class TaskData - { - public int TaskID { get; set; } - public string TaskName { get; set; } - public DateTime StartDate { get; set; } - public DateTime? EndDate { get; set; } - public string Duration { get; set; } - public int Progress { get; set; } - public int? ParentID { get; set; } - public string Predecessor { get; set; } - } - - public static List GetTaskCollection() - { - List Tasks = new List() - { - new TaskData() { TaskID = 1, TaskName = "Project initiation", StartDate = new DateTime(2022, 04, 05), EndDate = new DateTime(2022, 04, 08), }, - new TaskData() { TaskID = 2, TaskName = "Identify Site location", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, ParentID = 1 }, - new TaskData() { TaskID = 3, TaskName = "Perform soil test", StartDate = new DateTime(2022, 04, 05), Duration = "4", Progress = 40, ParentID = 1, Predecessor = "2" }, - new TaskData() { TaskID = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, ParentID = 1 , Predecessor = "3" }, - new TaskData() { TaskID = 5, TaskName = "Project estimation", StartDate = new DateTime(2022, 04, 06), EndDate = new DateTime(2022, 04, 08), }, - new TaskData() { TaskID = 6, TaskName = "Develop floor plan for estimation", StartDate = new DateTime(2022, 04, 06), Duration = "3", Progress = 30, ParentID = 5 }, - new TaskData() { TaskID = 7, TaskName = "List materials", StartDate = new DateTime(2022, 04, 06), Duration = "3", Progress = 40, ParentID = 5 }, - new TaskData() { TaskID = 8, TaskName = "Estimation approval", StartDate = new DateTime(2022, 04, 06), Duration = "0", Progress = 30, ParentID = 5 } - }; - return Tasks; - } -} - -{% endhighlight %} -{% endtabs %} - -{% previewsample "https://blazorplayground.syncfusion.com/embed/VtreCNXgVTcKHkcY?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} - -### Customize column width in exported PDF document - -The PDF export functionality allows you to customize the width of columns in the exported PDF document. This can be achieved using the [Width](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttColumn.html#Syncfusion_Blazor_Gantt_GanttColumn_Width) property in the [GanttColumn](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttColumn.html) class. By specifying the width for each column, you can tailor the appearance of the exported PDF to your requirements. - -The following code snippet demonstrates how to customize column widths in the exported PDF document using the [Columns](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttPdfExportProperties.html#Syncfusion_Blazor_Gantt_GanttPdfExportProperties_Columns) property of the [GanttPdfExportProperties](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttPdfExportProperties.html) class, - -{% tabs %} -{% highlight razor tabtitle="Index.razor" %} - -@using Syncfusion.Blazor.Gantt -@using Syncfusion.Blazor.Grids -@using Syncfusion.Blazor.Navigations -@using Syncfusion.PdfExport - - - - - - - - - - - - - - - -@code { - private List TaskCollection { get; set; } - private SfGantt Gantt; - private List toolbarItem = new List() { new Syncfusion.Blazor.Navigations.ToolbarItem() { Text = "PDF Export", TooltipText = "PDF Export", Id = "PdfExport", PrefixIcon = "e-pdfexport" } }; - protected override void OnInitialized() - { - this.TaskCollection = GetTaskCollection(); - } - public async void ToolbarClickHandler(Syncfusion.Blazor.Navigations.ClickEventArgs args) - { - if (args.Item.Id == "PdfExport") - { - GanttPdfExportProperties exportProperties = new GanttPdfExportProperties(); - exportProperties.Columns = new List() - { - new GanttColumn(){ Field = "TaskID", HeaderText = "Task Id", Width = "200" }, - new GanttColumn(){ Field = "TaskName", HeaderText = "Task Name", Width = "250"}, - new GanttColumn(){ Field = "StartDate", HeaderText = "Start Date", Width = "150"}, - }; - await Gantt.ExportToPdfAsync(exportProperties); - } - } - - public class TaskData - { - public int TaskID { get; set; } - public string TaskName { get; set; } - public DateTime StartDate { get; set; } - public DateTime? EndDate { get; set; } - public string Duration { get; set; } - public int Progress { get; set; } - public int? ParentID { get; set; } - public string Predecessor { get; set; } - } - - public static List GetTaskCollection() - { - List Tasks = new List() - { - new TaskData() { TaskID = 1, TaskName = "Project initiation", StartDate = new DateTime(2022, 04, 05), EndDate = new DateTime(2022, 04, 08), }, - new TaskData() { TaskID = 2, TaskName = "Identify Site location", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, ParentID = 1 }, - new TaskData() { TaskID = 3, TaskName = "Perform soil test", StartDate = new DateTime(2022, 04, 05), Duration = "4", Progress = 40, ParentID = 1, Predecessor = "2" }, - new TaskData() { TaskID = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, ParentID = 1 , Predecessor = "3" }, - new TaskData() { TaskID = 5, TaskName = "Project estimation", StartDate = new DateTime(2022, 04, 06), EndDate = new DateTime(2022, 04, 08), }, - new TaskData() { TaskID = 6, TaskName = "Develop floor plan for estimation", StartDate = new DateTime(2022, 04, 06), Duration = "3", Progress = 30, ParentID = 5 }, - new TaskData() { TaskID = 7, TaskName = "List materials", StartDate = new DateTime(2022, 04, 06), Duration = "3", Progress = 40, ParentID = 5 }, - new TaskData() { TaskID = 8, TaskName = "Estimation approval", StartDate = new DateTime(2022, 04, 06), Duration = "0", Progress = 30, ParentID = 5 } - }; - return Tasks; - } -} - -{% endhighlight %} -{% endtabs %} - -{% previewsample "https://blazorplayground.syncfusion.com/embed/LtBostXgrIjeKZvL?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} - -## How to export Gantt chart with specific columns - -### Through property - -The PDF export functionality enables you to export only specific columns from the Gantt chart, rather than exporting all columns by default. To achieve this, set the [Columns](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttPdfExportProperties.html#Syncfusion_Blazor_Gantt_GanttPdfExportProperties_Columns) property of the [GanttPdfExportProperties](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttPdfExportProperties.html) class. This allows you to tailor the exported PDF to include only the columns that are relevant to your needs. - -The following code snippet demonstrates how to configure the `Columns` property to export specific columns from the Gantt chart to a PDF document: - -{% tabs %} -{% highlight razor tabtitle="Index.razor" %} - -@using Syncfusion.Blazor.Gantt -@using Syncfusion.Blazor.Grids -@using Syncfusion.Blazor.Navigations -@using Syncfusion.PdfExport - - - - - - - - - - - - - - - -@code { - private List TaskCollection { get; set; } - private SfGantt Gantt; - private List toolbarItem = new List() { new Syncfusion.Blazor.Navigations.ToolbarItem() { Text = "PDF Export", TooltipText = "PDF Export", Id = "PdfExport", PrefixIcon = "e-pdfexport" } }; - protected override void OnInitialized() - { - this.TaskCollection = GetTaskCollection(); - } - public async void ToolbarClickHandler(Syncfusion.Blazor.Navigations.ClickEventArgs args) - { - if (args.Item.Id == "PdfExport") - { - GanttPdfExportProperties exportProperties = new GanttPdfExportProperties(); - exportProperties.Columns = new List() - { - new GanttColumn(){ Field = "TaskID", HeaderText = "Task Id", Width = "100" }, - new GanttColumn(){ Field = "TaskName", HeaderText = "Task Name", Width = "200"}, - new GanttColumn(){ Field = "StartDate", HeaderText = "Start Date", Width = "150"}, - }; - await Gantt.ExportToPdfAsync(exportProperties); - } - } - - public class TaskData - { - public int TaskID { get; set; } - public string TaskName { get; set; } - public DateTime StartDate { get; set; } - public DateTime? EndDate { get; set; } - public string Duration { get; set; } - public int Progress { get; set; } - public int? ParentID { get; set; } - public string Predecessor { get; set; } - } - - public static List GetTaskCollection() - { - List Tasks = new List() - { - new TaskData() { TaskID = 1, TaskName = "Project initiation", StartDate = new DateTime(2022, 04, 05), EndDate = new DateTime(2022, 04, 08), }, - new TaskData() { TaskID = 2, TaskName = "Identify Site location", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, ParentID = 1 }, - new TaskData() { TaskID = 3, TaskName = "Perform soil test", StartDate = new DateTime(2022, 04, 05), Duration = "4", Progress = 40, ParentID = 1, Predecessor = "2" }, - new TaskData() { TaskID = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, ParentID = 1 , Predecessor = "3" }, - new TaskData() { TaskID = 5, TaskName = "Project estimation", StartDate = new DateTime(2022, 04, 06), EndDate = new DateTime(2022, 04, 08), }, - new TaskData() { TaskID = 6, TaskName = "Develop floor plan for estimation", StartDate = new DateTime(2022, 04, 06), Duration = "3", Progress = 30, ParentID = 5 }, - new TaskData() { TaskID = 7, TaskName = "List materials", StartDate = new DateTime(2022, 04, 06), Duration = "3", Progress = 40, ParentID = 5 }, - new TaskData() { TaskID = 8, TaskName = "Estimation approval", StartDate = new DateTime(2022, 04, 06), Duration = "0", Progress = 30, ParentID = 5 } - }; - return Tasks; - } -} - -{% endhighlight %} -{% endtabs %} - -{% previewsample "https://blazorplayground.syncfusion.com/embed/hXhIiXZAVoCQueAU?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} - -### Through event - -The PDF export functionality allows you to export only specific columns from the Gantt chart, rather than exporting all columns by default. This can be achieved by using the `Columns` argument in the [PdfExporting](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttEvents-1.html#Syncfusion_Blazor_Gantt_GanttEvents_1_PdfExporting) event. +## Export basic Gantt data -The following code demonstrates how to use the `PdfExporting` event to export specific columns of the Gantt chart to a PDF document, +Export Gantt data to PDF by setting [AllowPdfExport](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.SfGantt-1.html#Syncfusion_Blazor_Gantt_SfGantt_1_AllowPdfExport) to**true** and calling [ExportToPdfAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.SfGantt-1.html#Syncfusion_Blazor_Gantt_SfGantt_1_ExportToPdfAsync), which generates a document with the chart and tree-grid data. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @using Syncfusion.Blazor.Gantt -@using Syncfusion.Blazor.Grids @using Syncfusion.Blazor.Navigations -@using Syncfusion.PdfExport - - - - - - - - - - - -@code { - private List TaskCollection { get; set; } - private SfGantt Gantt; - private List toolbarItem = new List() { new Syncfusion.Blazor.Navigations.ToolbarItem() { Text = "PDF Export", TooltipText = "PDF Export", Id = "PdfExport", PrefixIcon = "e-pdfexport" } }; - protected override void OnInitialized() - { - this.TaskCollection = GetTaskCollection(); - } - public async void ToolbarClickHandler(Syncfusion.Blazor.Navigations.ClickEventArgs args) - { - if (args.Item.Id == "PdfExport") - { - await Gantt.ExportToPdfAsync(); - } - } - public void PdfExportingHandler(PdfExportEventArgs args) - { - args.Columns = new List() - { - new GanttColumn(){ Field = "TaskID", HeaderText = "Task Id", Width = "100" }, - new GanttColumn(){ Field = "TaskName", HeaderText = "Task Name", Width = "200"}, - new GanttColumn(){ Field = "StartDate", HeaderText = "Start Date", Width = "150"}, - }; - } - - public class TaskData - { - public int TaskID { get; set; } - public string TaskName { get; set; } - public DateTime StartDate { get; set; } - public DateTime? EndDate { get; set; } - public string Duration { get; set; } - public int Progress { get; set; } - public int? ParentID { get; set; } - public string Predecessor { get; set; } - } - - public static List GetTaskCollection() - { - List Tasks = new List() - { - new TaskData() { TaskID = 1, TaskName = "Project initiation", StartDate = new DateTime(2022, 04, 05), EndDate = new DateTime(2022, 04, 08), }, - new TaskData() { TaskID = 2, TaskName = "Identify Site location", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, ParentID = 1 }, - new TaskData() { TaskID = 3, TaskName = "Perform soil test", StartDate = new DateTime(2022, 04, 05), Duration = "4", Progress = 40, ParentID = 1, Predecessor = "2" }, - new TaskData() { TaskID = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, ParentID = 1 , Predecessor = "3" }, - new TaskData() { TaskID = 5, TaskName = "Project estimation", StartDate = new DateTime(2022, 04, 06), EndDate = new DateTime(2022, 04, 08), }, - new TaskData() { TaskID = 6, TaskName = "Develop floor plan for estimation", StartDate = new DateTime(2022, 04, 06), Duration = "3", Progress = 30, ParentID = 5 }, - new TaskData() { TaskID = 7, TaskName = "List materials", StartDate = new DateTime(2022, 04, 06), Duration = "3", Progress = 40, ParentID = 5 }, - new TaskData() { TaskID = 8, TaskName = "Estimation approval", StartDate = new DateTime(2022, 04, 06), Duration = "0", Progress = 30, ParentID = 5 } - }; - return Tasks; - } -} - -{% endhighlight %} -{% endtabs %} - -{% previewsample "https://blazorplayground.syncfusion.com/embed/hXVoCjXAVSBmCcUQ?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} - -## Customizing taskbar appearance - -### Through property - -The PDF export functionality allows you to customize the appearance of taskbars in the exported PDF document using the [TaskbarColor](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.PdfGanttStyle.html#Syncfusion_Blazor_Gantt_PdfGanttStyle_TaskbarColor) property in the [GanttPdfExportProperties](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttPdfExportProperties.html) class. This property enables you to set colors for various types of taskbars, including: - -* Parent Taskbars -* Child Taskbars -* Milestones -* Critical Paths -* Manual Taskbars -* Baselines - -By configuring the TaskbarColor property, you can format these taskbars to match your desired color scheme. The following code snippet demonstrates how to use the `TaskbarColor` property to customize the colors of different taskbars in the exported PDF document, - -{% tabs %} -{% highlight razor tabtitle="Index.razor" %} - -@using Syncfusion.Blazor.Gantt -@using Syncfusion.Blazor.Grids -@using Syncfusion.Blazor.Navigations -@using Syncfusion.PdfExport - - - - - - - - - - - -@code { - private List TaskCollection { get; set; } - private SfGantt Gantt; - private List toolbarItem = new List() { new Syncfusion.Blazor.Navigations.ToolbarItem() { Text = "PDF Export", TooltipText = "PDF Export", Id = "PdfExport", PrefixIcon = "e-pdfexport" } }; - protected override void OnInitialized() - { - this.TaskCollection = GetTaskCollection(); - } - public async void ToolbarClickHandler(Syncfusion.Blazor.Navigations.ClickEventArgs args) - { - if (args.Item.Id == "PdfExport") - { - GanttPdfExportProperties pdfExport = new GanttPdfExportProperties(); - pdfExport.Style = new PdfGanttStyle(); - pdfExport.Style.TaskbarColor = new PdfTaskbarColor(); - pdfExport.Style.TaskbarColor.ParentTaskbarColor = new PdfColor(220, 118, 51); - pdfExport.Style.TaskbarColor.ParentProgressColor = new PdfColor(203, 67, 53); - pdfExport.Style.TaskbarColor.ChildProgressColor = new PdfColor(35, 155, 86); - pdfExport.Style.TaskbarColor.ChildTaskbarColor = new PdfColor(130, 224, 170); - pdfExport.Style.TaskbarColor.CriticalPathTaskbarColor = new PdfColor(173, 121, 64); - pdfExport.Style.TaskbarColor.CriticalPathProgressColor = new PdfColor(145, 76, 0); - pdfExport.Style.TaskbarColor.BaselineColor = new PdfColor(179, 38, 30); - pdfExport.Style.TaskbarColor.MilestoneColor = new PdfColor(141, 124, 187); - await Gantt.ExportToPdfAsync(pdfExport); - } - } - - public class TaskData - { - public int TaskID { get; set; } - public string TaskName { get; set; } - public DateTime? BaselineStartDate { get; set; } - public DateTime? BaselineEndDate { get; set; } - public DateTime StartDate { get; set; } - public DateTime? EndDate { get; set; } - public string Duration { get; set; } - public int Progress { get; set; } - public int? ParentID { get; set; } - } - - public static List GetTaskCollection() - { - List Tasks = new List() - { - new TaskData() { TaskID = 1, TaskName = "Project initiation", BaselineStartDate = new DateTime(2021, 04, 02), BaselineEndDate = new DateTime(2021, 04, 04), StartDate = new DateTime(2021, 04, 02), EndDate = new DateTime(2021, 04, 08) }, - new TaskData() { TaskID = 2, TaskName = "Identify site location", StartDate = new DateTime(2021, 04, 02), EndDate = new DateTime(2021, 04, 02), Duration = "0", BaselineStartDate = new DateTime(2021, 04, 02), BaselineEndDate = new DateTime(2021, 04, 02), Progress = 30, ParentID = 1 }, - new TaskData() { TaskID = 3, TaskName = "Perform soil test", StartDate = new DateTime(2021, 04, 02), Duration = "5", Progress = 40, BaselineStartDate = new DateTime(2021, 04, 02), BaselineEndDate = new DateTime(2021, 04, 06), ParentID = 1 }, - new TaskData() { TaskID = 4, TaskName = "Soil test approval", StartDate = new DateTime(2021, 04, 08), Duration = "0", EndDate = new DateTime(2021, 04, 08), BaselineStartDate = new DateTime(2021, 04, 08), BaselineEndDate = new DateTime(2021, 04, 08), Progress = 30, ParentID = 1 }, - new TaskData() { TaskID = 5, TaskName = "Project initiation", StartDate = new DateTime(2021, 04, 02), EndDate = new DateTime(2021, 04, 08) }, - new TaskData() { TaskID = 6, TaskName = "Identify site location", StartDate = new DateTime(2021, 04, 02), Duration = "2", Progress = 30, ParentID = 5, BaselineStartDate = new DateTime(2021, 04, 02), BaselineEndDate = new DateTime(2021, 04, 02) }, - new TaskData() { TaskID = 7, TaskName = "Perform soil test", StartDate = new DateTime(2021, 04, 02), Duration = "4", Progress = 40, ParentID = 5, BaselineStartDate = new DateTime(2021, 04, 02), BaselineEndDate = new DateTime(2021, 04, 03) }, - new TaskData() { TaskID = 8, TaskName = "Soil test approval", StartDate = new DateTime(2021, 04, 02), Duration = "5", Progress = 30, ParentID = 5, BaselineStartDate = new DateTime(2021, 04, 02), BaselineEndDate = new DateTime(2021, 04, 04) } - }; - return Tasks; - } -} - -{% endhighlight %} -{% endtabs %} - -{% previewsample "https://blazorplayground.syncfusion.com/embed/BXVyijDKBofOIgSk?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} - -### Through event - -The PDF export functionality allows you to customize the appearance of taskbars in the exported PDF document using the [PdfQueryTaskbarInfo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttEvents-1.html#Syncfusion_Blazor_Gantt_GanttEvents_1_PdfQueryTaskbarInfo) event. This event provides the flexibility to customize and format the appearance of taskbars, including parent taskbars, individual taskbars, and milestone templates. - -The following code snippet demonstrates how to use the `PdfQueryTaskbarInfo` event to customize the appearance of taskbars in the exported PDF document, - -{% tabs %} -{% highlight razor tabtitle="Index.razor" %} - -@using Syncfusion.Blazor.Gantt -@using Syncfusion.Blazor.Grids -@using Syncfusion.Blazor.Navigations -@using Syncfusion.PdfExport - - - - - - - - - - - - - - - @code { private List TaskCollection { get; set; } private SfGantt Gantt; @@ -1235,21 +44,7 @@ The following code snippet demonstrates how to use the `PdfQueryTaskbarInfo` eve await Gantt.ExportToPdfAsync(); } } - public void PdfQueryTaskbarInfoHandler(PdfQueryTaskbarInfoEventArgs args) - { - if (args.Data.TaskID == 3) - { - args.TaskbarStyle.Color = new PdfTaskbarColor(); - args.TaskbarStyle.Color.ChildProgressColor = new Syncfusion.PdfExport.PdfColor(103, 80, 164); - args.TaskbarStyle.Color.ChildTaskbarColor = new Syncfusion.PdfExport.PdfColor(141, 124, 187); - } - if (args.Data.TaskID == 4) - { - args.TaskbarStyle.Color = new PdfTaskbarColor(); - args.TaskbarStyle.Color.MilestoneColor = new Syncfusion.PdfExport.PdfColor(103, 80, 164); - } - - } + public class TaskData { public int TaskID { get; set; } @@ -1282,15 +77,20 @@ The following code snippet demonstrates how to use the `PdfQueryTaskbarInfo` eve {% endhighlight %} {% endtabs %} -{% previewsample "https://blazorplayground.syncfusion.com/embed/VDheittqhyxNSXIj?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} +{% previewsample "https://blazorplayground.syncfusion.com/embed/rZLIsjZgrAtEMygE?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} ## Events triggered during exporting -When exporting the Gantt chart to a PDF document, a series of events are triggered in a specific order, allowing for advanced customization of the export process. Understanding this flow is essential to control and modify the exported content effectively. Below is the flow of events that occur during PDF export in the Gantt chart: +When exporting the Gantt chart to a PDF document, a series of events are triggered in a specific order, allowing for advanced customization of the export process. Understanding this flow is essential for effectively controlling and modifying the exported content. Below is the sequence of events that occur during PDF export in the Gantt chart: * [PdfExporting](https://blazor.syncfusion.com/documentation/gantt-chart/events) + * [PdfQueryTimelineCellInfo](https://blazor.syncfusion.com/documentation/gantt-chart/events) + * [PdfColumnHeaderQueryCellInfo](https://blazor.syncfusion.com/documentation/gantt-chart/events) + * [PdfQueryCellInfo](https://blazor.syncfusion.com/documentation/gantt-chart/events) + * [PdfQueryTaskbarInfo](https://blazor.syncfusion.com/documentation/gantt-chart/events) + * [PdfExported](https://blazor.syncfusion.com/documentation/gantt-chart/events) diff --git a/blazor/gantt-chart/template-pdf-export.md b/blazor/gantt-chart/template-pdf-export.md deleted file mode 100644 index 8b797a5bd7..0000000000 --- a/blazor/gantt-chart/template-pdf-export.md +++ /dev/null @@ -1,425 +0,0 @@ ---- -layout: post -title: PDF Export with templates in Blazor Gantt Chart Component | Syncfusion -description: Checkout and learn here all about PDF Exporting with templates in Syncfusion Blazor Gantt Chart component and much more. -platform: Blazor -control: Gantt Chart -documentation: ug ---- - -# Exporting PDF with templates - -The Gantt chart export functionality allows you to export both column and header templates to a PDF document. These templates can include various customizations such as images, formatted text, and custom cell styles within the header and columns. - -## Exporting with column template - -The PDF export functionality allows for advanced customization of Gantt chart columns, including the inclusion of images, background colors, and custom text. This can be achieved using the [PdfQueryCellInfo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttEvents-1.html#Syncfusion_Blazor_Gantt_GanttEvents_1_PdfQueryCellInfo) event. By handling this event, you can define how individual cells in the Gantt chart are rendered in the exported PDF. - -The following code snippet demonstrates how to use the `PdfQueryCellInfo` event to export Gantt columns with custom text and different cell background colors, - -{% tabs %} -{% highlight razor tabtitle="Index.razor" %} - -@using Syncfusion.Blazor.Gantt -@using Syncfusion.Blazor.Grids -@using Syncfusion.Blazor.Navigations -@using Syncfusion.PdfExport - - - - - - - - - - - - - - - -@code { - private List TaskCollection { get; set; } - private SfGantt Gantt; - private List toolbarItem = new List() { new Syncfusion.Blazor.Navigations.ToolbarItem() { Text = "PDF Export", TooltipText = "PDF Export", Id = "PdfExport", PrefixIcon = "e-pdfexport" } }; - protected override void OnInitialized() - { - this.TaskCollection = GetTaskCollection(); - } - public async void ToolbarClickHandler(Syncfusion.Blazor.Navigations.ClickEventArgs args) - { - if (args.Item.Id == "PdfExport") - { - await Gantt.ExportToPdfAsync(); - } - } - public void PdfQueryCellInfoHandler(Syncfusion.Blazor.Gantt.PdfQueryCellInfoEventArgs args) - { - if (args.Column.Field == "TaskName" && args.Data.TaskID == 5) - { - args.Cell.Value = "Updated Value"; - args.Cell.CellStyle = new PdfElementStyle() - { - FillBackgroundColor = "Orange", - Font = new PdfGridFont() - { - FontFamily = PdfFontFamily.TimesRoman, - FontSize = 6, - FontStyle = PdfFontStyle.Italic, - IsTrueType = false, - TextColor = "Red", - TextHighlightColor = "Green" - } - }; - args.Cell.CellStyle.Border = new Syncfusion.Blazor.Grids.PdfBorder() - { - Color = "Black", - DashStyle = Syncfusion.Blazor.Grids.PdfDashStyle.Dot, - Width = 0.1 - }; - } - } - public class TaskData - { - public int TaskID { get; set; } - public string TaskName { get; set; } - public DateTime StartDate { get; set; } - public DateTime? EndDate { get; set; } - public string Duration { get; set; } - public int Progress { get; set; } - public int? ParentID { get; set; } - public string Predecessor { get; set; } - } - - public static List GetTaskCollection() - { - List Tasks = new List() - { - new TaskData() { TaskID = 1, TaskName = "Project initiation", StartDate = new DateTime(2022, 04, 05), EndDate = new DateTime(2022, 04, 08), }, - new TaskData() { TaskID = 2, TaskName = "Identify Site location", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, ParentID = 1 }, - new TaskData() { TaskID = 3, TaskName = "Perform soil test", StartDate = new DateTime(2022, 04, 05), Duration = "4", Progress = 40, ParentID = 1, Predecessor = "2" }, - new TaskData() { TaskID = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, ParentID = 1 , Predecessor = "3" }, - new TaskData() { TaskID = 5, TaskName = "Project estimation", StartDate = new DateTime(2022, 04, 06), EndDate = new DateTime(2022, 04, 08), }, - new TaskData() { TaskID = 6, TaskName = "Develop floor plan for estimation", StartDate = new DateTime(2022, 04, 06), Duration = "3", Progress = 30, ParentID = 5 }, - new TaskData() { TaskID = 7, TaskName = "List materials", StartDate = new DateTime(2022, 04, 06), Duration = "3", Progress = 40, ParentID = 5 }, - new TaskData() { TaskID = 8, TaskName = "Estimation approval", StartDate = new DateTime(2022, 04, 06), Duration = "0", Progress = 30, ParentID = 5 } - }; - return Tasks; - } -} - -{% endhighlight %} -{% endtabs %} - -{% previewsample "https://blazorplayground.syncfusion.com/embed/VDLejELSpVTlPVsF?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} - -## Exporting with column header template - -The PDF export functionality allows for customization of Gantt chart columns header, including the inclusion of images, background colors, and custom text. This can be achieved using the [PdfColumnHeaderQueryCellInfo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttEvents-1.html#Syncfusion_Blazor_Gantt_GanttEvents_1_PdfColumnHeaderQueryCellInfo) event. By handling this event, you can define how each column header in the Gantt chart is rendered in the exported PDF. - -The following code snippet demonstrates how to use the `PdfColumnHeaderQueryCellInfo` event to export Gantt columns header with custom text and image on the task name column header, - -{% tabs %} -{% highlight razor tabtitle="Index.razor" %} - -@using Syncfusion.Blazor.Gantt -@using Syncfusion.Blazor.Grids -@using Syncfusion.Blazor.Navigations -@using Syncfusion.PdfExport -@using System.Net.Http -@using System.IO -@inject HttpClient Http - - - - - - - - - - - - - - - -@code { - private List TaskCollection { get; set; } - private SfGantt Gantt; - private List toolbarItem = new List() { - new Syncfusion.Blazor.Navigations.ToolbarItem() { - Text = "PDF Export", TooltipText = "PDF Export", Id = "PdfExport", PrefixIcon = "e-pdfexport" - } - }; - - public PdfImage image; - - protected override async Task OnInitializedAsync() - { - TaskCollection = GetTaskCollection(); - - var imageBytes = await Http.GetByteArrayAsync("https://cdn.syncfusion.com/content/images/landing-page/yes.png"); - using var imageStream = new MemoryStream(imageBytes); - image = PdfImage.FromStream(imageStream); - } - - public async void ToolbarClickHandler(Syncfusion.Blazor.Navigations.ClickEventArgs args) - { - if (args.Item.Id == "PdfExport") - { - await Gantt.ExportToPdfAsync(); - } - } - - public void PdfHeaderQueryCellInfoHandler(Syncfusion.Blazor.Gantt.PdfHeaderQueryCellInfoEventArgs args) - { - if (args.Column.Field == "TaskName") - { - args.Cell.Value = "Updated Value"; - args.Cell.CellStyle = new PdfElementStyle(){ Image = image}; - - } - } - - public class TaskData - { - public int TaskID { get; set; } - public string TaskName { get; set; } - public DateTime StartDate { get; set; } - public DateTime? EndDate { get; set; } - public string Duration { get; set; } - public int Progress { get; set; } - public int? ParentID { get; set; } - public string Predecessor { get; set; } - } - - public static List GetTaskCollection() - { - return new List() - { - new TaskData() { TaskID = 1, TaskName = "Project initiation", StartDate = new DateTime(2022, 04, 05), EndDate = new DateTime(2022, 04, 08) }, - new TaskData() { TaskID = 2, TaskName = "Identify Site location", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, ParentID = 1 }, - new TaskData() { TaskID = 3, TaskName = "Perform soil test", StartDate = new DateTime(2022, 04, 05), Duration = "4", Progress = 40, ParentID = 1, Predecessor = "2" }, - new TaskData() { TaskID = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, ParentID = 1 , Predecessor = "3" }, - new TaskData() { TaskID = 5, TaskName = "Project estimation", StartDate = new DateTime(2022, 04, 06), EndDate = new DateTime(2022, 04, 09) }, - new TaskData() { TaskID = 6, TaskName = "Develop floor plan for estimation", StartDate = new DateTime(2022, 04, 06), Duration = "3", Progress = 30, ParentID = 5 }, - new TaskData() { TaskID = 7, TaskName = "List materials", StartDate = new DateTime(2022, 04, 06), Duration = "3", Progress = 40, ParentID = 5 }, - new TaskData() { TaskID = 8, TaskName = "Estimation approval", StartDate = new DateTime(2022, 04, 06), Duration = "0", Progress = 30, ParentID = 5 } - }; - } -} - -{% endhighlight %} -{% endtabs %} - -{% previewsample "https://blazorplayground.syncfusion.com/embed/LZrStYVIfUjgPhjz?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} - -## Custom label for Gantt Chart PDF export - -The PDF export feature of the Gantt chart allows for detailed customization of labels such as right label, left label, and task label. This functionality includes the ability to include images, change background colors, and add custom text. These customizations are managed using the [PdfQueryTaskbarInfo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttEvents-1.html#Syncfusion_Blazor_Gantt_GanttEvents_1_PdfQueryTaskbarInfo) event. By handling this event, you can specify how each label in the Gantt chart will appear in the exported PDF. - -The following example demonstrates how to implement the `PdfQueryTaskbarInfo` event to customize the PDF export of Gantt chart labels with specific text and images, - -{% tabs %} -{% highlight razor tabtitle="Index.razor" %} - -@using Syncfusion.Blazor.Gantt -@using Syncfusion.Blazor.Grids -@using Syncfusion.Blazor.Navigations -@using Syncfusion.PdfExport -@using System.Net.Http -@using System.IO - - - - - - - - - - - - - - - @{ - if ((context as TaskData).TaskID == 5) - { -
    - - @((context as TaskData).TaskName) -
    - } - } -
    - - @if ((context as TaskData).TaskID == 2) - { -
    - Updated Value -
    - } - else - { -
    - @((context as TaskData).TaskName) -
    - } -
    - - @if ((context as TaskData).TaskID == 3) - { -
    - -@((context as TaskData).Progress)% -
    - } - else - { -
    - @((context as TaskData).Progress)% -
    - } -
    -
    - -
    - -@code { - private List TaskCollection { get; set; } - private SfGantt Gantt; - private List toolbarItem = new List() - { - new Syncfusion.Blazor.Navigations.ToolbarItem() - { - Text = "PDF Export", - TooltipText = "PDF Export", - Id = "PdfExport", - PrefixIcon = "e-pdfexport" - } - }; - - public static PdfImage image; - - protected override async Task OnInitializedAsync() - { - this.TaskCollection = GetTaskCollection(); - - using var httpClient = new HttpClient(); - var imageBytes = await httpClient.GetByteArrayAsync("https://cdn.syncfusion.com/content/images/landing-page/yes.png"); - var imageStream = new MemoryStream(imageBytes); - image = PdfImage.FromStream(imageStream); - } - - public async void ToolbarClickHandler(Syncfusion.Blazor.Navigations.ClickEventArgs args) - { - if (args.Item.Id == "PdfExport") - { - await Gantt.ExportToPdfAsync(); - } - } - - public void PdfQueryTaskbarInfoHandler(PdfQueryTaskbarInfoEventArgs args) - { - if (args.Data.TaskID == 2) - { - args.LabelSettings.LeftLabelValue = "Updated Value"; - } - else - { - args.LabelSettings.LeftLabelValue = args.Data.TaskName; - } - - if (args.Data.TaskID == 5) - { - args.LabelSettings.RightLabel = new PdfElementStyle() { Image = image }; - } - else - { - args.LabelSettings.RightLabelValue = args.Data.TaskName; - } - - if (args.Data.TaskID == 3) - { - args.LabelSettings.TaskbarLabelValue = $"-{args.Data.Progress}%"; - } - else - { - args.LabelSettings.TaskbarLabelValue = $"{args.Data.Progress}%"; - } - } - - public class TaskData - { - public int TaskID { get; set; } - public string TaskName { get; set; } - public DateTime StartDate { get; set; } - public DateTime? EndDate { get; set; } - public string Duration { get; set; } - public int Progress { get; set; } - public int? ParentID { get; set; } - public string Predecessor { get; set; } - } - - public static List GetTaskCollection() - { - return new List() - { - new TaskData() { TaskID = 1, TaskName = "Project initiation", StartDate = new DateTime(2022, 04, 05), EndDate = new DateTime(2022, 04, 21) }, - new TaskData() { TaskID = 2, TaskName = "Identify Site location", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, ParentID = 1 }, - new TaskData() { TaskID = 3, TaskName = "Perform soil test", StartDate = new DateTime(2022, 04, 05), Duration = "4", Progress = 40, ParentID = 1, Predecessor = "2" }, - new TaskData() { TaskID = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, ParentID = 1 , Predecessor = "3" }, - new TaskData() { TaskID = 5, TaskName = "Project estimation", StartDate = new DateTime(2022, 04, 06), EndDate = new DateTime(2022, 04, 21) }, - new TaskData() { TaskID = 6, TaskName = "Develop floor plan for estimation", StartDate = new DateTime(2022, 04, 06), Duration = "3", Progress = 30, ParentID = 5 }, - new TaskData() { TaskID = 7, TaskName = "List materials", StartDate = new DateTime(2022, 04, 06), Duration = "3", Progress = 40, ParentID = 5 }, - new TaskData() { TaskID = 8, TaskName = "Estimation approval", StartDate = new DateTime(2022, 04, 06), Duration = "0", Progress = 30, ParentID = 5 } - }; - } -} - -{% endhighlight %} -{% endtabs %} - -{% previewsample "https://blazorplayground.syncfusion.com/embed/LtLyNOhefKeOHrhh?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} - -## Best practices for exporting PDF with templates - -- **Optimize PdfQueryCellInfo event usage**: Use the `PdfQueryCellInfo` event to customize individual cell appearances efficiently. Minimize complex logic to maintain performance. - -- **Utilize PdfColumnHeaderQueryCellInfo effectively**: Apply the `PdfColumnHeaderQueryCellInfo` event for custom header styles and content, focusing on clarity and readability. -- **Accessibility and clarity**: Keep header elements simple and accessible. Use straightforward text and icons to convey column purposes clearly. - -- **Efficient use of PdfQueryTaskbarInfo**: Utilize the `PdfQueryTaskbarInfo` event to apply label customizations based on task data conditions for effective communication of task statuses. -- **Consistent label styling**: Ensure consistent theme across labels with uniform font styles, colors, and sizes. - -## Image handling across events -- **Base64 and MemoryStream**: Convert images to Base64 strings, then use `MemoryStream` to convert them to `PdfImage`. This avoids reliance on potentially inaccessible web links. -- **Height and width management**: Scale images to fit designated areas to prevent default resizing that reflects cell or row heights. Maintain a professional PDF layout. -- **Compression and optimization**: Compress images prior to Base64 conversion to reduce file size while maintaining quality, optimizing the final PDF document size. - -## Troubleshooting PDF export - -1. **Customizations not appearing in PDF** - - **Check event handler**: Ensure that the `PdfQueryTaskbarInfo` event is correctly implemented and bound in your code. Double-check the event handler's logic to verify that conditions for customization are being met. - - **Data matching**: Ensure that the task data (like `TaskID`) used in the event matches the data in the task collection. Mismatches can prevent customizations from applying. - -2. **Images not displaying** - - **Image URL**: Verify that the image URLs are correct and accessible. Ensure that external images are hosted on a server with public access rights. - - **Supported formats**: Use compatible image formats such as JPG, PNG, or GIF. Unsupported formats may not render correctly in a PDF. - -3. **Performance issues** - - **Optimize resources**: Large images or complex styling may slow down the PDF export process. Consider optimizing image size and simplifying styles. - -4. **Color code customization** - - **Use valid color codes**: You can use HEX (`#RRGGBB`), or standard color names like `red`, `blue`, etc. Ensure all color codes or names used are supported and valid. - - **Consistency across styles**: Maintain consistent use of color codes in the styles to avoid unexpected color changes or conflicts during PDF rendering. \ No newline at end of file From 8bcf65b5882ce0338be574ccd09621978dc81418 Mon Sep 17 00:00:00 2001 From: NithyaSivaprakasam <103498896+NithyaSivaprakasam@users.noreply.github.com> Date: Fri, 31 Oct 2025 17:19:18 +0530 Subject: [PATCH 2/4] Change header level for text customization section Updated section header formatting for clarity. --- blazor/gantt-chart/header-and-footer.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/blazor/gantt-chart/header-and-footer.md b/blazor/gantt-chart/header-and-footer.md index e9280d2a39..4f32c67ed8 100644 --- a/blazor/gantt-chart/header-and-footer.md +++ b/blazor/gantt-chart/header-and-footer.md @@ -11,7 +11,7 @@ documentation: ug Customizing headers and footers in PDF exports of the Blazor Gantt Chart component allows adding text, lines, page numbers, and images to enhance document professionalism for projects. Use [GanttPdfExportProperties](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttPdfExportProperties.html) with [Header](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PdfExportPropertiesBase.html#Syncfusion_Blazor_Grids_PdfExportPropertiesBase_Header) and [Footer](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PdfExportPropertiesBase.html#Syncfusion_Blazor_Grids_PdfExportPropertiesBase_Footer) to define content arrays, specifying `Type` (e.g., Text, Line), `Value`, `Position`, `Style`, or `Src` for images with `Base64` encoding. -### Write a text in header and footer +## Write a text in header and footer Customize text in headers or footers using the [Header](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PdfExportPropertiesBase.html#Syncfusion_Blazor_Grids_PdfExportPropertiesBase_Header) and [Footer](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PdfExportPropertiesBase.html#Syncfusion_Blazor_Grids_PdfExportPropertiesBase_Footer) properties in [GanttPdfExportProperties](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttPdfExportProperties.html). Set `Type` to **Text**, define `Value` for the text, `Position` for x/y coordinates, and `Style` for color or font size. @@ -203,4 +203,4 @@ Supported line styles are, ## See also - [How to export to PDF?](https://blazor.syncfusion.com/documentation/gantt-chart/pdf-export) -- [How to manage task dependencies?](https://blazor.syncfusion.com/documentation/gantt-chart/task-dependencies) \ No newline at end of file +- [How to manage task dependencies?](https://blazor.syncfusion.com/documentation/gantt-chart/task-dependencies) From d0ccce55f798f69b1bf20cbd5d034a2528e59267 Mon Sep 17 00:00:00 2001 From: NithyaSivaprakasam <103498896+NithyaSivaprakasam@users.noreply.github.com> Date: Tue, 4 Nov 2025 18:13:52 +0530 Subject: [PATCH 3/4] Update blazor-toc.html --- blazor-toc.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blazor-toc.html b/blazor-toc.html index 7b66950c1b..be9631e8bf 100644 --- a/blazor-toc.html +++ b/blazor-toc.html @@ -3132,7 +3132,7 @@
  • PDF Export
  • Timezone
  • From 38f790e33979942d7a51adb4c76450fa6b50cec1 Mon Sep 17 00:00:00 2001 From: NithyaSivaprakasam <103498896+NithyaSivaprakasam@users.noreply.github.com> Date: Tue, 4 Nov 2025 18:18:18 +0530 Subject: [PATCH 4/4] Update PDF export link in blazor-toc.html --- blazor-toc.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blazor-toc.html b/blazor-toc.html index be9631e8bf..d02c78ef25 100644 --- a/blazor-toc.html +++ b/blazor-toc.html @@ -2131,7 +2131,7 @@