<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Calvince Moth</title>
    <description>The latest articles on Forem by Calvince Moth (@calvinceawitim).</description>
    <link>https://forem.com/calvinceawitim</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2291171%2F848b22b8-80f6-4883-bc8b-17a7faec0136.jpg</url>
      <title>Forem: Calvince Moth</title>
      <link>https://forem.com/calvinceawitim</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/calvinceawitim"/>
    <language>en</language>
    <item>
      <title>Import and Export Word Documents in .NET MAUI Rich Text Editor with DocIO</title>
      <dc:creator>Calvince Moth</dc:creator>
      <pubDate>Wed, 15 Apr 2026 11:49:03 +0000</pubDate>
      <link>https://forem.com/syncfusion/import-and-export-word-documents-in-net-maui-rich-text-editor-with-docio-51od</link>
      <guid>https://forem.com/syncfusion/import-and-export-word-documents-in-net-maui-rich-text-editor-with-docio-51od</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Developers often need to move Word content seamlessly across platforms. This guide shows how to import Word documents into a .NET MAUI Rich Text Editor and export them back using DocIO, ensuring consistent formatting and productivity.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bring native Word document handling to your cross‑platform .NET MAUI apps
&lt;/h2&gt;

&lt;p&gt;Modern cross‑platform apps no longer work with plain text alone. They handle full‑fledged documents, rich formatting, images, and structured content that users expect to look consistent on every device.&lt;/p&gt;

&lt;p&gt;Among these formats, &lt;strong&gt;Word documents&lt;/strong&gt; remain a preferred choice for real‑world apps. Users expect to open a .docx file, edit it effortlessly, and save it back, whether they’re using a mobile device or a desktop. In a cross‑platform .NET MAUI app, delivering this experience reliably can be challenging.&lt;/p&gt;

&lt;p&gt;That’s where the &lt;a href="https://www.syncfusion.com/maui-controls/maui-rich-text-editor" rel="noopener noreferrer"&gt;Syncfusion&lt;sup&gt;®&lt;/sup&gt; .NET MAUI Rich Text Editor&lt;/a&gt; comes in. It simplifies document handling across &lt;strong&gt;iOS, Android, Windows,&lt;/strong&gt; and &lt;strong&gt;macOS&lt;/strong&gt;, allowing you to work with rich content while preserving formatting, images, and layout. With built‑in support for importing and exporting Word documents, content moves seamlessly between platforms without unexpected surprises.&lt;/p&gt;

&lt;p&gt;This makes it a great fit for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Business and enterprise apps.&lt;/li&gt;
&lt;li&gt;Blog and content editors.&lt;/li&gt;
&lt;li&gt;Email composers.&lt;/li&gt;
&lt;li&gt;Collaborative and productivity tools.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What this article covers
&lt;/h2&gt;

&lt;p&gt;In this blog, you’ll learn how to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Import a Word document&lt;/strong&gt; into the Syncfusion .NET MAUI Rich Text Editor by converting it to HTML.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Export edited content back to Word&lt;/strong&gt; using Syncfusion &lt;a href="https://www.syncfusion.com/document-sdk/net-word-library" rel="noopener noreferrer"&gt;.NET Word Library&lt;/a&gt;, without losing text, images, or formatting.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let’s get started!&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting started with .NET MAUI Rich Text Editor
&lt;/h2&gt;

&lt;p&gt;First, create a &lt;a href="https://learn.microsoft.com/en-us/dotnet/maui/get-started/first-app?view=net-maui-10.0&amp;amp;tabs=vswin&amp;amp;pivots=devices-android" rel="noopener noreferrer"&gt;.NET MAUI application&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Then, declare the &lt;a href="https://help.syncfusion.com/cr/maui/Syncfusion.Maui.RichTextEditor.SfRichTextEditor.html" rel="noopener noreferrer"&gt;SfRichTextEditor&lt;/a&gt; in your XAML page, where the converted Word content will be displayed.&lt;/p&gt;

&lt;p&gt;For more details, refer to the &lt;a href="https://www.syncfusion.com/blogs/post/rich-text-editor-dotnet-maui" rel="noopener noreferrer"&gt;Syncfusion .NET MAUI Rich Text Editor&lt;/a&gt; blog.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?xml version="1.0" encoding="utf-8" ?&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;ContentPage&lt;/span&gt; &lt;span class="na"&gt;xmlns=&lt;/span&gt;&lt;span class="s"&gt;"http://schemas.microsoft.com/dotnet/2021/maui"&lt;/span&gt;
             &lt;span class="na"&gt;xmlns:x=&lt;/span&gt;&lt;span class="s"&gt;"http://schemas.microsoft.com/winfx/2009/xaml"&lt;/span&gt;
             &lt;span class="na"&gt;xmlns:rte=&lt;/span&gt;&lt;span class="s"&gt;"clr-namespace:Syncfusion.Maui.RichTextEditor;assembly=Syncfusion.Maui.RichTextEditor"&lt;/span&gt;
             &lt;span class="na"&gt;x:Class=&lt;/span&gt;&lt;span class="s"&gt;"MauiApp1.MainPage"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;rte:SfRichTextEditor&lt;/span&gt; &lt;span class="na"&gt;x:Name=&lt;/span&gt;&lt;span class="s"&gt;"richTextEditor"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/ContentPage&amp;gt;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Rich Text Editor features are organized into individual modules. To enable the import or export functionality, add the &lt;code&gt;ImportExportService&lt;/code&gt; to the provider’s array.&lt;/p&gt;

&lt;h2&gt;
  
  
  Import a Word document into the .NET MAUI Rich Text Editor
&lt;/h2&gt;

&lt;p&gt;To bring Word content into the &lt;a href="https://help.syncfusion.com/maui/rich-text-editor/getting-started" rel="noopener noreferrer"&gt;.NET MAUI Rich Text Editor&lt;/a&gt;, read the Word file stream and load it using the &lt;a href="https://www.syncfusion.com/document-sdk/net-word-library" rel="noopener noreferrer"&gt;Syncfusion DocIO library&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Next, convert the Word document to HTML so the Rich Text Editor can render it accurately. To ensure images are displayed correctly, we encode them as Base64 and embed them inline, creating a self-contained HTML string. Finally, we assign this HTML string to the &lt;a href="https://help.syncfusion.com/cr/maui/Syncfusion.Maui.RichTextEditor.SfRichTextEditor.html#Syncfusion_Maui_RichTextEditor_SfRichTextEditor_HtmlText" rel="noopener noreferrer"&gt;SfRichTextEditor.HtmlText&lt;/a&gt; property, so the content appears instantly in the Rich Text Editor UI.&lt;/p&gt;

&lt;p&gt;Here is the implementation code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;var&lt;/span&gt; &lt;span class="n"&gt;inStream&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;OpenReadAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;var&lt;/span&gt; &lt;span class="n"&gt;ms&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;MemoryStream&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;inStream&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;CopyToAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ms&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;ms&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Position&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;var&lt;/span&gt; &lt;span class="n"&gt;document&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;WordDocument&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ms&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;FormatType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Automatic&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="n"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SaveOptions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ImageNodeVisited&lt;/span&gt; &lt;span class="p"&gt;+=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;var&lt;/span&gt; &lt;span class="n"&gt;imgMs&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;MemoryStream&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ImageStream&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Position&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ImageStream&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;CopyTo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;imgMs&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;bytes&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;imgMs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToArray&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;mime&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;
        &lt;span class="n"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Length&lt;/span&gt; &lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt; &lt;span class="p"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="m"&gt;0xFF&lt;/span&gt; &lt;span class="p"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="m"&gt;0xD8&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="s"&gt;"image/jpeg"&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Length&lt;/span&gt; &lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="m"&gt;8&lt;/span&gt; &lt;span class="p"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="m"&gt;0x89&lt;/span&gt; &lt;span class="p"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="m"&gt;0x50&lt;/span&gt; &lt;span class="p"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="m"&gt;0x4E&lt;/span&gt; &lt;span class="p"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="m"&gt;0x47&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="s"&gt;"image/png"&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Length&lt;/span&gt; &lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="m"&gt;6&lt;/span&gt; &lt;span class="p"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="m"&gt;0x47&lt;/span&gt; &lt;span class="p"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="m"&gt;0x49&lt;/span&gt; &lt;span class="p"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="m"&gt;0x46&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="s"&gt;"image/gif"&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Length&lt;/span&gt; &lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt; &lt;span class="p"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="m"&gt;0x42&lt;/span&gt; &lt;span class="p"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="m"&gt;0x4D&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="s"&gt;"image/bmp"&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="s"&gt;"image/png"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Convert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToBase64String&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Uri&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;$"data:&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;mime&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;;base64,&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;var&lt;/span&gt; &lt;span class="n"&gt;htmlStream&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;MemoryStream&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;htmlStream&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;FormatType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Html&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;htmlStream&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Position&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;var&lt;/span&gt; &lt;span class="n"&gt;reader&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;StreamReader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;htmlStream&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;html&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ReadToEndAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="n"&gt;richTextEditor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HtmlText&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This article was originally published at &lt;a href="https://www.syncfusion.com/blogs/post/import-export-word-in-dotnet-maui-rte" rel="noopener noreferrer"&gt;Syncfusion.com.&lt;/a&gt;&lt;/p&gt;

</description>
      <category>dotnetmaui</category>
      <category>csharp</category>
      <category>desktop</category>
      <category>documentprocessing</category>
    </item>
    <item>
      <title>How to Digitally Sign PDFs in Android Apps with .NET MAUI</title>
      <dc:creator>Calvince Moth</dc:creator>
      <pubDate>Wed, 15 Apr 2026 10:44:12 +0000</pubDate>
      <link>https://forem.com/syncfusion/how-to-digitally-sign-pdfs-in-android-apps-with-net-maui-2g90</link>
      <guid>https://forem.com/syncfusion/how-to-digitally-sign-pdfs-in-android-apps-with-net-maui-2g90</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Need secure PDF signing in Android apps with .NET MAUI? This hands-on guide walks through digitally signing new and existing PDFs using a PFX certificate, customizing visible signatures, adding timestamps, tracking revisions, and managing signature fields, all with production-ready, developer-friendly APIs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why digital signatures matter for Android PDFs
&lt;/h2&gt;

&lt;p&gt;As mobile apps increasingly handle contracts, approvals, and sensitive documents, ensuring document integrity and authenticity is critical.&lt;/p&gt;

&lt;p&gt;Digital signatures play a key role by providing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Integrity&lt;/strong&gt;: Ensures the document hasn’t been altered.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Authenticity&lt;/strong&gt;: Verifies the signer’s identity.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Non-repudiation&lt;/strong&gt;: Prevents signers from denying their actions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Role in mobile workflows&lt;/strong&gt;: They enable quick, secure approvals and document exchanges directly from Android devices, ensuring compliance and trust.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Unlike electronic signatures (simple images or consent marks), *&lt;em&gt;digital signatures rely on cryptographic certificates&lt;/em&gt; , making them suitable for compliance-driven and security-sensitive workflows.&lt;/p&gt;

&lt;p&gt;However, developers often struggle with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Managing certificates securely&lt;/li&gt;
&lt;li&gt;Customizing signature appearance&lt;/li&gt;
&lt;li&gt;Implementing standards-compliant signing in mobile apps&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is where a .NET MAUI-based PDF solution significantly simplifies the process. The &lt;a href="https://www.syncfusion.com/document-sdk/net-pdf-library" rel="noopener noreferrer"&gt;Syncfusion &lt;strong&gt;&lt;sup&gt;®&lt;/sup&gt;&lt;/strong&gt;.NET PDF Library&lt;/a&gt; supports digital signatures in Android through &lt;strong&gt;.NET MAUI&lt;/strong&gt;, making it easy to add secure signatures to PDF documents. It offers APIs for certificate-based signing, appearance customization, timestamping, and validation, all within your application.&lt;/p&gt;

&lt;p&gt;In this blog post, we’ll walk through using the Syncfusion .NET PDF Library with .NET MAUI to sign new and existing PDFs and implement advanced features such as timestamping, deferred signing, and revision tracking.&lt;/p&gt;

&lt;p&gt;By the end, you’ll have a clear roadmap to integrate secure, professional digital signing into your Android MAUI apps.&lt;/p&gt;

&lt;h2&gt;
  
  
  Implement digital signatures in Android with Syncfusion .NET MAUI PDF Library
&lt;/h2&gt;

&lt;p&gt;The Syncfusion .NET PDF Library simplifies implementing digital signatures in Android apps built with .NET MAUI.&lt;/p&gt;

&lt;p&gt;Key features include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Easy-to-use APIs for adding, validating, and managing signatures.&lt;/li&gt;
&lt;li&gt;Support for visible signatures with custom images and metadata.&lt;/li&gt;
&lt;li&gt;Compliance with global standards like &lt;code&gt;PAdES&lt;/code&gt; and &lt;code&gt;X.509&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With these capabilities, creating secure and professional signing experiences on mobile is effortless.&lt;/p&gt;

&lt;h3&gt;
  
  
  Set up a .NET MAUI project for Android
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Create a new .NET MAUI App in Visual Studio 2022 and ensure the latest .NET MAUI workload is installed.&lt;/li&gt;
&lt;li&gt;Install Syncfusion PDF Library 

&lt;ul&gt;
&lt;li&gt;In &lt;strong&gt;Solution Explorer&lt;/strong&gt;, right-click your project and select &lt;strong&gt;Manage NuGet Packages&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Search for &lt;strong&gt;Syncfusion.Pdf.Net&lt;/strong&gt; and install it.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F04%2FInstalling-Syncfusion-PDF-Library-via-NuGet-in-Visual-Studio.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F04%2FInstalling-Syncfusion-PDF-Library-via-NuGet-in-Visual-Studio.png" alt="&amp;lt;alt-text&amp;gt;" width="780" height="444"&gt;&lt;/a&gt;&lt;br&gt;Installing Syncfusion PDF Library via NuGet in Visual Studio
  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Run the sample using an Android Emulator or connect a physical Android device for testing.&lt;/p&gt;

&lt;p&gt;Curious about creating a .NET MAUI sample using Syncfusion PDF Library? Explore our official &lt;a href="https://help.syncfusion.com/document-processing/pdf/pdf-library/net/create-pdf-file-in-maui#steps-to-create-pdf-document-programmatically-in-net-maui" rel="noopener noreferrer"&gt;documentation&lt;/a&gt; for a complete walkthrough.&lt;/p&gt;

&lt;h2&gt;
  
  
  Add digital signatures to your PDFs in Android using .NET MAUI
&lt;/h2&gt;

&lt;p&gt;Adding a digital signature to a PDF ensures the PDF’s authenticity and legal validity. The process involves creating or loading a document, applying a certificate-based signature, and saving the signed file.&lt;/p&gt;

&lt;p&gt;If you’re wondering how to add a digital signature to a PDF on Android, this step-by-step guide will help you integrate it seamlessly.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Create and sign a new PDF document
&lt;/h3&gt;

&lt;p&gt;You can create a new PDF from scratch and sign it using a digital certificate. The signing process typically includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Creating the PDF document&lt;/li&gt;
&lt;li&gt;Adding a page&lt;/li&gt;
&lt;li&gt;Loading a certificate (PFX)&lt;/li&gt;
&lt;li&gt;Applying a signature field&lt;/li&gt;
&lt;li&gt;Customizing signer metadata and appearance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Example code&lt;/strong&gt;: Create and sign a new PDF&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;//Creates a new PDF document.&lt;/span&gt;
&lt;span class="n"&gt;PdfDocument&lt;/span&gt; &lt;span class="n"&gt;document&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;PdfDocument&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;//Adds a new page.&lt;/span&gt;
&lt;span class="n"&gt;PdfPageBase&lt;/span&gt; &lt;span class="n"&gt;page&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Pages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;//Create PDF graphics for the page.&lt;/span&gt;
&lt;span class="n"&gt;PdfGraphics&lt;/span&gt; &lt;span class="n"&gt;graphics&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Graphics&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;//Creates a certificate instance from a PFX file with a private key.&lt;/span&gt;
&lt;span class="n"&gt;FileStream&lt;/span&gt; &lt;span class="n"&gt;certificateStream&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;FileStream&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"PDF.pfx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;FileMode&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Open&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;FileAccess&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Read&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;PdfCertificate&lt;/span&gt; &lt;span class="n"&gt;pdfCert&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;PdfCertificate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;certificateStream&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"password123"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;//Creates a digital signature.&lt;/span&gt;
&lt;span class="n"&gt;PdfSignature&lt;/span&gt; &lt;span class="n"&gt;signature&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;PdfSignature&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;document&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pdfCert&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Signature"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;//Sets an image for the signature field.&lt;/span&gt;
&lt;span class="n"&gt;FileStream&lt;/span&gt; &lt;span class="n"&gt;imageStream&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;FileStream&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"signature.jpg"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;FileMode&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Open&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;FileAccess&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Read&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;//Sets an image for the signature field.&lt;/span&gt;
&lt;span class="n"&gt;PdfBitmap&lt;/span&gt; &lt;span class="n"&gt;signatureImage&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;PdfBitmap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;imageStream&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;//Sets signature information.&lt;/span&gt;
&lt;span class="n"&gt;signature&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Bounds&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;RectangleF&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;PointF&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;signatureImage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PhysicalDimension&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;signature&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SignedName&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Syncfusion"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;signature&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ContactInfo&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"johndoe@owned.us"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;signature&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;LocationInfo&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Honolulu, Hawaii"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;signature&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Reason&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"I am the author of this document."&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;//Draws the signature image.&lt;/span&gt;
&lt;span class="n"&gt;signature&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Appearance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Normal&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Graphics&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;DrawImage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;signatureImage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;//Saves the PDF to the memory stream.&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;MemoryStream&lt;/span&gt; &lt;span class="n"&gt;ms&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ms&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;//Close the PDF document&lt;/span&gt;
&lt;span class="n"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Close&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;ms&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Position&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;

&lt;span class="c1"&gt;//Saves the memory stream as a file.&lt;/span&gt;
&lt;span class="n"&gt;SaveService&lt;/span&gt; &lt;span class="n"&gt;saveService&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;saveService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;SaveAndView&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Result.pdf"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"application/pdf"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ms&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2: Sign an existing PDF document
&lt;/h3&gt;

&lt;p&gt;To sign an existing PDF:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Load the document&lt;/li&gt;
&lt;li&gt;Access the required page and signature field&lt;/li&gt;
&lt;li&gt;Apply a certificate-based signature&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Syncfusion PDF Library makes this process smooth through APIs that handle field detection and signing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example Code&lt;/strong&gt;: Sign an existing PDF&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;Assembly&lt;/span&gt; &lt;span class="n"&gt;assembly&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;typeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;MainPage&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;GetTypeInfo&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;Assembly&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;basePath&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"CreatePdfDemoSample.Resources.Data."&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;Stream&lt;/span&gt; &lt;span class="n"&gt;inputStream&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;assembly&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetManifestResourceStream&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;basePath&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="s"&gt;"PdfDocument.pdf"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;Stream&lt;/span&gt; &lt;span class="n"&gt;pfxStream&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;assembly&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetManifestResourceStream&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;basePath&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="s"&gt;"PDF.pfx"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;Stream&lt;/span&gt; &lt;span class="n"&gt;signStream&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;assembly&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetManifestResourceStream&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;basePath&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="s"&gt;"signature.png"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="n"&gt;PdfLoadedDocument&lt;/span&gt; &lt;span class="n"&gt;lDoc&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;PdfLoadedDocument&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;inputStream&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;PdfLoadedPage&lt;/span&gt; &lt;span class="n"&gt;page&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;lDoc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Pages&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;PdfLoadedPage&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;PdfLoadedSignatureField&lt;/span&gt; &lt;span class="n"&gt;signField&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;lDoc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Form&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fields&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;6&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;PdfLoadedSignatureField&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;//Creates a certificate instance from PFX file with private key.&lt;/span&gt;
&lt;span class="n"&gt;PdfCertificate&lt;/span&gt; &lt;span class="n"&gt;pdfCert&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;PdfCertificate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pfxStream&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"password123"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;//Creates a digital signature.&lt;/span&gt;
&lt;span class="n"&gt;PdfSignature&lt;/span&gt; &lt;span class="n"&gt;signature&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;PdfSignature&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lDoc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pdfCert&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Signature"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;signField&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;//Sets an image for the signature field. &lt;/span&gt;
&lt;span class="n"&gt;PdfBitmap&lt;/span&gt; &lt;span class="n"&gt;signatureImage&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;PdfBitmap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;signStream&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;//Sets signature information.&lt;/span&gt;
&lt;span class="n"&gt;signature&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Bounds&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;signField&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Bounds&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;signature&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SignedName&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Syncfusion"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;signature&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ContactInfo&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"johndoe@owned.us"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;signature&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;LocationInfo&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Honolulu, Hawaii"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;signature&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Reason&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"I am the author of this document."&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;//Create appearance for the digital signature.&lt;/span&gt;
&lt;span class="n"&gt;signature&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Appearance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Normal&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Graphics&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;DrawImage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;signatureImage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;RectangleF&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;60&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;35&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

&lt;span class="c1"&gt;//Saves the PDF to the memory stream.&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;MemoryStream&lt;/span&gt; &lt;span class="n"&gt;ms&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;lDoc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ms&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;//Close the PDF document&lt;/span&gt;
&lt;span class="n"&gt;lDoc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Close&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;ms&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Position&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;//Saves the memory stream as a file.&lt;/span&gt;
&lt;span class="n"&gt;SaveService&lt;/span&gt; &lt;span class="n"&gt;saveService&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;saveService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;SaveAndView&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Result.pdf"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"application/pdf"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ms&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This article was originally published at &lt;a href="https://www.syncfusion.com/blogs/post/digital-signature-android-pdf-dotnet-maui" rel="noopener noreferrer"&gt;Syncfusion.com.&lt;/a&gt;&lt;/p&gt;

</description>
      <category>pdf</category>
      <category>dotnetmaui</category>
      <category>dotnetpdflibrary</category>
      <category>digitalsignatures</category>
    </item>
    <item>
      <title>Export Once, Share Everywhere: Convert DOCX to PDF, HTML, and More in React</title>
      <dc:creator>Calvince Moth</dc:creator>
      <pubDate>Tue, 14 Apr 2026 12:01:35 +0000</pubDate>
      <link>https://forem.com/syncfusion/export-once-share-everywhere-convert-docx-to-pdf-html-and-more-in-react-efg</link>
      <guid>https://forem.com/syncfusion/export-once-share-everywhere-convert-docx-to-pdf-html-and-more-in-react-efg</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Still juggling multiple document tools just to share files in your React app? With the advanced export options in Syncfusion React DOCX Editor, you can generate DOCX, PDF, HTML, Markdown, and more from a single editor, with no broken formatting and no manual conversions. You can enable scalable document sharing, reduce conversion errors, and simplify collaboration across teams. The result is faster exports, consistent formatting, and a future-proof workflow that supports both lightweight client apps and enterprise-grade server deployments.&lt;/p&gt;

&lt;h2&gt;
  
  
  The real problem with document export in React apps
&lt;/h2&gt;

&lt;p&gt;If you’ve ever built a document heavy React app, you already know the pain.&lt;/p&gt;

&lt;p&gt;A document gets written once, but somehow needs to exist as a:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;DOCX&lt;/strong&gt; for editing,&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PDF&lt;/strong&gt; for approvals,&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Markdown&lt;/strong&gt; for internal docs,&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HTML&lt;/strong&gt; for publishing.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And the moment exporting isn’t built-in, everything slows down. Manual conversions might work once or twice, but they don’t scale. They introduce errors and waste time. People copy-paste content, use third-party converters, or redo the same work in multiple tools. Formatting breaks. Layouts shift. Everyone gets frustrated.&lt;/p&gt;

&lt;p&gt;What you really need is &lt;strong&gt;one editor&lt;/strong&gt; with &lt;strong&gt;multiple export options&lt;/strong&gt; , all handled in a clean, predictable way.&lt;/p&gt;

&lt;p&gt;This is exactly where the Syncfusion&lt;sup&gt;®&lt;/sup&gt; &lt;a href="https://www.syncfusion.com/docx-editor-sdk/react-docx-editor" rel="noopener noreferrer"&gt;React DOCX Editor&lt;/a&gt; changes the game.&lt;/p&gt;

&lt;h2&gt;
  
  
  Advanced export options in React DOCX Editor
&lt;/h2&gt;

&lt;p&gt;The Syncfusion React DOCX Editor supports a flexible, unified document export experience across teams and platforms. It uses fast, in‑browser exports for common formats and a server‑side Web API for formats that need higher accuracy.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Client‑side speed with server‑side reliability.&lt;/li&gt;
&lt;li&gt;Export modern and legacy formats from one editor.&lt;/li&gt;
&lt;li&gt;Consistent formatting across outputs.&lt;/li&gt;
&lt;li&gt;Suitable for both lightweight and enterprise apps.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This hybrid approach delivers efficient exports without compromising quality.&lt;/p&gt;

&lt;h3&gt;
  
  
  Client-side exporting (Instant, no server)
&lt;/h3&gt;

&lt;p&gt;For everyday use cases, exporting directly from the React app is often enough, with no server involved.&lt;/p&gt;

&lt;p&gt;You can export to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SFDT&lt;/strong&gt;: For drafts, autosave, and round-trip editing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DOCX&lt;/strong&gt;: Share editable files via Microsoft Word or Google Docs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DOTX&lt;/strong&gt;: Use templates to maintain consistent branding and styles.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TXT&lt;/strong&gt;: Export plain text for tickets, wikis, or simple tools.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Server-side exporting (Heavy lifting, perfect output)
&lt;/h3&gt;

&lt;p&gt;Some formats need extra processing, especially when layout, pagination, or print quality matter. That’s where the &lt;strong&gt;server-side Web API&lt;/strong&gt; comes in.&lt;/p&gt;

&lt;p&gt;Using it, you can export to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;PDF&lt;/strong&gt;: For finalized documents, printing, or e-signature.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HTML&lt;/strong&gt;: Publish to web portals or embed in apps.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RTF&lt;/strong&gt;: For compatibility with rich text editors.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Markdown&lt;/strong&gt;: Ideal for developer docs and wikis.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ODT&lt;/strong&gt;: A widely supported open format for cross-platform use.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WordML&lt;/strong&gt;: Useful for XML-based workflows and systems that require structured document data.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let’s build a React DOCX Editor and integrate both client-side and server-side export options. By the end, you’ll have a production-ready workflow for seamless document-sharing across formats and platforms.&lt;/p&gt;

&lt;h2&gt;
  
  
  Server-side export setup for React DOCX Editor
&lt;/h2&gt;

&lt;p&gt;Follow these steps to set up a server-side Web API that enables exporting documents from the Syncfusion React DOCX Editor to formats like PDF, HTML, RTF, Markdown, and ODT.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Create a new ASP.NET Core Web API project
&lt;/h3&gt;

&lt;p&gt;First, create a new &lt;a href="https://help.syncfusion.com/extension/aspnetcore-essentialjs2-extension/visual-studio/syncfusion-project-templates" rel="noopener noreferrer"&gt;ASP.NET Core Web API&lt;/a&gt; project using your preferred development environment or the .NET CLI.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Add the required NuGet packages
&lt;/h3&gt;

&lt;p&gt;Then, install the following NuGet packages to enable document import and export functionalities:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.nuget.org/packages/Syncfusion.EJ2.WordEditor.AspNet.Core/" rel="noopener noreferrer"&gt;Syncfusion.EJ2.WordEditor.AspNet.Core&lt;/a&gt;: Provides a server-side support for handling SFDT content from the Document Editor.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.nuget.org/packages/Syncfusion.DocIORenderer.Net.Core/" rel="noopener noreferrer"&gt;Syncfusion.DocIORenderer.Net.Core&lt;/a&gt;: Converts Word documents to formats like PDF, HTML, RTF, Markdown, ODT, and WordML.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 3: Define export endpoints in the controller
&lt;/h3&gt;

&lt;p&gt;Add a controller named &lt;a href="https://github.com/SyncfusionExamples/React-Word-Editor-advanced-export-options/blob/master/ServerSide/Controllers/DocumentEditorController.cs#L314" rel="noopener noreferrer"&gt;DocumentEditorController.cs&lt;/a&gt; to handle export requests. Include endpoint logic to process SFDT input and return converted documents.&lt;/p&gt;

&lt;p&gt;Here’s how you can do it in code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;AcceptVerbs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Post"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;HttpPost&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;EnableCors&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"AllowAllOrigins"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;Route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Export"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;FileStreamResult&lt;/span&gt; &lt;span class="nf"&gt;Export&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;FromBody&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;SaveParameter&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;fileName&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FileName&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;format&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;RetrieveFileType&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;IsNullOrEmpty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Format&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="n"&gt;fileName&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Format&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;IsNullOrEmpty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fileName&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;fileName&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Document1.docx"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;WDocument&lt;/span&gt; &lt;span class="n"&gt;document&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToLower&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="s"&gt;".pdf"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Stream&lt;/span&gt; &lt;span class="n"&gt;stream&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;WordDocument&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Content&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;FormatType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Docx&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;document&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Syncfusion&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DocIO&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DLS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WordDocument&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Syncfusion&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DocIO&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FormatType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Docx&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;document&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;WordDocument&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Content&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;SaveDocument&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;document&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fileName&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nf"&gt;RetrieveFileType&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;LastIndexOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sc"&gt;'.'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;format&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="p"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Length&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
        &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Substring&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;".doc"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="n"&gt;FileStreamResult&lt;/span&gt; &lt;span class="nf"&gt;SaveDocument&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;WDocument&lt;/span&gt; &lt;span class="n"&gt;document&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;fileName&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Stream&lt;/span&gt; &lt;span class="n"&gt;stream&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;MemoryStream&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;contentType&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToLower&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="s"&gt;".pdf"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;contentType&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"application/pdf"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;DocIORenderer&lt;/span&gt; &lt;span class="n"&gt;render&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;DocIORenderer&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;PdfDocument&lt;/span&gt; &lt;span class="n"&gt;pdfDocument&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;render&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ConvertToPDF&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;document&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;stream&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;MemoryStream&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;pdfDocument&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;pdfDocument&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Close&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;WFormatType&lt;/span&gt; &lt;span class="n"&gt;type&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;GetWFormatType&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;switch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;WFormatType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Rtf&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;contentType&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"application/rtf"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;WFormatType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WordML&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;contentType&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"application/xml"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;WFormatType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Html&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;contentType&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"application/html"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;WFormatType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Dotx&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;contentType&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"application/vnd.openxmlformats-officedocument.wordprocessingml.template"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;WFormatType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Docx&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;contentType&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"application/vnd.openxmlformats-officedocument.wordprocessingml.document"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;WFormatType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Doc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;contentType&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"application/msword"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;WFormatType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Dot&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;contentType&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"application/msword"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;WFormatType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Odt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;contentType&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"application/vnd.oasis.opendocument.text"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;WFormatType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Markdown&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;contentType&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"text/markdown"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="n"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Close&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Position&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;FileStreamResult&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;contentType&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;FileDownloadName&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fileName&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;internal&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="n"&gt;WFormatType&lt;/span&gt; &lt;span class="nf"&gt;GetWFormatType&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;IsNullOrEmpty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;NotSupportedException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"EJ2 Document Editor does not support this file format."&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;switch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToLower&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s"&gt;".dotx"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;WFormatType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Dotx&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s"&gt;".docx"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;WFormatType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Docx&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s"&gt;".docm"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;WFormatType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Docm&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s"&gt;".dotm"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;WFormatType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Dotm&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s"&gt;".dot"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;WFormatType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Dot&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s"&gt;".doc"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;WFormatType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Doc&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s"&gt;".rtf"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;WFormatType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Rtf&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s"&gt;".txt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;WFormatType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Txt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s"&gt;".xml"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;WFormatType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WordML&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s"&gt;".odt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;WFormatType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Odt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s"&gt;".html"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;WFormatType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Html&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s"&gt;".md"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;WFormatType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Markdown&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;NotSupportedException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"EJ2 Document Editor does not support this file format."&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 4: Run the web API
&lt;/h3&gt;

&lt;p&gt;Build and run the web API locally to verify that the export endpoints are working as expected.&lt;/p&gt;

&lt;h2&gt;
  
  
  Client-side setup: Create a React DOCX Editor
&lt;/h2&gt;

&lt;p&gt;Once your server-side export API is up and running, you can move on to building the client-side React app using the Syncfusion React Document Editor.&lt;/p&gt;

&lt;p&gt;It allows users to view, edit, and export Word documents directly in the browser without relying on external plugins.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Create a new React app
&lt;/h3&gt;

&lt;p&gt;First, create a new &lt;a href="https://ej2.syncfusion.com/react/documentation/getting-started/create-app" rel="noopener noreferrer"&gt;React project&lt;/a&gt; on the local machine.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Install the Syncfusion React Document Editor
&lt;/h3&gt;

&lt;p&gt;Now, install the Syncfusion React DOCX Editor &lt;a href="https://www.npmjs.com/~syncfusionorg" rel="noopener noreferrer"&gt;NPM&lt;/a&gt; package.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; @syncfusion/ej2-react-documenteditor &lt;span class="nt"&gt;--save&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 3: Import the required styles
&lt;/h3&gt;

&lt;p&gt;To ensure proper styling, import the necessary CSS styles in your &lt;strong&gt;&lt;code&gt;App.css&lt;/code&gt;&lt;/strong&gt;  or &lt;code&gt;index.css&lt;/code&gt; file.&lt;/p&gt;

&lt;p&gt;Here’s the code you need:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="k"&gt;@import&lt;/span&gt; &lt;span class="s2"&gt;'../node_modules/@syncfusion/ej2-base/styles/material.css'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;@import&lt;/span&gt; &lt;span class="s2"&gt;'../node_modules/@syncfusion/ej2-buttons/styles/material.css'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;@import&lt;/span&gt; &lt;span class="s2"&gt;'../node_modules/@syncfusion/ej2-inputs/styles/material.css'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;@import&lt;/span&gt; &lt;span class="s2"&gt;'../node_modules/@syncfusion/ej2-popups/styles/material.css'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;@import&lt;/span&gt; &lt;span class="s2"&gt;'../node_modules/@syncfusion/ej2-lists/styles/material.css'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;@import&lt;/span&gt; &lt;span class="s2"&gt;'../node_modules/@syncfusion/ej2-navigations/styles/material.css'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;@import&lt;/span&gt; &lt;span class="s2"&gt;'../node_modules/@syncfusion/ej2-splitbuttons/styles/material.css'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;@import&lt;/span&gt; &lt;span class="s2"&gt;'../node_modules/@syncfusion/ej2-dropdowns/styles/material.css'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;@import&lt;/span&gt; &lt;span class="s2"&gt;'../node_modules/@syncfusion/ej2-documenteditor/styles/material.css'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 4: Integrate the React DOCX Editor with advanced export options
&lt;/h3&gt;

&lt;p&gt;Now, create the &lt;a href="https://github.com/SyncfusionExamples/React-Word-Editor-advanced-export-options/blob/master/ClientSide/src/Exporting.js#L1" rel="noopener noreferrer"&gt;Exporting.js&lt;/a&gt; file in the&lt;code&gt;src&lt;/code&gt; folder to render the DOCX Editor and configure the advanced export options using the Web API.&lt;/p&gt;

&lt;p&gt;Code example for quick integration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;import&lt;/span&gt; &lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;react&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;useRef&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;react&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;DocumentEditorContainerComponent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Ribbon&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;@syncfusion&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ej2&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;react&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;documenteditor&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;import&lt;/span&gt; &lt;span class="s"&gt;"./index.css"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="n"&gt;DocumentEditorContainerComponent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Inject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Ribbon&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Add the Service URL for server-dependent features&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;hostUrl&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"http://localhost:5257/api/documenteditor/"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Exporting&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;container&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useRef&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;defaultSFDT&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s"&gt;"sections"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;
            &lt;span class="s"&gt;"blocks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;
                &lt;span class="s"&gt;"inlines"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;
                    &lt;span class="s"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"Welcome to Syncfusion Document Editor!"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="s"&gt;"characterFormat"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                        &lt;span class="s"&gt;"bold"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                        &lt;span class="s"&gt;"fontSize"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;14&lt;/span&gt;
                    &lt;span class="p"&gt;}&lt;/span&gt;
                &lt;span class="p"&gt;}]&lt;/span&gt;
            &lt;span class="p"&gt;}]&lt;/span&gt;
        &lt;span class="p"&gt;}]&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;container&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;current&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;container&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;current&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;documentEditor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;defaultSFDT&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="n"&gt;container&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;current&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;documentEditor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;documentName&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;Getting&lt;/span&gt; &lt;span class="n"&gt;Started&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="n"&gt;container&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;current&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;documentEditor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;focusIn&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[]);&lt;/span&gt;

    &lt;span class="c1"&gt;// Ribbon File tab Export menu&lt;/span&gt;
    &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;ribbonExportItems&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;Word&lt;/span&gt; &lt;span class="nf"&gt;Document&lt;/span&gt; &lt;span class="p"&gt;(*.&lt;/span&gt;&lt;span class="n"&gt;docx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;docx&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;Syncfusion&lt;/span&gt; &lt;span class="n"&gt;Document&lt;/span&gt; &lt;span class="nf"&gt;Text&lt;/span&gt; &lt;span class="p"&gt;(*.&lt;/span&gt;&lt;span class="n"&gt;sfdt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;sfdt&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;Plain&lt;/span&gt; &lt;span class="nf"&gt;Text&lt;/span&gt; &lt;span class="p"&gt;(*.&lt;/span&gt;&lt;span class="n"&gt;txt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;Word&lt;/span&gt; &lt;span class="nf"&gt;Template&lt;/span&gt; &lt;span class="p"&gt;(*.&lt;/span&gt;&lt;span class="n"&gt;dotx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;dotx&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="nf"&gt;PDF&lt;/span&gt; &lt;span class="p"&gt;(*.&lt;/span&gt;&lt;span class="n"&gt;pdf&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;pdf&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;HyperText&lt;/span&gt; &lt;span class="n"&gt;Markup&lt;/span&gt; &lt;span class="nf"&gt;Language&lt;/span&gt; &lt;span class="p"&gt;(*.&lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;OpenDocument&lt;/span&gt; &lt;span class="nf"&gt;Text&lt;/span&gt; &lt;span class="p"&gt;(*.&lt;/span&gt;&lt;span class="n"&gt;odt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;odt&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="nf"&gt;Markdown&lt;/span&gt; &lt;span class="p"&gt;(*.&lt;/span&gt;&lt;span class="n"&gt;md&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;md&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;Rich&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt; &lt;span class="nf"&gt;Format&lt;/span&gt; &lt;span class="p"&gt;(*.&lt;/span&gt;&lt;span class="n"&gt;rtf&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;rtf&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;Word&lt;/span&gt; &lt;span class="n"&gt;XML&lt;/span&gt; &lt;span class="nf"&gt;Document&lt;/span&gt; &lt;span class="p"&gt;(*.&lt;/span&gt;&lt;span class="n"&gt;xml&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;wordml&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;];&lt;/span&gt;

    &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;fileMenuItems&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;New&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;Open&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;Export&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;export&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;iconCss&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;icons&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;export&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ribbonExportItems&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="err"&gt;‘&lt;/span&gt;&lt;span class="n"&gt;Print&lt;/span&gt;&lt;span class="err"&gt;’&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;];&lt;/span&gt;

    &lt;span class="c1"&gt;// Common export handler used by Ribbon menu&lt;/span&gt;
    &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;handleExportById&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;switch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;docx&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;container&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;current&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;documentEditor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;Sample&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;Docx&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;sfdt&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;container&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;current&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;documentEditor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;Sample&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;Sfdt&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;container&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;current&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;documentEditor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;Sample&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;Txt&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;dotx&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;container&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;current&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;documentEditor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;Sample&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;Dotx&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;pdf&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="nf"&gt;formatSave&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;Pdf&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="nf"&gt;formatSave&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;Html&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;odt&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="nf"&gt;formatSave&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;Odt&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;md&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="nf"&gt;formatSave&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;Md&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;rtf&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="nf"&gt;formatSave&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;Rtf&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;wordml&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="nf"&gt;formatSave&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;Xml&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;

    &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;onFileMenuItemClick&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt; &lt;span class="p"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="p"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="p"&gt;!==&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;export&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="nf"&gt;handleExportById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;

    &lt;span class="n"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;formatSave&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;format&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;container&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;current&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;documentEditor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;serviceUrl&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;Export&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;fileName&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;container&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;current&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;documentEditor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;documentName&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;XMLHttpRequest&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;POST&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setRequestHeader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;Content&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Type&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;application&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;charset&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="n"&gt;UTF&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="m"&gt;8&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;responseType&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;blob&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;sfdt&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;Content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;container&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;current&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;documentEditor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;serialize&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="n"&gt;Filename&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;fileName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;Format&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sc"&gt;'.'&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="n"&gt;format&lt;/span&gt;
        &lt;span class="p"&gt;};&lt;/span&gt;

        &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;onload&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;function&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="p"&gt;===&lt;/span&gt; &lt;span class="m"&gt;200&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;responseData&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;blobUrl&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createObjectURL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;responseData&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;downloadLink&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sc"&gt;'a'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                &lt;span class="n"&gt;downloadLink&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;href&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;blobUrl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="n"&gt;downloadLink&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;download&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fileName&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="sc"&gt;'.'&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toLowerCase&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
                &lt;span class="n"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;appendChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;downloadLink&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                &lt;span class="n"&gt;downloadLink&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;click&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
                &lt;span class="n"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;removeChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;downloadLink&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                &lt;span class="n"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;revokeObjectURL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;blobUrl&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;Request&lt;/span&gt; &lt;span class="n"&gt;failed&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;};&lt;/span&gt;

        &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sfdt&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;div&lt;/span&gt; &lt;span class="n"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"control-pane"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;div&lt;/span&gt; &lt;span class="n"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"control-section"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;div&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"documenteditor_container_body"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;DocumentEditorContainerComponent&lt;/span&gt;
                        &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"container"&lt;/span&gt;
                        &lt;span class="k"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;={&lt;/span&gt;&lt;span class="n"&gt;container&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
                        &lt;span class="n"&gt;style&lt;/span&gt;&lt;span class="p"&gt;={{&lt;/span&gt; &lt;span class="n"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}}&lt;/span&gt;
                        &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;={&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="m"&gt;690&lt;/span&gt;&lt;span class="n"&gt;px&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
                        &lt;span class="n"&gt;toolbarMode&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Ribbon"&lt;/span&gt;
                        &lt;span class="n"&gt;ribbonLayout&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Classic"&lt;/span&gt;
                        &lt;span class="n"&gt;serviceUrl&lt;/span&gt;&lt;span class="p"&gt;={&lt;/span&gt;&lt;span class="n"&gt;hostUrl&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
                        &lt;span class="n"&gt;enableToolbar&lt;/span&gt;&lt;span class="p"&gt;={&lt;/span&gt;&lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
                        &lt;span class="n"&gt;locale&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"en-US"&lt;/span&gt;
                        &lt;span class="n"&gt;fileMenuItems&lt;/span&gt;&lt;span class="p"&gt;={&lt;/span&gt;&lt;span class="n"&gt;fileMenuItems&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
                        &lt;span class="n"&gt;fileMenuItemClick&lt;/span&gt;&lt;span class="p"&gt;={&lt;/span&gt;&lt;span class="n"&gt;onFileMenuItemClick&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
                    &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
                &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="n"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="n"&gt;Exporting&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 5: Launch the application
&lt;/h3&gt;

&lt;p&gt;To see the React DOCX Editor in action:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Start your Web API service.&lt;/li&gt;
&lt;li&gt;Then, run your React app using the following command.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This article was originally published at &lt;a href="https://www.syncfusion.com/blogs/post/advanced-export-in-react-docx-editor" rel="noopener noreferrer"&gt;Syncfusion.com.&lt;/a&gt;&lt;/p&gt;

</description>
      <category>word</category>
      <category>documentprocessing</category>
      <category>fileformats</category>
      <category>react</category>
    </item>
    <item>
      <title>Angular Material or PrimeNG? Choosing the Right UI Library in 2026</title>
      <dc:creator>Calvince Moth</dc:creator>
      <pubDate>Tue, 14 Apr 2026 11:05:11 +0000</pubDate>
      <link>https://forem.com/syncfusion/angular-material-or-primeng-choosing-the-right-ui-library-in-2026-59mj</link>
      <guid>https://forem.com/syncfusion/angular-material-or-primeng-choosing-the-right-ui-library-in-2026-59mj</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Choosing between Angular Material and PrimeNG in 2026 is really about where you want to pay the cost in production. Angular Material favors predictable UX, strong accessibility defaults, and seamless SSR alignment, making it a solid choice for product and SaaS applications. PrimeNG, on the other hand, accelerates the delivery of data-heavy dashboards by providing enterprise-ready data tables, charts, and hierarchical components out of the box without weeks of custom CDK work.&lt;/p&gt;

&lt;p&gt;Every Angular team building for production eventually faces the same crossroads: &lt;strong&gt;Angular Material or PrimeNG?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The answer has never been about which library has more stars on GitHub or which blog post ranks higher. It is about understanding what your application actually demands, and what it will demand two years from now when your codebase has tripled in size, and your team has doubled.&lt;/p&gt;

&lt;p&gt;If you are researching any of the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Angular Material vs PrimeNG&lt;/li&gt;
&lt;li&gt;Best Angular UI library in 2026&lt;/li&gt;
&lt;li&gt;PrimeNG vs Angular Material for enterprise apps&lt;/li&gt;
&lt;li&gt;Which Angular component library should I choose?&lt;/li&gt;
&lt;li&gt;Angular Material or PrimeNG for dashboards?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This guide is for production teams shipping real software, not weekend demos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick decision summary (2026)
&lt;/h2&gt;

&lt;p&gt;Before diving into the details, here is a straightforward recommendation table for teams that need an answer now:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;If You Are Building…&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Recommended Library&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Why&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Clean SaaS product UI&lt;/td&gt;
&lt;td&gt;Angular Material&lt;/td&gt;
&lt;td&gt;Predictable UI, official Angular alignment, and clean design tokens.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Government/compliance app&lt;/td&gt;
&lt;td&gt;Angular Material&lt;/td&gt;
&lt;td&gt;Strongest accessibility defaults and lower compliance risk.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Material Design-aligned app&lt;/td&gt;
&lt;td&gt;Angular Material&lt;/td&gt;
&lt;td&gt;Native implementation of Google’s Material Design spec.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Enterprise admin dashboard&lt;/td&gt;
&lt;td&gt;PrimeNG&lt;/td&gt;
&lt;td&gt;Advanced DataTable, charting, and tree hierarchies out of the box.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data-heavy analytics system&lt;/td&gt;
&lt;td&gt;PrimeNG&lt;/td&gt;
&lt;td&gt;Virtual scrolling, lazy loading, aggregation, and export are built in.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Custom-branded UI system&lt;/td&gt;
&lt;td&gt;PrimeNG&lt;/td&gt;
&lt;td&gt;Flexible theming engine, not locked to Material Design aesthetic.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If your situation is more nuanced, read on. The rest of this guide exists precisely for cases where a simple table is not enough.&lt;/p&gt;

&lt;h2&gt;
  
  
  What changed in Angular UI architecture by 2026?
&lt;/h2&gt;

&lt;p&gt;The Angular ecosystem in 2026 looks fundamentally different from the Angular of two years ago. These shifts directly affect how you should evaluate UI libraries.&lt;/p&gt;

&lt;h3&gt;
  
  
  Standalone components are the default
&lt;/h3&gt;

&lt;p&gt;NgModules are no longer the primary unit of composition. Standalone components, directives, and pipes are now the default project scaffolding. Any UI library that still forces you to import heavyweight module bundles introduces friction in modern Angular architectures. Both Angular Material and PrimeNG have adapted, but the degree of adaptation matters when structuring a large application with fine-grained lazy-loading boundaries.&lt;/p&gt;

&lt;h3&gt;
  
  
  SSR is no longer optional
&lt;/h3&gt;

&lt;p&gt;With Angular’s built-in hydration and improved Universal support, server-side rendering has moved from a “nice to have” to a baseline requirement for public-facing applications. UI libraries must render cleanly on the server, hydrate without layout shifts, and avoid browser-only API calls during the initial render pass. Libraries that rely heavily on window, document, or dynamic DOM measurement during initialization create SSR headaches that compound at scale.&lt;/p&gt;

&lt;h3&gt;
  
  
  Signal-based reactivity
&lt;/h3&gt;

&lt;p&gt;Angular’s signal-based reactivity model has matured. Components built with signals benefit from fine-grained change detection, but only if the UI library’s internal change detection strategy does not fight against it. Libraries that rely on &lt;code&gt;zone.js-triggered&lt;/code&gt; change detection or aggressive &lt;code&gt;markForCheck()&lt;/code&gt; calls can undermine the performance gains signals provide.&lt;/p&gt;

&lt;h3&gt;
  
  
  Accessibility is an audit requirement
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;WCAG&lt;/code&gt; compliance is no longer a checkbox for government contracts alone. Enterprise clients, SaaS buyers, and even internal tooling teams increasingly require accessibility audit reports. A UI library accessibility defaults ARIA roles, keyboard navigation, focus management, and screen reader announcements directly reduce or increase the cost of passing those audits.&lt;/p&gt;

&lt;h3&gt;
  
  
  Design systems govern at scale
&lt;/h3&gt;

&lt;p&gt;Large organizations no longer allow individual teams to pick colors and spacing values. Design tokens, governed design systems, and component libraries with strict visual contracts are standard practice. Your UI library must either &lt;em&gt;be&lt;/em&gt; your design system or integrate cleanly with one.&lt;/p&gt;

&lt;p&gt;A modern UI library must:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Support standalone components cleanly.&lt;/li&gt;
&lt;li&gt;Work with Angular’s signal-based pattern.&lt;/li&gt;
&lt;li&gt;Respect accessibility guidelines (&lt;code&gt;WCAG 2.2+&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Avoid unnecessary bundle bloat.&lt;/li&gt;
&lt;li&gt;Scale across large development teams.&lt;/li&gt;
&lt;li&gt;Provide enterprise-grade data components.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is where Angular Material and PrimeNG differ significantly.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Angular Material?
&lt;/h2&gt;

&lt;p&gt;Angular Material is the official UI component library maintained by the Angular team at Google. It is not a third-party add-on; it ships from the same team that builds the framework itself.&lt;/p&gt;

&lt;h3&gt;
  
  
  What it implements
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Google’s material design system&lt;/strong&gt;: The same design language used across Google’s own products.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Accessibility-first components&lt;/strong&gt;: ARIA roles, keyboard navigation, and focus management are built into the component architecture, not bolted on afterward.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Angular CDK (Component Dev Kit)&lt;/strong&gt;: A lower-level toolkit that provides behavioral primitives like overlays, drag-and-drop, virtual scrolling, and accessibility utilities. The CDK is arguably as valuable as the component library itself&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Strict design patterns&lt;/strong&gt;: Opinionated component APIs that enforce consistency.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Where Angular Material excels
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Official Angular ecosystem alignment:&lt;/strong&gt; When Angular introduces a new rendering strategy, a new change detection model, or a new build system, Angular Material is updated in lockstep. You never wait for a third-party maintainer to catch up with a breaking change.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Strong accessibility defaults:&lt;/strong&gt; Every component ships with correct &lt;code&gt;ARIA&lt;/code&gt; attributes, keyboard interaction patterns, and focus management. For teams building applications that must pass &lt;code&gt;WCAG 2.2 AA&lt;/code&gt; audits, this reduces remediation work significantly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Predictable UI behavior:&lt;/strong&gt; Because Angular Material is opinionated, two different developers on the same team will produce components that look and behave the same way. This consistency compounds over time in large codebases.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lighter footprint:&lt;/strong&gt; Angular Material’s component set is deliberately curated rather than exhaustive. This results in a leaner dependency tree and smaller production bundles when you are only importing what you use.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Excellent documentation:&lt;/strong&gt; API references, usage examples, and accessibility notes are thorough and consistently maintained.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Where Angular Material has limits
&lt;/h3&gt;

&lt;p&gt;Angular Material focuses on consistency and usability, not feature abundance. It does not ship with advanced data grids, charting, tree tables, or rich text editors. If your application needs those capabilities on day one, Angular Material expects you to build them using the &lt;code&gt;CDK&lt;/code&gt; or integrate third-party solutions.&lt;/p&gt;

&lt;p&gt;This is a deliberate design choice, not an oversight. Angular Material would rather ship fewer components that meet a high bar than ship many components of varying quality.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is PrimeNG?
&lt;/h2&gt;

&lt;p&gt;PrimeNG is a comprehensive Angular UI component suite built specifically for Angular applications by PrimeTek, the same company behind &lt;code&gt;PrimeFaces&lt;/code&gt; (JSF), &lt;code&gt;PrimeReact&lt;/code&gt;, and &lt;code&gt;PrimeVue&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  What it includes
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;80+ UI components&lt;/strong&gt;: From basic buttons and inputs to highly specialized components like organization charts, Gantt-style schedulers, and terminal emulators.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Advanced DataTable&lt;/strong&gt;: Arguably PrimeNG’s flagship component, with built-in sorting, filtering, pagination, column resizing, row grouping, cell editing, virtual scrolling, lazy loading, and export.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TreeTable&lt;/strong&gt;: Hierarchical data display with expand/collapse, selection, and filtering.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Charts&lt;/strong&gt;: Built-in charting powered by &lt;code&gt;Chart.js&lt;/code&gt; integration.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rich form components&lt;/strong&gt;: Multi-select, autocomplete, cascading dropdowns, color pickers, rating components, and editors.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multiple themes and layout systems&lt;/strong&gt;: Including a theme designer and pre-built application templates.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Where PrimeNG excels
&lt;/h3&gt;

&lt;p&gt;PrimeNG is built for &lt;strong&gt;enterprise-level application complexity&lt;/strong&gt;. When a product manager walks in and says, “I need a data grid that supports inline editing, multi-column sorting, row expansion with nested tables, CSV export, and server-side pagination by next sprint,” PrimeNG delivers that without custom engineering.&lt;/p&gt;

&lt;p&gt;The library’s breadth means teams spend less time building infrastructure components and more time building business logic. For organizations where time-to-feature matters more than pixel-perfect design consistency, PrimeNG’s value proposition is clear.&lt;/p&gt;

&lt;h3&gt;
  
  
  Where PrimeNG has trade-offs
&lt;/h3&gt;

&lt;p&gt;The comprehensive nature of PrimeNG comes with a larger API surface, more configuration options, and a bigger bundle footprint.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bigger API surface:&lt;/strong&gt;  More options means more ways to create inconsistency.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Potential bundle impact:&lt;/strong&gt; Feature-rich components can add weight if you import broadly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Accessibility consistency varies:&lt;/strong&gt; Generally solid, but some components may require more manual attention than Angular Material equivalents.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Core architectural difference
&lt;/h2&gt;

&lt;p&gt;This is the single most important distinction to understand:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Angular Material prioritizes design consistency.&lt;/li&gt;
&lt;li&gt;PrimeNG prioritizes feature completeness.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That philosophical difference cascades through every decision:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Dimension&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Angular Material&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;PrimeNG&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Component philosophy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Fewer components, higher consistency bar.&lt;/td&gt;
&lt;td&gt;More components and broader coverage.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Customization model&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Constrained by the design system.&lt;/td&gt;
&lt;td&gt;Flexible, sometimes at the cost of consistency.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Advanced features&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Build with CDK primitives.&lt;/td&gt;
&lt;td&gt;Ships out of the box.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;API surface&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Smaller and easier to learn.&lt;/td&gt;
&lt;td&gt;Larger, more powerful, steeper learning curve.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Design governance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Enforced by the library.&lt;/td&gt;
&lt;td&gt;Enforced by the team.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Neither approach is better. But choosing the wrong one for your context creates friction that compounds with every feature you ship.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real-world comparison (2026 production criteria)
&lt;/h2&gt;

&lt;p&gt;Here is a detailed comparison across the criteria that matter most in production:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Criteria&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Angular Material&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;PrimeNG&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Official Angular support&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes, maintained by the Angular team.&lt;/td&gt;
&lt;td&gt;No, third-party (PrimeTek).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Component volume&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Moderate (&lt;code&gt;~30&lt;/code&gt; components + &lt;code&gt;CDK&lt;/code&gt;).&lt;/td&gt;
&lt;td&gt;Extensive (&lt;code&gt;80+&lt;/code&gt; components).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Advanced DataTable&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Basic (CDK-powered, extensible)&lt;/td&gt;
&lt;td&gt;Enterprise-grade (built-in)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Built-in charts&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes (&lt;code&gt;Chart.js&lt;/code&gt; integration)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Tree &amp;amp; hierarchy components&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Limited&lt;/td&gt;
&lt;td&gt;Strong (Tree, TreeTable, OrgChart)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Theming flexibility&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Constrained (Material-based)&lt;/td&gt;
&lt;td&gt;Highly flexible (theme designer)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Accessibility defaults&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Strong (&lt;code&gt;WCAG 2.2 AA&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Good (varies by component)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Bundle size&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Smaller per-component&lt;/td&gt;
&lt;td&gt;Larger overall footprint&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Learning curve&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;Moderate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Enterprise dashboard readiness&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Moderate&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SSR compatibility&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Seamless (official support)&lt;/td&gt;
&lt;td&gt;Good (requires configuration care)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Signal-based patterns&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Early adopter&lt;/td&gt;
&lt;td&gt;Compatible&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Long-term upgrade path&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Tied to the Angular release cycle&lt;/td&gt;
&lt;td&gt;Independent release cycle&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Scenario-based evaluation
&lt;/h2&gt;

&lt;p&gt;Abstract comparisons only go so far. Let us look at two concrete application archetypes and evaluate which library serves each one better.&lt;/p&gt;

&lt;h3&gt;
  
  
  Scenario 1: Clean SaaS product UI
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Application profile:&lt;/strong&gt; A subscription-based B2B platform, project management tools, CRM dashboards, or internal workflow applications.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Typical features needed:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Forms with validation&lt;/li&gt;
&lt;li&gt;Dialogs and modals&lt;/li&gt;
&lt;li&gt;Tabs and steppers&lt;/li&gt;
&lt;li&gt;Side navigation and toolbars&lt;/li&gt;
&lt;li&gt;Simple data tables with sorting and pagination&lt;/li&gt;
&lt;li&gt;Role-based UI visibility&lt;/li&gt;
&lt;li&gt;Responsive layout&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Why Angular Material wins here
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Clean, consistent UI:&lt;/strong&gt; Every component follows Material Design’s spacing, typography, and interaction patterns. Designers and developers work from the same system, reducing design-to-code translation errors.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Official Angular support:&lt;/strong&gt; When Angular ships with a new rendering optimization, Angular Material supports it on day one. You never block a framework upgrade waiting for a UI library update.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Predictable component behavior:&lt;/strong&gt; Angular Material’s opinionated APIs mean there are fewer ways to misuse a component. A mat-select behaves the same way regardless of which developer implemented it. In a SaaS codebase maintained by rotating team members, this predictability is worth more than raw feature count.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Easier long-term refactoring:&lt;/strong&gt; A smaller API surface means less configuration to migrate during upgrades. Angular Material’s schematics handle most breaking changes automatically.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Strong accessibility defaults:&lt;/strong&gt; SaaS products increasingly need to pass accessibility audits to meet the needs of enterprise buyers. Angular Material’s built-in ARIA support reduces the cost of compliance.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For product-focused teams building subscription platforms or internal tools, Angular Material keeps the UI disciplined and lightweight.&lt;/p&gt;

&lt;h3&gt;
  
  
  Scenario 2: Enterprise admin dashboard
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Application profile:&lt;/strong&gt; An internal operations platform for a large organization, supply chain management, financial reporting, or analytics dashboards.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Typical features needed:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Advanced filtering across multiple data dimensions.&lt;/li&gt;
&lt;li&gt;Lazy-loaded data grids with thousands of rows.&lt;/li&gt;
&lt;li&gt;Multi-column sorting and grouping.&lt;/li&gt;
&lt;li&gt;Tree hierarchies for organizational or category data.&lt;/li&gt;
&lt;li&gt;Chart visualizations (bar, line, pie, mixed).&lt;/li&gt;
&lt;li&gt;Complex reports with drill-down.&lt;/li&gt;
&lt;li&gt;CSV/Excel export.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Why PrimeNG wins &lt;strong&gt;here&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;PrimeNG’s DataTable is purpose-built for this &lt;strong&gt;.&lt;/strong&gt; Out of the box, it provides:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Multi-column sorting&lt;/li&gt;
&lt;li&gt;Column resizing and reordering&lt;/li&gt;
&lt;li&gt;Server-side and client-side pagination&lt;/li&gt;
&lt;li&gt;Virtual scrolling for large datasets&lt;/li&gt;
&lt;li&gt;Row grouping and expansion&lt;/li&gt;
&lt;li&gt;Lazy loading with backend integration hooks&lt;/li&gt;
&lt;li&gt;Built-in export to CSV and Excel&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Angular Material’s table is flexible and CDK-powered, but achieving the same feature set requires significant custom development. You would need to build column resizing, row grouping, and export functionality yourself, or integrate additional third-party libraries.&lt;/p&gt;

&lt;p&gt;For analytics-heavy dashboards, &lt;code&gt;PrimeNG&lt;/code&gt; clearly provides more out-of-the-box power and saves weeks of custom development.&lt;/p&gt;

&lt;h2&gt;
  
  
  Deep-dive: Data Grid capability
&lt;/h2&gt;

&lt;p&gt;Data grids are often the deciding factor in library selection. If your application revolves around tabular data, this section matters more than anything else in this article.&lt;/p&gt;

&lt;h3&gt;
  
  
  Angular Material table
&lt;/h3&gt;

&lt;p&gt;Angular Material’s table component is built on the CDK’s table foundation. It is clean, structured, and deliberately minimal:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Declarative column definitions using &lt;code&gt;matColumnDef&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Sorting via &lt;code&gt;matSort&lt;/code&gt; directive&lt;/li&gt;
&lt;li&gt;Pagination via &lt;code&gt;matPaginator&lt;/code&gt; component&lt;/li&gt;
&lt;li&gt;No built-in filtering UI (you build your own)&lt;/li&gt;
&lt;li&gt;No built-in column resizing&lt;/li&gt;
&lt;li&gt;No built-in row grouping&lt;/li&gt;
&lt;li&gt;No built-in export&lt;/li&gt;
&lt;li&gt;Virtual scrolling available via CDK &lt;code&gt;cdk-virtual-scroll-viewport&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Angular Material table is a toolkit, not a finished data grid. It handles basic sorting and pagination well, but advanced scenarios require custom development.&lt;/p&gt;

&lt;h3&gt;
  
  
  PrimeNG DataTable
&lt;/h3&gt;

&lt;p&gt;PrimeNG’s DataTable is a feature-complete data grid component designed for production use:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Built-in column filtering with multiple match modes (contains, equals, starts with, custom)&lt;/li&gt;
&lt;li&gt;Multi-column sorting with priority ordering&lt;/li&gt;
&lt;li&gt;Column resizing (fit and expand modes)&lt;/li&gt;
&lt;li&gt;Column reordering via drag-and-drop&lt;/li&gt;
&lt;li&gt;Row grouping with subheaders and footers&lt;/li&gt;
&lt;li&gt;Row expansion with nested content templates&lt;/li&gt;
&lt;li&gt;Inline cell editing and row editing&lt;/li&gt;
&lt;li&gt;Server-side lazy loading with event callbacks&lt;/li&gt;
&lt;li&gt;Virtual scrolling with configurable row height&lt;/li&gt;
&lt;li&gt;Selection (single, multiple, checkbox)&lt;/li&gt;
&lt;li&gt;Context menus&lt;/li&gt;
&lt;li&gt;CSV and Excel export&lt;/li&gt;
&lt;li&gt;Column toggling and frozen columns&lt;/li&gt;
&lt;li&gt;Aggregation footers (sum, average, count)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The PrimeNG DataTable is a finished product. Configure it, bind your data, and it works. For teams that need advanced data grid capabilities without spending sprints building them, PrimeNG’s DataTable is a strong argument for choosing the library.&lt;/p&gt;

&lt;h3&gt;
  
  
  The verdict on Data Grids
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;If grids are core to your product&lt;/strong&gt;: PrimeNG saves significant engineering time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;If tables are simple&lt;/strong&gt;: Angular Material stays lean and predictable.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This article was originally published at &lt;a href="https://www.syncfusion.com/blogs/post/angular-material-vs-primeng" rel="noopener noreferrer"&gt;Syncfusion.com.&lt;/a&gt;&lt;/p&gt;

</description>
      <category>angular</category>
      <category>angularcomponentlibrary</category>
      <category>angularmaterial</category>
      <category>angularuicomponents</category>
    </item>
    <item>
      <title>Build an AI Content Creation App in Blazor with AI AssistView</title>
      <dc:creator>Calvince Moth</dc:creator>
      <pubDate>Mon, 13 Apr 2026 12:01:28 +0000</pubDate>
      <link>https://forem.com/syncfusion/build-an-ai-content-creation-app-in-blazor-with-ai-assistview-30mc</link>
      <guid>https://forem.com/syncfusion/build-an-ai-content-creation-app-in-blazor-with-ai-assistview-30mc</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Build an AI-assisted content creation app in Blazor using Syncfusion AI AssistView as the chat surface. Add Blog/KB modes with different system instructions, suggestions, and output templates, then layer in file attachments, speech-to-text, and text-to-speech via JS interop.&lt;/p&gt;

&lt;p&gt;If you’ve ever tried to use a single “write me content” prompt for everything, you’ve seen the problem: blog drafts turn into support docs, and KB articles start reading like marketing copy. The UI is fine, the instructions and structure are what break down.&lt;/p&gt;

&lt;p&gt;In this walkthrough, you’ll build a small Blazor Web App (.NET 10) that uses the &lt;a href="https://www.syncfusion.com/blazor-components/blazor-ai-assistview" rel="noopener noreferrer"&gt;Syncfusion &lt;strong&gt;&lt;sup&gt;®&lt;/sup&gt;&lt;/strong&gt; Blazor AI AssistView&lt;/a&gt; component as the chat surface and routes requests through a mode-aware prompt builder so your output stays &lt;strong&gt;Blog&lt;/strong&gt; or &lt;strong&gt;Knowledge Base&lt;/strong&gt; consistently.&lt;/p&gt;

&lt;p&gt;Before getting started with this implementation, make sure you’re familiar with the baseline setup (Syncfusion packages and AssistView rendering) described in the official &lt;a href="https://blazor.syncfusion.com/documentation/ai-assistview/getting-started-webapp" rel="noopener noreferrer"&gt;documentation&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What’s new in the content creation app
&lt;/h2&gt;

&lt;p&gt;Here’s what we’re adding on top of the getting-started baseline:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Blog vs KB modes&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Blogs and KB articles have different success criteria. The mode switch lets you make those differences explicit, so the model stops guessing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Mode-aware prompting&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Instead of sending &lt;code&gt;args.Prompt&lt;/code&gt; directly, we’ll build a final prompt that includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;shared rules (markdown, accuracy, etc.)&lt;/li&gt;
&lt;li&gt;a mode-specific output template&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is the part that typically improves consistency the most.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Real workflow features&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Attachments&lt;/strong&gt;: bring your own reference doc/log/draft.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Speech-to-text&lt;/strong&gt;: capture ideas faster.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Text-to-speech&lt;/strong&gt;: review long output hands-free.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clear prompts&lt;/strong&gt;: reset and start a fresh session.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How it works (architecture in one minute)
&lt;/h2&gt;

&lt;p&gt;The pattern is simple and scales well:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;UI (&lt;code&gt;AI AssistView&lt;/code&gt;) collects the user prompt.&lt;/li&gt;
&lt;li&gt;A mode selector (Blog vs KB) chooses a configuration:

&lt;ul&gt;
&lt;li&gt;system instruction (high-level role + constraints)&lt;/li&gt;
&lt;li&gt;prompt suggestions (starter prompts that match the mode)&lt;/li&gt;
&lt;li&gt;output template (the structure you want back)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Your &lt;a href="https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.InteractiveChat.SfAIAssistView.html#Syncfusion_Blazor_InteractiveChat_SfAIAssistView_PromptRequested" rel="noopener noreferrer"&gt;PromptRequested&lt;/a&gt; handler builds a final prompt:

&lt;ul&gt;
&lt;li&gt;shared rules (Markdown, accuracy)&lt;/li&gt;
&lt;li&gt;mode template (Blog vs KB outline)&lt;/li&gt;
&lt;li&gt;user request&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;You call Gemini (or any model) and return the response via &lt;a href="https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.InteractiveChat.SfAIAssistView.html#Syncfusion_Blazor_InteractiveChat_SfAIAssistView_UpdateResponseAsync_System_String_" rel="noopener noreferrer"&gt;UpdateResponseAsync&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is a practical midpoint between raw chat and a full workflow engine.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F04%2FAfter-selecting-a-prompt-from-the-prompt-suggestions.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F04%2FAfter-selecting-a-prompt-from-the-prompt-suggestions.png" alt="&amp;lt;alt-text&amp;gt;" width="800" height="395"&gt;&lt;/a&gt;&lt;br&gt;After selecting a prompt from the prompt suggestions
  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F04%2FAfter-scrolling-through-the-end-of-the-AI-response-output.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F04%2FAfter-scrolling-through-the-end-of-the-AI-response-output.png" alt="&amp;lt;alt-text&amp;gt;" width="800" height="391"&gt;&lt;/a&gt;&lt;br&gt;After scrolling through the end of the AI response output
  &lt;/p&gt;

&lt;p&gt;That gives you a working AssistView UI. But if you keep one generic instruction and one mixed-suggestion list, users will get an inconsistent output structure. The rest of this post is about fixing that by making &lt;code&gt;mode&lt;/code&gt; a first-class concept.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://dotnet.microsoft.com/en-us/download/dotnet/10.0" rel="noopener noreferrer"&gt;.NET 10 SDK&lt;/a&gt; (or your target SDK)&lt;/li&gt;
&lt;li&gt;A Blazor Web App with Syncfusion Blazor configured&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/googleapis/dotnet-genai" rel="noopener noreferrer"&gt;Google.GenAI&lt;/a&gt; configured with an API key (&lt;a href="https://blazor.syncfusion.com/documentation/ai-assistview/ai-integrations/gemini-integration" rel="noopener noreferrer"&gt;Gemini&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Browser permission for microphone + speech synthesis (for voice features)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With the groundwork in place, let’s dive into the step‑by‑step implementation&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Add a Blog/KB mode model
&lt;/h3&gt;

&lt;p&gt;Create a mode enum and a config object:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;enum&lt;/span&gt; &lt;span class="n"&gt;ContentMode&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Blog&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;KnowledgeBase&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;sealed&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ModeConfig&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;required&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;DisplayName&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;init&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;required&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;SystemInstruction&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;init&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;required&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Suggestions&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;init&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then define your mode configs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="n"&gt;ContentMode&lt;/span&gt; &lt;span class="n"&gt;mode&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ContentMode&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Blog&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="n"&gt;Dictionary&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;ContentMode&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ModeConfig&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;modes&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ContentMode&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Blog&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;ModeConfig&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;DisplayName&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Blog"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;SystemInstruction&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;@"You are an expert content creator. Generate a developer blog post with clear headings, short paragraphs, and actionable steps. End with 8 FAQs."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;Suggestions&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="s"&gt;"Generate a blog post outline on sustainable energy."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s"&gt;"Create a draft blog introduction about Blazor development."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s"&gt;"Suggest SEO keywords for a tech blog on AI."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s"&gt;"Rewrite this section to be more concise."&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ContentMode&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;KnowledgeBase&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;ModeConfig&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;DisplayName&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"KB"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;SystemInstruction&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;@"You are an expert support writer. Generate a developer knowledge base article with Summary, Environment, Symptoms, Resolution steps, and Troubleshooting. End with 8 FAQs."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;Suggestions&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="s"&gt;"Write a KB article on troubleshooting network issues."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s"&gt;"Draft a KB: 'App fails to start' with resolution steps."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s"&gt;"Create a troubleshooting checklist for intermittent timeouts."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s"&gt;"Summarize the likely root causes and next diagnostics."&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="n"&gt;ModeConfig&lt;/span&gt; &lt;span class="n"&gt;CurrentMode&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;modes&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2: Wire mode suggestions into AI AssistView
&lt;/h3&gt;

&lt;p&gt;Point &lt;code&gt;AssistView&lt;/code&gt; at the current mode’s prompt suggestion list:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;SfAIAssistView&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;ref=&lt;/span&gt;&lt;span class="s"&gt;"assistView"&lt;/span&gt;
                &lt;span class="na"&gt;PromptSuggestions=&lt;/span&gt;&lt;span class="s"&gt;"CurrentMode.Suggestions"&lt;/span&gt;
                &lt;span class="na"&gt;PromptRequested=&lt;/span&gt;&lt;span class="s"&gt;"@PromptRequest"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/SfAIAssistView&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 3: Add a simple mode selector (and clear chat on switch)
&lt;/h3&gt;

&lt;p&gt;The key detail here: clear prompts when switching modes. Otherwise, the previous &lt;code&gt;tone/structure&lt;/code&gt; can leak into the next request.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"width:155px; padding-bottom:20px; margin-left:34px"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"contentType"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Content Type&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;SfDropDownList&lt;/span&gt; &lt;span class="na"&gt;TValue=&lt;/span&gt;&lt;span class="s"&gt;"string"&lt;/span&gt;
                    &lt;span class="na"&gt;ID=&lt;/span&gt;&lt;span class="s"&gt;"contentType"&lt;/span&gt;
                    &lt;span class="na"&gt;TItem=&lt;/span&gt;&lt;span class="s"&gt;"ContentType"&lt;/span&gt;
                    &lt;span class="na"&gt;Placeholder=&lt;/span&gt;&lt;span class="s"&gt;"Select a content type"&lt;/span&gt;
                    &lt;span class="na"&gt;DataSource=&lt;/span&gt;&lt;span class="s"&gt;"@ContentTypes"&lt;/span&gt;
                    &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;bind-Index=&lt;/span&gt;&lt;span class="s"&gt;"@selectedContentTypeIndex"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;DropDownListFieldSettings&lt;/span&gt; &lt;span class="na"&gt;Value=&lt;/span&gt;&lt;span class="s"&gt;"ID"&lt;/span&gt;
                                   &lt;span class="na"&gt;Text=&lt;/span&gt;&lt;span class="s"&gt;"Text"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/DropDownListFieldSettings&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;DropDownListEvents&lt;/span&gt; &lt;span class="na"&gt;TValue=&lt;/span&gt;&lt;span class="s"&gt;"string"&lt;/span&gt;
                            &lt;span class="na"&gt;TItem=&lt;/span&gt;&lt;span class="s"&gt;"ContentType"&lt;/span&gt;
                            &lt;span class="na"&gt;ValueChange=&lt;/span&gt;&lt;span class="s"&gt;"OnValueChange"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/DropDownListEvents&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/SfDropDownList&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ContentType&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="n"&gt;ID&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="n"&gt;selectedContentTypeIndex&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;ContentType&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;ContentTypes&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Enum&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetValues&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ContentMode&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Cast&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;ContentMode&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;()&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Select&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mode&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;ContentType&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;ID&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToString&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;ToLower&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
        &lt;span class="n"&gt;Text&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToString&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToList&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;OnValueChange&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ChangeEventArgs&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ContentType&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Enum&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TryParse&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;ContentMode&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ItemData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;out&lt;/span&gt; &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;parsed&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;mode&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;parsed&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="c1"&gt;// Prevent tone/structure “leakage” across modes&lt;/span&gt;
        &lt;span class="n"&gt;assistView&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="n"&gt;Prompts&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nf"&gt;Clear&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="nf"&gt;StateHasChanged&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F04%2FBlog-and-KB-option-on-the-page.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F04%2FBlog-and-KB-option-on-the-page.png" alt="&amp;lt;alt-text&amp;gt;" width="272" height="236"&gt;&lt;/a&gt;&lt;br&gt;Blog and KB option on the page
  &lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Make SystemInstruction mode-aware
&lt;/h3&gt;

&lt;p&gt;In your &lt;code&gt;PromptRequested&lt;/code&gt; handler, set &lt;code&gt;SystemInstruction&lt;/code&gt; based on the mode:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;GenerateContentConfig&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;GenerateContentConfig&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;SystemInstruction&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Content&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Parts&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Part&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Part&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;CurrentMode&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SystemInstruction&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 5: Add a structured prompt builder (shared rules + mode template)
&lt;/h3&gt;

&lt;p&gt;This is where output consistency really improves:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nf"&gt;BuildUserPrompt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;rawPrompt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;sharedRules&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"""
&lt;/span&gt;        &lt;span class="n"&gt;Use&lt;/span&gt; &lt;span class="n"&gt;Markdown&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
        &lt;span class="n"&gt;Use&lt;/span&gt; &lt;span class="n"&gt;headings&lt;/span&gt; &lt;span class="k"&gt;and&lt;/span&gt; &lt;span class="n"&gt;bullet&lt;/span&gt; &lt;span class="n"&gt;points&lt;/span&gt; &lt;span class="k"&gt;where&lt;/span&gt; &lt;span class="n"&gt;helpful&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
        &lt;span class="n"&gt;Be&lt;/span&gt; &lt;span class="n"&gt;accurate&lt;/span&gt; &lt;span class="k"&gt;and&lt;/span&gt; &lt;span class="n"&gt;avoid&lt;/span&gt; &lt;span class="n"&gt;making&lt;/span&gt; &lt;span class="n"&gt;up&lt;/span&gt; &lt;span class="n"&gt;product&lt;/span&gt; &lt;span class="n"&gt;behaviors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
        &lt;span class="s"&gt;""";
&lt;/span&gt;
    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;modeTemplate&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mode&lt;/span&gt; &lt;span class="k"&gt;switch&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;ContentMode&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Blog&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;"""
&lt;/span&gt;            &lt;span class="n"&gt;Output&lt;/span&gt; &lt;span class="n"&gt;structure&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="n"&gt;Title&lt;/span&gt;
            &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="nf"&gt;Intro&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;direct&lt;/span&gt; &lt;span class="n"&gt;answer&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="n"&gt;bullets&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Main&lt;/span&gt; &lt;span class="n"&gt;sections&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;H2&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;H3&lt;/span&gt; &lt;span class="n"&gt;headings&lt;/span&gt;
            &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Common&lt;/span&gt; &lt;span class="n"&gt;mistakes&lt;/span&gt;
            &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Conclusion&lt;/span&gt;
            &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="nf"&gt;FAQs&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="s"&gt;""",
&lt;/span&gt;        &lt;span class="n"&gt;ContentMode&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;KnowledgeBase&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;"""
&lt;/span&gt;            &lt;span class="n"&gt;Output&lt;/span&gt; &lt;span class="n"&gt;structure&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="n"&gt;Title&lt;/span&gt;
            &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Summary&lt;/span&gt;
            &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Environment&lt;/span&gt; &lt;span class="p"&gt;/&lt;/span&gt; &lt;span class="n"&gt;Applies&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt;
            &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Symptoms&lt;/span&gt;
            &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="nf"&gt;Resolution&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;numbered&lt;/span&gt; &lt;span class="n"&gt;steps&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Troubleshooting&lt;/span&gt;
            &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="nf"&gt;FAQs&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="s"&gt;""",
&lt;/span&gt;        &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;""&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;$"""
&lt;/span&gt;        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;sharedRules&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;modeTemplate&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="n"&gt;User&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;rawPrompt&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="s"&gt;""";
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 6: Call Gemini with the final prompt
&lt;/h3&gt;

&lt;p&gt;Then call Gemini with the final prompt and update AssistView:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt; &lt;span class="nf"&gt;PromptRequest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;AssistViewPromptRequestedEventArgs&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;GenerateContentConfig&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;SystemInstruction&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Content&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;Parts&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Part&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Part&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;CurrentMode&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SystemInstruction&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;

    &lt;span class="k"&gt;try&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;finalPrompt&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;BuildUserPrompt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Prompt&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GenerateContentAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="s"&gt;"gemini-2.5-flash"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;finalPrompt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;responseText&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Candidates&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;Content&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Parts&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;assistView&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;UpdateResponseAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;responseText&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Response&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;assistView&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Prompts&lt;/span&gt;&lt;span class="p"&gt;[^&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Exception&lt;/span&gt; &lt;span class="n"&gt;ex&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Response&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;$"Error: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ex&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Message&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Notes for reliability:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;BuildUserPrompt(...)&lt;/code&gt; is where you centralize formatting and guardrails.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;UpdateResponseAsync&lt;/code&gt;(…) pushes the model response back into the  &lt;strong&gt;Syncfusion Blazor AI AssistView&lt;/strong&gt;  UI.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This article was originally published at &lt;a href="https://www.syncfusion.com/blogs/post/blazor-ai-content-creation-app-structured-prompting" rel="noopener noreferrer"&gt;Syncfusion.com.&lt;/a&gt;&lt;/p&gt;

</description>
      <category>blazor</category>
      <category>dotnet</category>
      <category>dotnet10</category>
      <category>aiassistview</category>
    </item>
    <item>
      <title>Embed a Secure Inline PDF Viewer in React: No Downloads, Full Control</title>
      <dc:creator>Calvince Moth</dc:creator>
      <pubDate>Mon, 13 Apr 2026 11:42:24 +0000</pubDate>
      <link>https://forem.com/syncfusion/embed-a-secure-inline-pdf-viewer-in-react-no-downloads-full-control-3m08</link>
      <guid>https://forem.com/syncfusion/embed-a-secure-inline-pdf-viewer-in-react-no-downloads-full-control-3m08</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Every time a PDF opens in Acrobat, something breaks, users leave your app, analytics lose visibility, and security controls stop at the hard drive. What if PDFs never had to leave your UI at all? Embed PDF documents directly inside your app using the Syncfusion React PDF Viewer, lock down printing and downloads, tailor tools by user role, and capture real interaction data for audits and analytics, so PDFs stay part of your workflow, not an escape route.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stop downloading to view PDFs in your React app: There’s a better way
&lt;/h2&gt;

&lt;p&gt;Every time a PDF downloads and opens outside your app, you lose more than you expect:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;User attention&lt;/strong&gt;: The interface disappears.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Workflow continuity&lt;/strong&gt;: Navigation breaks and context are lost.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Control over sensitive documents&lt;/strong&gt;: Security rules stop applying.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Users click a document, the browser launches Acrobat or a native viewer, and your app is suddenly out of the picture. At that point, analytics go dark, and there’s no reliable way to know what the user did with the document.&lt;/p&gt;

&lt;p&gt;For modern React applications, especially internal portals, SaaS dashboards, and enterprise tools, this experience no longer works. Users expect PDFs to load instantly, stay in line, and remain secure without forced downloads or context switches.&lt;/p&gt;

&lt;p&gt;This guide shows how to embed a secure &lt;a href="https://www.syncfusion.com/pdf-viewer-sdk/react-pdf-viewer" rel="noopener noreferrer"&gt;PDF Viewer in React&lt;/a&gt; using &lt;a href="https://www.syncfusion.com/" rel="noopener noreferrer"&gt;Syncfusion&lt;sup&gt;®&lt;/sup&gt;&lt;/a&gt;, so documents render directly inside your app. You’ll learn how to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Disable printing and downloads.&lt;/li&gt;
&lt;li&gt;Configure role‑based toolbars.&lt;/li&gt;
&lt;li&gt;Track document interactions for audit and analytics purposes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The result:&lt;/strong&gt; PDFs become a controlled, first‑class part of your workflow, not something that pulls users out of it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why PDF downloads hurt your web app experience
&lt;/h2&gt;

&lt;p&gt;Considering a scenario, you’ve built a polished internal web portal with quick navigation and smooth UX. Then a user clicks a use-case file, and Chrome hands the PDF to Adobe Acrobat.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Your app just lost the user.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here’s why that single click silently damages your product metrics.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. It instantly breaks the user flow
&lt;/h3&gt;

&lt;p&gt;Switching from your app to a native desktop viewer is a &lt;strong&gt;hard context switch&lt;/strong&gt;. The user is suddenly in Acrobat’s viewer UI, with different controls, and no clear path back.&lt;/p&gt;

&lt;p&gt;For internal tools, HR portals, procurement systems, loan dashboards, and compliance apps, these broken flows don’t just frustrate users; they also undermine productivity. They create real operational drag.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. “Just download it” isn’t actually simple
&lt;/h3&gt;

&lt;p&gt;A “simple PDF download” is rarely simple:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Click -&amp;gt; download&lt;/strong&gt; → &lt;strong&gt;wait&lt;/strong&gt; → &lt;strong&gt;find file&lt;/strong&gt; → &lt;strong&gt;open&lt;/strong&gt; → &lt;strong&gt;read&lt;/strong&gt; → &lt;strong&gt;return to app&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Each extra step reduces completion rates, especially in onboarding, review, and approval workflows.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Mobile users get hit the hardest
&lt;/h3&gt;

&lt;p&gt;On mobile, PDF downloads often fail outright:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No default PDF reader.&lt;/li&gt;
&lt;li&gt;Files buried in downloads.&lt;/li&gt;
&lt;li&gt;Storage permission pop‑ups.&lt;/li&gt;
&lt;li&gt;Broken navigation back to the app.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In a mobile‑first enterprise world, downloads become a dead end.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Analytics &amp;amp; visibility disappear
&lt;/h3&gt;

&lt;p&gt;Once the PDF leaves your app, it disappears from your observability stack. You cannot reliably answer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Did they open it?&lt;/li&gt;
&lt;li&gt;Which pages did they read?&lt;/li&gt;
&lt;li&gt;Where did they stop?&lt;/li&gt;
&lt;li&gt;How long did the review take?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;An embedded viewer keeps those interactions inside your product so you can instrument them.&lt;/p&gt;

&lt;h2&gt;
  
  
  The hidden security &amp;amp; compliance risks of PDF downloads
&lt;/h2&gt;

&lt;p&gt;For enterprise teams, the problem with PDF downloads isn’t just bad UX; it’s a &lt;strong&gt;security and compliance liability&lt;/strong&gt; waiting to happen.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Downloaded PDFs are beyond your control
&lt;/h3&gt;

&lt;p&gt;Once a PDF is downloaded on a device:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You can’t revoke access.&lt;/li&gt;
&lt;li&gt;You can’t prevent forwarding.&lt;/li&gt;
&lt;li&gt;You can’t audit distribution.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For organizations handling financial data, health records, legal contracts, or intellectual property, this isn’t a theoretical risk. It’s a &lt;strong&gt;compliance and security failure&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Sensitive data exposure risk increases
&lt;/h3&gt;

&lt;p&gt;Download-by-default often conflicts with internal governance and regulated requirements, including &lt;strong&gt;SOC 2, GDPR, HIPAA, PCI, and ISO&lt;/strong&gt; policies. Audits tend to focus on exactly this: where data goes and who can keep it.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. No access revocation
&lt;/h3&gt;

&lt;p&gt;Role changes, vendor offboarding, and account termination do not affect files that have already been downloaded. That is a permanent data leakage risk.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Vulnerable browser plugins
&lt;/h3&gt;

&lt;p&gt;Not every enterprise user is running an updated machine. Many are still using outdated browser PDF plugins, which are a known attack vector for maliciously crafted PDFs.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a fast, secure, inline PDF Viewer should include
&lt;/h2&gt;

&lt;p&gt;Before you pick up a solution, here’s what a production-ready embedded PDF viewer needs to deliver.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;View-only mode&lt;/strong&gt; with download/print disabled.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Role-based tools&lt;/strong&gt; with different toolbars for viewers, reviewers, and auditors.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Responsive UX&lt;/strong&gt; for desktops and mobile.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Progressive rendering&lt;/strong&gt; and smooth zoom/search on large PDFs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Event hooks&lt;/strong&gt; for analytics and audit trails.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Straightforward&lt;/strong&gt; and &lt;strong&gt;easy,&lt;/strong&gt; framework-friendly &lt;strong&gt;.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enterprise-ready controls&lt;/strong&gt; with access enforcement, logging strategy, and maintainability.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This article was originally published at &lt;a href="https://www.syncfusion.com/blogs/post/embed-secure-inline-pdf-viewer-react" rel="noopener noreferrer"&gt;Syncfusion.com.&lt;/a&gt;&lt;/p&gt;

</description>
      <category>pdf</category>
      <category>documentmanagement</category>
      <category>enterprisetools</category>
      <category>pdfviewer</category>
    </item>
    <item>
      <title>Convert Markdown to PDF in C# Using .NET Word Library</title>
      <dc:creator>Calvince Moth</dc:creator>
      <pubDate>Fri, 10 Apr 2026 11:42:27 +0000</pubDate>
      <link>https://forem.com/syncfusion/convert-markdown-to-pdf-in-c-using-net-word-library-2ee3</link>
      <guid>https://forem.com/syncfusion/convert-markdown-to-pdf-in-c-using-net-word-library-2ee3</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Convert Markdown to PDF in C# using .NET Word Library with just a few lines of code. Install the NuGet package, add namespaces, and run the conversion. Customize images with events, embed diagrams, or handle base64 streams. Ideal for documentation, eBooks, reports, and compliance workflows. Fast, accurate, and scalable for developer productivity.&lt;/p&gt;

&lt;h2&gt;
  
  
  Markdown is loved by developers, but PDFs are trusted by everyone else
&lt;/h2&gt;

&lt;p&gt;Markdown is a popular choice for developers creating documentation and technical content.  But when it comes to sharing or archiving, PDF is the preferred format for its consistency and professionalism.&lt;/p&gt;

&lt;p&gt;In this blog, you’ll learn how to convert Markdown to PDF using &lt;strong&gt;C#&lt;/strong&gt; and ** ** &lt;a href="https://www.syncfusion.com/document-sdk/net-word-library" rel="noopener noreferrer"&gt;Syncfusion&lt;sup&gt;®&lt;/sup&gt; .NET Word Library&lt;/a&gt; with practical code examples, real-world use cases, and advanced customization tips.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why convert Markdown to PDF?
&lt;/h2&gt;

&lt;p&gt;Markdown is ideal for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Writing clean, readable documentation.&lt;/li&gt;
&lt;li&gt;Creating lightweight technical content.&lt;/li&gt;
&lt;li&gt;Collaborating in version-controlled environments.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;PDF is better for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Printing and sharing with non-technical users.&lt;/li&gt;
&lt;li&gt;Preserving formatting across devices.&lt;/li&gt;
&lt;li&gt;Archiving and compliance.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bringing these formats together gives you both developer-friendly writing and professional-grade output. Next, let’s look at what you’ll need before starting the conversion process.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;.NET project (console app, service, or web app).&lt;/li&gt;
&lt;li&gt;A Markdown file (for example: Input.md).&lt;/li&gt;
&lt;li&gt;Syncfusion DocIO package.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How to convert Markdown to PDF in C# using .NET Word Library
&lt;/h2&gt;

&lt;p&gt;Follow these steps to convert a Markdown file to PDF in C# using Syncfusion .NET Word Library:&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Install the Syncfusion DocIO NuGet package
&lt;/h3&gt;

&lt;p&gt;First, add the &lt;a href="https://www.nuget.org/packages/Syncfusion.DocIORenderer.Net.Core" rel="noopener noreferrer"&gt;Syncfusion.DocIORenderer.Net.Core&lt;/a&gt; NuGet package to your project, as shown below.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F04%2Fimage001-1-768x342.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F04%2Fimage001-1-768x342.png" alt="&amp;lt;alt-text&amp;gt;" width="768" height="342"&gt;&lt;/a&gt;&lt;br&gt;Installing the Syncfusion  DocIO NuGet package
  &lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Add required namespaces
&lt;/h3&gt;

&lt;p&gt;Next, add the following namespaces to your file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;Syncfusion.DocIO&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;Syncfusion.DocIO.DLS&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;Syncfusion.DocIORenderer&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;Syncfusion.Pdf&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 3: Convert Markdown to PDF using C
&lt;/h3&gt;

&lt;p&gt;Open the Markdown stream in Word, then save it as a PDF.&lt;/p&gt;

&lt;p&gt;Here’s the code you need:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Open the Word document file stream.&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;FileStream&lt;/span&gt; &lt;span class="n"&gt;inputStream&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;FileStream&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Template.md"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;FileMode&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Open&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;FileAccess&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ReadWrite&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Load an existing Word document.&lt;/span&gt;
    &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;WordDocument&lt;/span&gt; &lt;span class="n"&gt;wordDocument&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;WordDocument&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;inputStream&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;FormatType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Markdown&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Create an instance of DocIORenderer.&lt;/span&gt;
        &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DocIORenderer&lt;/span&gt; &lt;span class="n"&gt;renderer&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;DocIORenderer&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="c1"&gt;// Convert Word document into PDF document.&lt;/span&gt;
            &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PdfDocument&lt;/span&gt; &lt;span class="n"&gt;pdfDocument&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;renderer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ConvertToPDF&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;wordDocument&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="c1"&gt;// Save the PDF file to the file system.&lt;/span&gt;
                &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;FileStream&lt;/span&gt; &lt;span class="n"&gt;outputStream&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;FileStream&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Output.pdf"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;FileMode&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Create&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;FileAccess&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ReadWrite&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
                &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="n"&gt;pdfDocument&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;outputStream&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;By executing this code example, we will get output like in the following image.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F04%2Fimage003-768x375.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F04%2Fimage003-768x375.png" alt="&amp;lt;alt-text&amp;gt;" width="768" height="375"&gt;&lt;/a&gt;&lt;br&gt;Converting a Markdown document to PDF using C# and Syncfusion .NET Word Library
  &lt;/p&gt;

&lt;h2&gt;
  
  
  Advanced image customization options
&lt;/h2&gt;

&lt;p&gt;When converting Markdown to a PDF using the .NET Word Library, we have the flexibility to modify the images included in the input Markdown file.&lt;/p&gt;

&lt;h3&gt;
  
  
  Hook the ImageNodeVisited event
&lt;/h3&gt;

&lt;p&gt;We can download images listed as URLs in the Markdown file and insert them into the resulting Word document.&lt;/p&gt;

&lt;p&gt;You can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Replace placeholder images with client-specific branding.&lt;/li&gt;
&lt;li&gt;Embed diagrams from URLs or local folders.&lt;/li&gt;
&lt;li&gt;Handle base64-encoded images.&lt;/li&gt;
&lt;li&gt;Customize image streams using the &lt;code&gt;ImageNodeVisited&lt;/code&gt; event.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Refer to the following code example to achieve this.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Open a file as a stream.&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;FileStream&lt;/span&gt; &lt;span class="n"&gt;fileStreamPath&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;FileStream&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Input.md"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;FileMode&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Open&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;FileAccess&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Read&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;FileShare&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ReadWrite&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Create a Word document instance.&lt;/span&gt;
    &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;WordDocument&lt;/span&gt; &lt;span class="n"&gt;document&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;WordDocument&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Hook the event to customize the image while importing Markdown.&lt;/span&gt;
        &lt;span class="n"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MdImportSettings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ImageNodeVisited&lt;/span&gt; &lt;span class="p"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;MdImportSettings_ImageNodeVisited&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="c1"&gt;// Open an existing Markdown file.&lt;/span&gt;
        &lt;span class="n"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fileStreamPath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;FormatType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Markdown&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="c1"&gt;// Create an instance of DocIORenderer.&lt;/span&gt;
        &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DocIORenderer&lt;/span&gt; &lt;span class="n"&gt;renderer&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;DocIORenderer&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="c1"&gt;// Convert Word document into PDF document.&lt;/span&gt;
            &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PdfDocument&lt;/span&gt; &lt;span class="n"&gt;pdfDocument&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;renderer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ConvertToPDF&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;document&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="c1"&gt;// Save the PDF file to the file system.&lt;/span&gt;
                &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;FileStream&lt;/span&gt; &lt;span class="n"&gt;outputStream&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;FileStream&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Output.pdf"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;FileMode&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Create&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;FileAccess&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ReadWrite&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
                &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="n"&gt;pdfDocument&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;outputStream&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What this changes:&lt;/strong&gt; Now, every time DocIO encounters an image in Markdown, it calls your handler and gives you a chance to provide the actual image stream.&lt;/p&gt;

&lt;h3&gt;
  
  
  Implement the image handler
&lt;/h3&gt;

&lt;p&gt;The following C# code illustrates the use of the event handler to customize the image based on the source path.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;MdImportSettings_ImageNodeVisited&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="kt"&gt;object&lt;/span&gt; &lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;Syncfusion&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Office&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Markdown&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MdImageNodeVisitedEventArgs&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Retrieve the image from the local machine file path and use it.&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Uri&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="s"&gt;"Road-550.png"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ImageStream&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;FileStream&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Uri&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;FileMode&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Open&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="c1"&gt;// Retrieve the image from the website and use it.&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Uri&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;StartsWith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"https://"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;WebClient&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;WebClient&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="c1"&gt;// Download the image as a stream.&lt;/span&gt;
        &lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;image&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;DownloadData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Uri&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;Stream&lt;/span&gt; &lt;span class="n"&gt;stream&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;MemoryStream&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="c1"&gt;// Set the retrieved image from the input Markdown.&lt;/span&gt;
        &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ImageStream&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="c1"&gt;// Retrieve the image from the Base64 string and use it.&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Uri&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;StartsWith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"data:image/"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;src&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Uri&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;startIndex&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;IndexOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;","&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;src&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Substring&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;startIndex&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;image&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Convert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;FromBase64String&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;Stream&lt;/span&gt; &lt;span class="n"&gt;stream&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;MemoryStream&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="c1"&gt;// Set the retrieved image from the input Markdown.&lt;/span&gt;
        &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ImageStream&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This article was originally published at &lt;a href="https://www.syncfusion.com/blogs/post/markdown-to-pdf-in-csharp-word-library" rel="noopener noreferrer"&gt;Syncfusion.com.&lt;/a&gt;&lt;/p&gt;

</description>
      <category>word</category>
      <category>dotnetdevelopment</category>
      <category>csharp</category>
      <category>documentprocessing</category>
    </item>
    <item>
      <title>Why .NET MAUI Popups Lag and How to Fix Performance Issues </title>
      <dc:creator>Calvince Moth</dc:creator>
      <pubDate>Fri, 10 Apr 2026 07:05:21 +0000</pubDate>
      <link>https://forem.com/syncfusion/why-net-maui-popups-lag-and-how-to-fix-performance-issues-1134</link>
      <guid>https://forem.com/syncfusion/why-net-maui-popups-lag-and-how-to-fix-performance-issues-1134</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Heavy popup content can block the UI thread and cause lag. Improve .NET MAUI Popup performance by reusing the popup view with ContentTemplate, loading data only when needed, virtualizing long lists, and keeping animations lightweight and fast.&lt;/p&gt;

&lt;p&gt;Your .NET MAUI app can feel fast until a popup opens with heavy UI. Then you see it: stuttering animations, slow scrolling, and a fragile feel that users notice immediately.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.syncfusion.com/maui-controls/maui-popup" rel="noopener noreferrer"&gt;Syncfusion &lt;strong&gt;&lt;sup&gt;®&lt;/sup&gt;&lt;/strong&gt;.NET MAUI Popup&lt;/a&gt; is designed for performance; however, when integrating popups with large datasets or complex layouts, you still need optimization to ensure a consistently smooth experience.&lt;/p&gt;

&lt;p&gt;In this blog, we will show you how to improve your app’s performance when using Syncfusion .NET MAUI Popup by applying the following proven techniques:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lazy initialization (create/load only when needed)&lt;/li&gt;
&lt;li&gt;Content caching (reuse the same view across opens)&lt;/li&gt;
&lt;li&gt;Virtualization for large lists&lt;/li&gt;
&lt;li&gt;Smooth, jank-free animations&lt;/li&gt;
&lt;li&gt;A safe content template lifecycle strategy&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With these strategies, you will achieve faster load times, reduced memory usage, and a seamless user experience across Android, iOS, Windows, and macOS.&lt;/p&gt;

&lt;h2&gt;
  
  
  Speed up .NET MAUI Popup: Best practices
&lt;/h2&gt;

&lt;p&gt;Let’s integrate &lt;a href="https://www.syncfusion.com/maui-controls/maui-popup" rel="noopener noreferrer"&gt;Syncfusion .NET MAUI Popup&lt;/a&gt; into a .NET MAUI app and apply these performance techniques.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; To get started with .NET MAUI Popup, check the official &lt;a href="https://help.syncfusion.com/maui/popup/getting-started" rel="noopener noreferrer"&gt;documentation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scenario:&lt;/strong&gt; Product details popup with a large variants list.&lt;/p&gt;

&lt;p&gt;For this example, we’ll work with a sample application that shows a list of products. When the user taps a product, a popup displays product details, along with a potentially long list of variants (we simulate  &lt;strong&gt;1,000 variants&lt;/strong&gt; to stress-test performance).&lt;/p&gt;

&lt;p&gt;The goal is to reduce:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tap-to-visible time&lt;/strong&gt; (how fast the popup appears).&lt;/li&gt;
&lt;li&gt;UI thread works during open/close animations.&lt;/li&gt;
&lt;li&gt;Memory churn caused by repeated view creation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can explore the complete sample implementation used in this walkthrough from the &lt;a href="https://github.com/SyncfusionExamples/How-to-do-performance-tuning-in-SfPopup" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; repository.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works (what usually makes popups slow)
&lt;/h2&gt;

&lt;p&gt;Popups often feel &lt;strong&gt;slow&lt;/strong&gt; for a few predictable reasons:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;View creation cost&lt;/strong&gt;: Building a complex visual tree each time you open the popup.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data loading cost&lt;/strong&gt;: Populating collections and binding large data at the wrong time (often right as the popup animates in).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;List rendering cost&lt;/strong&gt;: Creating UI containers for hundreds/thousands of rows without virtualization.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Animation contention&lt;/strong&gt;: Doing heavy work on the UI thread while the popup is animating.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The patterns below directly target these bottlenecks.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Cache and reuse the popup content via ContentTemplate
&lt;/h3&gt;

&lt;p&gt;We start by ensuring that the popup’s content is created only once and then reused. This caching approach prevents the framework from rebuilding the entire visual tree each time the popup opens, reducing unnecessary CPU work and memory use.&lt;/p&gt;

&lt;p&gt;By wrapping our _&lt;code&gt;popupView&lt;/code&gt; inside a &lt;code&gt;DataTemplate&lt;/code&gt; and assigning it to &lt;code&gt;ProductPopup.ContentTemplate&lt;/code&gt;, the first time the popup is shown, the Syncfusion .NET MAUI Popup reuses that same instance on every subsequent open instead of recreating it.&lt;/p&gt;

&lt;p&gt;Here’s how you can do it in code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="n"&gt;ProductDetailsPopupView&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="n"&gt;_popupView&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// This will hold our cached view&lt;/span&gt;
&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="n"&gt;MainViewModel&lt;/span&gt; &lt;span class="n"&gt;_viewModel&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;MainPage&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;InitializeComponent&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="n"&gt;_viewModel&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;MainViewModel&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="n"&gt;BindingContext&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;_viewModel&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="n"&gt;_viewModel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RequestOpenPopup&lt;/span&gt; &lt;span class="p"&gt;+=&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_popupView&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// Create the view only on the first open&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;_popupView&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;ProductDetailsPopupView&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;BindingContext&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;_viewModel&lt;/span&gt; &lt;span class="c1"&gt;// Keep the same ViewModel instance&lt;/span&gt;
            &lt;span class="p"&gt;};&lt;/span&gt;
            &lt;span class="c1"&gt;// Assign the cached view using a DataTemplate&lt;/span&gt;
            &lt;span class="n"&gt;ProductPopup&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ContentTemplate&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;DataTemplate&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_popupView&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="c1"&gt;// ... (rest of the popup opening logic)&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="c1"&gt;// ...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the above code example, &lt;code&gt;ContentTemplate&lt;/code&gt; returns the same cached view instance, so the UI tree is not recreated on every open. That’s a direct win for CPU and GC pressure.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Lazy initialize popup data only when the user taps (on-demand)
&lt;/h3&gt;

&lt;p&gt;Even with a cached view, you can still slow down your app by preparing data too early (for example, during page initialization). A better approach is to load popup data only when the user actually taps a product.&lt;/p&gt;

&lt;p&gt;In our sample, the product details and variant information are populated on demand, right before the popup opens. This keeps the app lightweight at startup while ensuring the popup always displays the correct information for the selected product.&lt;/p&gt;

&lt;p&gt;When &lt;code&gt;OnProductTapped&lt;/code&gt; is triggered, &lt;code&gt;InitializeDetails&lt;/code&gt; updates the popup’s data source, refreshes the variants list, and resets &lt;code&gt;SelectedVariant&lt;/code&gt; to null. This guarantees a consistent initial state, for example, keeping &lt;strong&gt;Add to Cart&lt;/strong&gt;  disabled until a variant is chosen.&lt;/p&gt;

&lt;p&gt;Code snippet to achieve this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;OnProductTapped&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Product&lt;/span&gt; &lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;SelectedProduct&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nf"&gt;InitializeDetails&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Prepares popup data just before showing&lt;/span&gt;
    &lt;span class="n"&gt;RequestOpenPopup&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nf"&gt;Invoke&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Signals MainPage to open the popup&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;By updating the popup’s data only when it’s needed, you avoid unnecessary work during page load and ensure each product tap produces accurate, up-to-date details.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Virtualized list for large datasets
&lt;/h3&gt;

&lt;p&gt;Large lists inside a popup can seriously impact performance if the UI is forced to create a view for every row. Using a virtualized list ensures that only the visible items are rendered, while off‑screen containers are recycled as the user scrolls.&lt;/p&gt;

&lt;p&gt;In our sample, we display a large set of variants (simulated at &lt;code&gt;1,000 items&lt;/code&gt;) using the &lt;a href="https://www.syncfusion.com/maui-controls/maui-listview" rel="noopener noreferrer"&gt;Syncfusion .NET MAUI ListView&lt;/a&gt;. Since it’s virtualized by design, it creates UI elements only for items currently in view and reuses them as you scroll. This greatly reduces memory usage and keeps the popup responsive, even with large datasets.&lt;/p&gt;

&lt;p&gt;Below is the code you need:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;SfListView:SfListView&lt;/span&gt; &lt;span class="na"&gt;x:Name=&lt;/span&gt;&lt;span class="s"&gt;"VariantsList"&lt;/span&gt;
                       &lt;span class="na"&gt;Grid.Row=&lt;/span&gt;&lt;span class="s"&gt;"1"&lt;/span&gt;
                       &lt;span class="na"&gt;ItemsSource=&lt;/span&gt;&lt;span class="s"&gt;"{Binding Variants}"&lt;/span&gt;
                       &lt;span class="na"&gt;SelectedItem=&lt;/span&gt;&lt;span class="s"&gt;"{Binding SelectedVariant, Mode=TwoWay}"&lt;/span&gt;
                       &lt;span class="na"&gt;SelectionMode=&lt;/span&gt;&lt;span class="s"&gt;"Single"&lt;/span&gt; &lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 4: Fluid, jank-free animations
&lt;/h3&gt;

&lt;p&gt;Even small UI stalls become noticeable during animations. To keep the popup feeling fluid, let the animation run without competing for UI thread time, and fine-tune the animation settings to feel quick and natural.&lt;/p&gt;

&lt;p&gt;To ensure the popup opens and closes smoothly without stuttering, we rely on &lt;a href="https://help.syncfusion.com/maui/popup/getting-started" rel="noopener noreferrer"&gt;SfPopup’s&lt;/a&gt; built-in animations and avoid heavy operations during these critical UI moments.&lt;/p&gt;

&lt;p&gt;Setting &lt;a href="https://help.syncfusion.com/maui/popup/popup-animations#animation-duration" rel="noopener noreferrer"&gt;AnimationDuration&lt;/a&gt; to a short value (e.g., &lt;code&gt;180ms&lt;/code&gt;) and &lt;a href="https://help.syncfusion.com/maui/popup/popup-animations#animation-easing" rel="noopener noreferrer"&gt;Animation Easing&lt;/a&gt; to a curve like SinOut makes the Fade animation feel fast and natural, contributing significantly to a responsive user experience.&lt;/p&gt;

&lt;p&gt;Add this to your project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;syncfusion:SfPopup&lt;/span&gt; 
&lt;span class="err"&gt;…&lt;/span&gt;
    &lt;span class="na"&gt;AnimationMode=&lt;/span&gt;&lt;span class="s"&gt;"Fade"&lt;/span&gt; 
    &lt;span class="na"&gt;AnimationDuration=&lt;/span&gt;&lt;span class="s"&gt;"180"&lt;/span&gt; &lt;span class="err"&gt;&amp;lt;!--&lt;/span&gt; &lt;span class="err"&gt;A&lt;/span&gt; &lt;span class="err"&gt;quick,&lt;/span&gt; &lt;span class="err"&gt;snappy&lt;/span&gt; &lt;span class="err"&gt;duration&lt;/span&gt; &lt;span class="err"&gt;--&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    Easing="SinOut" &lt;span class="c"&gt;&amp;lt;!-- Enhances fluidity --&amp;gt;&lt;/span&gt;&amp;gt;
…
&lt;span class="nt"&gt;&amp;lt;/syncfusion:SfPopup&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This article was originally published at &lt;a href="https://www.syncfusion.com/blogs/post/speed-up-dotnet-maui-popup" rel="noopener noreferrer"&gt;Syncfusion.com.&lt;/a&gt;&lt;/p&gt;

</description>
      <category>dotnetmaui</category>
      <category>dotnetmauipopup</category>
      <category>crossplatformdevelop</category>
      <category>mobileui</category>
    </item>
    <item>
      <title>How to Protect Sheets and Workbooks in a React Spreadsheet</title>
      <dc:creator>Calvince Moth</dc:creator>
      <pubDate>Thu, 09 Apr 2026 13:19:27 +0000</pubDate>
      <link>https://forem.com/syncfusion/how-to-protect-sheets-and-workbooks-in-a-react-spreadsheet-nji</link>
      <guid>https://forem.com/syncfusion/how-to-protect-sheets-and-workbooks-in-a-react-spreadsheet-nji</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Want your React spreadsheets to feel rock‑solid without slowing your users down? Spreadsheet protection gives you the best of both worlds: you can lock down formulas, structure, and layouts while keeping key input cells open for editing. Use sheet protection + protectSettings to decide exactly what users can and can’t do, lockCells() to open just the ranges that matter, and workbook protection to stop sheet renaming, deleting, or moving.&lt;/p&gt;

&lt;p&gt;Handling sensitive or business-critical data in the &lt;a href="https://www.syncfusion.com/spreadsheet-editor-sdk/react-spreadsheet-editor" rel="noopener noreferrer"&gt;Syncfusion&lt;sup&gt;®&lt;/sup&gt; React Spreadsheet&lt;/a&gt;? Protecting sheets and workbooks ensures your templates, formulas, and inputs stay intact and tamper‑free.&lt;/p&gt;

&lt;p&gt;This guide walks you through:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When to protect a sheet vs. a workbook&lt;/li&gt;
&lt;li&gt;How to lock/unlock cells&lt;/li&gt;
&lt;li&gt;How to configure granular permissions&lt;/li&gt;
&lt;li&gt;How to apply read‑only mode&lt;/li&gt;
&lt;li&gt;Practical protection patterns for real‑world use cases&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Protection features in React Spreadsheet
&lt;/h2&gt;

&lt;p&gt;Syncfusion includes different layers of protection, each for different use cases:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Workbook protection:&lt;/strong&gt; Prevents structural changes like:

&lt;ul&gt;
&lt;li&gt;Adding/removing sheets&lt;/li&gt;
&lt;li&gt;Renaming or hiding sheets&lt;/li&gt;
&lt;li&gt;Rearranging sheet order&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Sheet protection:&lt;/strong&gt; Restrict editing on the current sheet.
Used when:

&lt;ul&gt;
&lt;li&gt;You want formulas protected&lt;/li&gt;
&lt;li&gt;You want only certain cells to be editable&lt;/li&gt;
&lt;li&gt;You want users to view but not modify content&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Cell locking:&lt;/strong&gt; Lock selected cells or ranges while keeping others editable.&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Password protection:&lt;/strong&gt; Secure sheets with a password to prevent unauthorized changes.&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Selective permissions:&lt;/strong&gt; Control actions such as inserting/deleting cell data, formatting, resizing rows/columns, and inserting hyperlinks.&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Read-only mode:&lt;/strong&gt; Make cells non-editable to prevent modifications.&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Ready to lock it down? Explore advanced sheet-protection methods in Syncfusion React Spreadsheet to keep your data secure.&lt;/p&gt;

&lt;p&gt;Let’s dive in and see how you can lock sheets, secure cells, protect workbooks, and manage permissions with ease!&lt;/p&gt;

&lt;h2&gt;
  
  
  Protecting a sheet
&lt;/h2&gt;

&lt;p&gt;The protect sheet feature makes a sheet read-only, preventing edits unless you explicitly allow them. Enable sheet protection by setting the &lt;a href="https://ej2.syncfusion.com/react/documentation/api/spreadsheet/sheetModel/#isprotected" rel="noopener noreferrer"&gt;isProtected&lt;/a&gt; property to true (it is false by default).&lt;/p&gt;

&lt;p&gt;By default, these actions are disabled:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Selecting cells&lt;/li&gt;
&lt;li&gt;Editing cells&lt;/li&gt;
&lt;li&gt;Formatting rows, columns, or cells&lt;/li&gt;
&lt;li&gt;Inserting links&lt;/li&gt;
&lt;li&gt;Resizing, hiding rows/columns&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Customizing permissions with protectSettings
&lt;/h3&gt;

&lt;p&gt;The &lt;a href="https://ej2.syncfusion.com/react/documentation/api/spreadsheet/sheetModel/#protectsettings" rel="noopener noreferrer"&gt;protectSettings&lt;/a&gt; option lets you enable specific actions even when a sheet is protected. All options are disabled by default; set to true to enable.&lt;/p&gt;

&lt;p&gt;The available &lt;code&gt;protectSettings&lt;/code&gt; options are,&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Select locked cells:&lt;/strong&gt; Allow selecting locked cells for highlighting.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Select unlocked cells:&lt;/strong&gt; Allow selecting only unlocked cells.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Format cells:&lt;/strong&gt; Apply cell style like font, color, borders, number format, and conditional format.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Format rows:&lt;/strong&gt; Resize and hide Rows.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Format columns:&lt;/strong&gt; Resize and hide Columns.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Insert link:&lt;/strong&gt; Insert hyperlinks in unlocked cells.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example, if &lt;code&gt;formatCells: true&lt;/code&gt; is set in &lt;code&gt;protectSettings&lt;/code&gt;, users can still apply styles, borders, and font or background colors even while the sheet is protected.&lt;/p&gt;

&lt;p&gt;This article was originally published at &lt;a href="https://www.syncfusion.com/blogs/post/protect-sheet-in-react-spreadsheet" rel="noopener noreferrer"&gt;Syncfusion.com.&lt;/a&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>excellikespreadsheet</category>
      <category>reactspreadsheet</category>
      <category>spreadsheet</category>
    </item>
    <item>
      <title>Add Digital Signatures to a WPF PDF Viewer with a Click-to-Place eSign Workflow</title>
      <dc:creator>Calvince Moth</dc:creator>
      <pubDate>Thu, 09 Apr 2026 11:44:02 +0000</pubDate>
      <link>https://forem.com/syncfusion/add-digital-signatures-to-a-wpf-pdf-viewer-with-a-click-to-place-esign-workflow-3ome</link>
      <guid>https://forem.com/syncfusion/add-digital-signatures-to-a-wpf-pdf-viewer-with-a-click-to-place-esign-workflow-3ome</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Learn to implement digital signatures inside the Syncfusion WPF PDF Viewer using programmatic techniques. It covers adding a custom eSign button, capturing click positions, generating a signature image, and applying a certificate-based signature. It enables a smooth, secure in-app signing experience even though the viewer does not support signature creation through its UI.&lt;/p&gt;

&lt;h2&gt;
  
  
  Digital signatures are no longer optional
&lt;/h2&gt;

&lt;p&gt;A digital signature is a cryptographic stamp applied to a document using a certificate containing a private key. It isn’t just about convenience; it’s about &lt;strong&gt;trust&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Digital signatures ensure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Document authenticity.&lt;/li&gt;
&lt;li&gt;Tamper protection.&lt;/li&gt;
&lt;li&gt; Verified signer identity.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For this reason, digital signatures are standard in legal, financial, and enterprise document workflows.&lt;/p&gt;

&lt;h2&gt;
  
  
  The smart workaround: In‑app digital signing in WPF PDF Viewer
&lt;/h2&gt;

&lt;p&gt;While Syncfusion &lt;a href="https://www.syncfusion.com/pdf-viewer-sdk/wpf-pdf-viewer" rel="noopener noreferrer"&gt;WPF PDF Viewer&lt;/a&gt; currently supports viewing digital signatures, it does not allow adding or modifying them directly through the UI.&lt;/p&gt;

&lt;p&gt;But by combining the Syncfusion WPF PDF Viewer and .NET PDF  Library, we can enable programmatic digital signing. We can customize the toolbar, capture user interactions, and embed a certificate-based signature with a dynamically generated image.&lt;/p&gt;

&lt;p&gt;Instead of relying on external tools or complex user flows, this solution enables &lt;strong&gt;secure, fully integrated digital signing,&lt;/strong&gt; right inside your WPF PDF Viewer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Requirements
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Set up the environment
&lt;/h3&gt;

&lt;p&gt;Install the following prerequisites:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://visualstudio.microsoft.com/downloads/" rel="noopener noreferrer"&gt;Visual Studio 2022&lt;/a&gt; or newer with the WPF workload enabled.&lt;/li&gt;
&lt;li&gt;The &lt;a href="https://www.nuget.org/packages/Syncfusion.PdfViewer.WPF" rel="noopener noreferrer"&gt;Sycfusion.PdfViewer.WPF&lt;/a&gt; NuGet package, which includes both the viewer control and the PDF processing library.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Certificate for signing
&lt;/h3&gt;

&lt;p&gt;We need a valid &lt;code&gt;.pfx&lt;/code&gt; certificate file that contains a private key. This certificate is used to securely sign the PDF and embed metadata such as the signer’s identity, location, and signing reason.&lt;/p&gt;

&lt;h2&gt;
  
  
  Add a digital signature using Syncfusion WPF PDF Viewer and .NET PDF Library
&lt;/h2&gt;

&lt;p&gt;This digital signing workflow is built around the following  four key steps:&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Add an eSign button to the toolbar
&lt;/h3&gt;

&lt;p&gt;When the WPF PDF Viewer loads, you can inject a custom eSign button into the existing toolbar.&lt;/p&gt;

&lt;p&gt;To keep the UI consistent, we will reuse the style and icon of an existing toolbar item, as shown in the following code.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;PDFViewer_Loaded&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;object&lt;/span&gt; &lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;RoutedEventArgs&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;toolbar&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;PDFViewer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Template&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;FindName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"PART_Toolbar"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;PDFViewer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;DocumentToolbar&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;stackPanel&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;toolbar&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Template&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;FindName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"PART_ToolbarStack"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;toolbar&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;StackPanel&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;defaultButton&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Button&lt;/span&gt;&lt;span class="p"&gt;)((&lt;/span&gt;&lt;span class="n"&gt;StackPanel&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;stackPanel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Children&lt;/span&gt;&lt;span class="p"&gt;[^&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="n"&gt;Children&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;eSignButton&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;GetButton&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;defaultButton&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Content&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;defaultButton&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;stackPanel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Children&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;eSignButton&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;GetButton&lt;/code&gt; method is responsible for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Creating the new button,&lt;/li&gt;
&lt;li&gt;Applying the existing style, and&lt;/li&gt;
&lt;li&gt;Attaching the click event that activates the signing mode.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 2: Capture the exact spot where the user clicks
&lt;/h3&gt;

&lt;p&gt;Once the eSign button is clicked, a flag is set to indicate that the next mouse click should trigger signature placement. This will convert the mouse-click coordinates to page-relative positions using the WPF PDF Viewer’s built-in method. So, the signature lands exactly where the user clicked.&lt;/p&gt;

&lt;p&gt;This ensures:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pixel‑perfect placement.&lt;/li&gt;
&lt;li&gt;Support for multi‑page PDFs.&lt;/li&gt;
&lt;li&gt;A natural “click‑to‑sign” feel users already expect.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Refer to the following code example.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;PDFViewer_PageClicked&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;object&lt;/span&gt; &lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;PageClickedEventArgs&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;addSignature&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;pageIndex&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;PDFViewer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CurrentPageIndex&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
          &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;pagePoint&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;PDFViewer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ConvertClientPointToPagePoint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Position&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pageIndex&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
          &lt;span class="nf"&gt;ApplySignature&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pageIndex&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pagePoint&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
          &lt;span class="n"&gt;addSignature&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 3: Dynamically generate a signature image
&lt;/h3&gt;

&lt;p&gt;Instead of a generic stamp, this solution creates a meaningful visual signature. It:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Generates a runtime image block containing:

&lt;ul&gt;
&lt;li&gt;Signer name.&lt;/li&gt;
&lt;li&gt;Date and time.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Combines it with a handwritten‑style name image.&lt;/li&gt;

&lt;li&gt;Produces a polished &lt;strong&gt;eSign graphic&lt;/strong&gt; every time.&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;The visual result meets professional and regulatory requirements.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;CreateCurrentDataImage&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
     &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;$"Digitally signed by John\nDate: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;DateTime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Now&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;yyyy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MM&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dd&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="n"&gt;nHH&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;mm&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ss&lt;/span&gt; &lt;span class="n"&gt;zzz&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
     &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;var&lt;/span&gt; &lt;span class="n"&gt;bitmap&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Bitmap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;100&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
     &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;var&lt;/span&gt; &lt;span class="n"&gt;graphics&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Graphics&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;FromImage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bitmap&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
     &lt;span class="n"&gt;graphics&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;FillRectangle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Brushes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;White&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;100&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
     &lt;span class="n"&gt;graphics&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;DrawString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Font&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Arial"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;9&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;Brushes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Black&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;RectangleF&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;180&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;80&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
     &lt;span class="n"&gt;bitmap&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filePath&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="s"&gt;"DigitalSignatureBlock.png"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ImageFormat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Png&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;CombineSignatureAndDataImage&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;var&lt;/span&gt; &lt;span class="n"&gt;nameImage&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;FromFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filePath&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="s"&gt;"John.png"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;var&lt;/span&gt; &lt;span class="n"&gt;signImage&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;FromFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filePath&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="s"&gt;"DigitalSignatureBlock.png"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;var&lt;/span&gt; &lt;span class="n"&gt;combinedImage&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Bitmap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nameImage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Width&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="n"&gt;signImage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Width&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nameImage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Height&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;signImage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Height&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
      &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;var&lt;/span&gt; &lt;span class="n"&gt;g&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Graphics&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;FromImage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;combinedImage&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;DrawImage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nameImage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;DrawImage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;signImage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nameImage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Width&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="n"&gt;combinedImage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filePath&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="s"&gt;"ESign.png"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ImageFormat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Png&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 4: Apply a certificate‑based digital signature
&lt;/h3&gt;

&lt;p&gt;Here’s where security comes in. Using the &lt;code&gt;.pfx&lt;/code&gt; certificate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A cryptographic digital signature is applied.&lt;/li&gt;
&lt;li&gt;Metadata is embedded (reason, location, contact information).&lt;/li&gt;
&lt;li&gt;The signature is rendered visually at the chosen location.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then, the PDF is saved and reloaded, now officially signed. All of this happens programmatically and securely.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;ApplySignature&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;pageIndex&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Point&lt;/span&gt; &lt;span class="n"&gt;pagePoint&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;page&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;PDFViewer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;LoadedDocument&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Pages&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;pageIndex&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;PdfLoadedPage&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;cert&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;PdfCertificate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filePath&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="s"&gt;"PDF.pfx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"password123"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;signature&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;PdfSignature&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PDFViewer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;LoadedDocument&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cert&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Signature"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;image&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;PdfBitmap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filePath&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="s"&gt;"ESign.png"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="n"&gt;signature&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Bounds&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;RectangleF&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="kt"&gt;float&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;pagePoint&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;float&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;pagePoint&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PhysicalDimension&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Width&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PhysicalDimension&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Height&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="n"&gt;signature&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ContactInfo&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"johndoe@owned.us"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="n"&gt;signature&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;LocationInfo&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Honolulu, Hawaii"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="n"&gt;signature&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Reason&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"I am the author of this document."&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="n"&gt;signature&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Appearance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Normal&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Graphics&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;DrawImage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;var&lt;/span&gt; &lt;span class="n"&gt;stream&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;MemoryStream&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="n"&gt;PDFViewer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;LoadedDocument&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Position&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="n"&gt;PDFViewer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This article was originally published at &lt;a href="https://www.syncfusion.com/blogs/post/add-in-app-digital-sign-wpf-pdf-viewer" rel="noopener noreferrer"&gt;Syncfusion.com.&lt;/a&gt;&lt;/p&gt;

</description>
      <category>pdf</category>
      <category>desktop</category>
      <category>digitalsignature</category>
      <category>documentprocessing</category>
    </item>
    <item>
      <title>Best LLM APIs in 2026: Comparing OpenAI, Claude, Gemini, Azure, Bedrock, Mistral &amp; DeepSeek</title>
      <dc:creator>Calvince Moth</dc:creator>
      <pubDate>Wed, 08 Apr 2026 12:56:03 +0000</pubDate>
      <link>https://forem.com/syncfusion/best-llm-apis-in-2026-comparing-openai-claude-gemini-azure-bedrock-mistral-deepseek-18d</link>
      <guid>https://forem.com/syncfusion/best-llm-apis-in-2026-comparing-openai-claude-gemini-azure-bedrock-mistral-deepseek-18d</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;: Choosing an LLM API in 2026 isn’t about “the best model”; it’s about the best fit for your workload. &lt;strong&gt;OpenAI&lt;/strong&gt; and &lt;strong&gt;Claude&lt;/strong&gt; lead in agentic workflows and developer speed, Gemini dominates multimodal long-context tasks, Azure OpenAI and AWS Bedrock excel in regulated enterprise environments, Mistral offers an EU-friendly open-weight path, and DeepSeek wins on ultra-low cost with OpenAI-compatible APIs.&lt;/p&gt;

&lt;p&gt;The LLM API market in 2026 is no longer the “wild west”, but it still changes fast enough that last year’s comparison posts age out quickly. Most major providers now ship new model families every few months.  &lt;strong&gt;1M-token context&lt;/strong&gt;  is common across flagships. And  &lt;strong&gt;agentic features&lt;/strong&gt;  (tool calling, computer use, multi-step workflows) are now expected, not “nice to have.”&lt;/p&gt;

&lt;p&gt;So what actually separates a good architectural choice from a painful one?&lt;/p&gt;

&lt;p&gt;Not marketing. The difference shows up in the boring-but-critical details: latency under load, pricing at scale, SDK quality, compliance posture, rate limits, and deprecation timelines.&lt;/p&gt;

&lt;p&gt;This guide compares the  &lt;strong&gt;top 7 LLM APIs of 2026&lt;/strong&gt;  with production reality in mind.&lt;/p&gt;

&lt;h2&gt;
  
  
  The real developer pain (what hits in production)
&lt;/h2&gt;

&lt;p&gt;Teams rarely fail because they picked the “wrong” model. They fail because the platform’s operational details don’t match their workload.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Common pain points&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Onboarding friction:&lt;/strong&gt; SDK maturity and example depth decide whether “Hello, world” takes 10 minutes or half a day.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Architecture trade‑offs:&lt;/strong&gt; Do you rely on &lt;code&gt;1M‑token prompts&lt;/code&gt; or build a slim RAG layer? Your choice impacts latency, token spend, and maintainability.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Latency-sensitive apps:&lt;/strong&gt; Streaming &lt;code&gt;TTFT&lt;/code&gt; matters more than raw &lt;code&gt;TPS&lt;/code&gt;; caching helps TTFT, not generation speed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost unpredictability:&lt;/strong&gt; Learn the batch API and prompt caching knobs or pay &lt;code&gt;40–60%&lt;/code&gt; more than you need.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vendor lock-in:&lt;/strong&gt; Proprietary caching keys, computer‑use runtimes, quota models can become hard dependencies; abstract early.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Production reliability:&lt;/strong&gt; Watch rate limits, region availability, and model deprecation windows; build for churn.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What’s changed in 2026
&lt;/h2&gt;

&lt;p&gt;The AI API landscape shifted fast this year. Three big changes reshaped developer choices:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;1M+ context windows became normal&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
All major vendors now support &lt;code&gt;~1M tokens&lt;/code&gt;. Long-context workflows (codebases, legal docs, video transcripts) are finally mainstream.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Agentic capabilities matured&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Computer use, multi-step tool calls, and structured reasoning are no longer experimental. Some providers are still ahead here (notably Claude and OpenAI), while others are still catching up.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cost spread widened dramatically&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
DeepSeek disrupted pricing at the bottom end. Azure and Bedrock increased their enterprise tooling. OpenAI and Anthropic improved caching and batch options, making large contexts cheaper in practice.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Net result:&lt;/strong&gt; In 2026, teams choose based on &lt;strong&gt;workflow + constraints&lt;/strong&gt;, not just raw model quality.&lt;/p&gt;

&lt;p&gt;This article was originally published at &lt;a href="https://www.syncfusion.com/blogs/post/top-llm-api-comparison-2026" rel="noopener noreferrer"&gt;Syncfusion.com.&lt;/a&gt;&lt;/p&gt;

</description>
      <category>llmapi</category>
      <category>aiapis</category>
      <category>enterpriseai</category>
      <category>generativeaiplatform</category>
    </item>
    <item>
      <title>How to Integrate React Gantt Chart in Framer</title>
      <dc:creator>Calvince Moth</dc:creator>
      <pubDate>Wed, 08 Apr 2026 11:30:12 +0000</pubDate>
      <link>https://forem.com/syncfusion/how-to-integrate-react-gantt-chart-in-framer-3c0m</link>
      <guid>https://forem.com/syncfusion/how-to-integrate-react-gantt-chart-in-framer-3c0m</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Tired of inefficient coding cycles in project management tools? Integrating a React Gantt Chart into Framer streamlines setup, delivers structured files, and enables task-driven execution, all directly on the canvas. With Framer’s developer mode and Gantt integration, you achieve an efficient workflow that keeps project timelines precise. The result is fewer errors, faster previews, neater layouts, and scalable visualizations for your team.&lt;/p&gt;

&lt;p&gt;The Syncfusion&lt;sup&gt;®&lt;/sup&gt; &lt;a href="https://www.syncfusion.com/react-ui-components/react-gantt-chart" rel="noopener noreferrer"&gt;React Gantt Chart&lt;/a&gt; is a robust tool for project planning and tracking. It provides an interactive timeline to manage tasks, dependencies, and resources with built-in editing and drag-and-drop. Using it in Framer’s design and prototyping platform allows developers and designers to build interactive, data-driven project management UIs.&lt;/p&gt;

&lt;p&gt;This blog walks through a step-by-step approach to integrating the Syncfusion React Gantt Chart into a Framer project, including a practical, working code example to help you get started quickly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why integrate Syncfusion React Gantt Chart with Framer?
&lt;/h2&gt;

&lt;p&gt;Framer’s developer mode supports React-based components, making it an ideal platform for embedding Syncfusion’s feature-rich Gantt Chart. This integration is perfect for prototyping complex project timelines interactively, bridging the gap between design and development.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key benefits:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Dynamic visualizations&lt;/strong&gt;: Display tasks, dependencies, and milestones with Syncfusion’s customizable Gantt Chart.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Interactive prototyping&lt;/strong&gt;: Leverage Framer’s design environment to create user-friendly interfaces.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Seamless integration&lt;/strong&gt;: Combine Syncfusion’s robust functionality with Framer’s flexible canvas.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;Before starting, ensure you have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A valid &lt;a href="https://ej2.syncfusion.com/react/documentation/licensing/license-key-generation" rel="noopener noreferrer"&gt;Syncfusion license key&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.framer.com/downloads/" rel="noopener noreferrer"&gt;Framer desktop application&lt;/a&gt; installed.&lt;/li&gt;
&lt;li&gt;Basic knowledge of React, TypeScript, and Framer’s developer mode.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Integrating Framer and Syncfusion React Gantt Chart
&lt;/h2&gt;

&lt;p&gt;The first step in integrating the Syncfusion &lt;a href="https://ej2.syncfusion.com/react/documentation/gantt/getting-started" rel="noopener noreferrer"&gt;React Gantt Chart&lt;/a&gt; into &lt;a href="https://www.framer.com/developers/" rel="noopener noreferrer"&gt;Framer&lt;/a&gt; is to set up your development environment.&lt;/p&gt;

&lt;p&gt;Framer is built for design and prototyping, while the React Gantt Chart delivers advanced project management features. Integrating both requires a few setup steps for a smooth developer workflow.&lt;/p&gt;

&lt;p&gt;This article was originally published at &lt;a href="https://www.syncfusion.com/blogs/post/integrate-react-gantt-chart-in-framer" rel="noopener noreferrer"&gt;Syncfusion.com.&lt;/a&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>datavisualization</category>
      <category>developerproductivit</category>
      <category>framertutorials</category>
    </item>
  </channel>
</rss>
