From 0f04bc7c896e0c67b9ae915c0c9c7b1b4704ada9 Mon Sep 17 00:00:00 2001 From: sameerkhan001 Date: Wed, 8 Oct 2025 12:19:51 +0530 Subject: [PATCH 001/163] 985863-ug: UG documentation feedback for PDF library- Part 2 --- .../NET/Working-with-DigitalSignature.md | 1120 ++++++++++------- 1 file changed, 690 insertions(+), 430 deletions(-) diff --git a/Document-Processing/PDF/PDF-Library/NET/Working-with-DigitalSignature.md b/Document-Processing/PDF/PDF-Library/NET/Working-with-DigitalSignature.md index df6b82859..381688a3e 100644 --- a/Document-Processing/PDF/PDF-Library/NET/Working-with-DigitalSignature.md +++ b/Document-Processing/PDF/PDF-Library/NET/Working-with-DigitalSignature.md @@ -20,6 +20,11 @@ The following code example explains how to add a digital signature to the PDF do {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Digital%20Signature/Add-a-digital-signature-to-the-PDF-document/.NET/Add-a-digital-signature-to-the-PDF-document/Program.cs" %} +using Syncfusion.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; +using Syncfusion.Pdf.Security; + //Creates a new PDF document. PdfDocument document = new PdfDocument(); //Adds a new page. @@ -44,23 +49,20 @@ signature.Reason = "I am author of this document."; //Draws the signature image. signature.Appearance.Normal.Graphics.DrawImage(signatureImage, 0, 0); -//Save the document into stream. -MemoryStream stream = new MemoryStream(); -document.Save(stream); -stream.Position = 0; +//Save the document +document.Save("Output.pdf"); //Close the document. document.Close(true); -//Defining the ContentType for PDF file. -string contentType = "application/pdf"; -//Define the file name. -string fileName = "Output.pdf"; -//Creates a FileContentResult object by using the file contents, content type, and file name. -return File(stream, contentType, fileName); {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using System.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; +using Syncfusion.Pdf.Security; + //Creates a new PDF document PdfDocument document = new PdfDocument(); //Adds a new page @@ -90,6 +92,11 @@ document.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports System.Drawing +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Graphics +Imports Syncfusion.Pdf.Security + 'Creates a new PDF document Dim document As New PdfDocument() 'Adds a new page @@ -129,6 +136,11 @@ The following code example illustrates how to add a digital signature in the PDF {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Digital%20Signature/Add-a-digital-signature-to-the-PDF-document/.NET/Add-a-digital-signature-to-the-PDF-document/Program.cs" %} +using Syncfusion.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; +using Syncfusion.Pdf.Security; + //Creates a new PDF document PdfDocument document = new PdfDocument(); //Adds a new page @@ -153,23 +165,20 @@ signature.Reason = "I am author of this document."; //Draws the signature image signature.Appearance.Normal.Graphics.DrawImage(signatureImage, 0, 0); -//Save the document into stream -MemoryStream stream = new MemoryStream(); -document.Save(stream); -stream.Position = 0; -//Close the document +//Save the document +document.Save("Output.pdf"); +//Close the document. document.Close(true); -//Defining the ContentType for pdf file -string contentType = "application/pdf"; -//Define the file name -string fileName = "Output.pdf"; -//Creates a FileContentResult object by using the file contents, content type, and file name -return File(stream, contentType, fileName); {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using System.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; +using Syncfusion.Pdf.Security; + //Creates a new PDF document PdfDocument document = new PdfDocument(); //Adds a new page @@ -201,6 +210,11 @@ document.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports System.Drawing +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Graphics +Imports Syncfusion.Pdf.Security + 'Creates a new PDF document Dim document As New PdfDocument() 'Adds a new page @@ -238,9 +252,14 @@ You can add a digital signature to an existing document as follows. {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Digital%20Signature/Add-a-digital-signature-to-an-existing-document/.NET/Add-a-digital-signature-to-an-existing-document/Program.cs" %} +using Syncfusion.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; +using Syncfusion.Pdf.Parsing; +using Syncfusion.Pdf.Security; + //Load the PDF document -FileStream docStream = new FileStream("Input.pdf", FileMode.Open, FileAccess.Read); -PdfLoadedDocument loadedDocument = new PdfLoadedDocument(docStream); +PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Input.pdf"); //Gets the page PdfLoadedPage page = loadedDocument.Pages[0] as PdfLoadedPage; @@ -255,23 +274,21 @@ signatureField.Signature.Reason = "I am author of this document"; //Adds the field loadedDocument.Form.Fields.Add(signatureField); -//Save the document into stream -MemoryStream stream = new MemoryStream(); -loadedDocument.Save(stream); -stream.Position = 0; -//Close the document +//Save the document +loadedDocument.Save("Output.pdf"); +//Close the document. loadedDocument.Close(true); -//Defining the ContentType for pdf file -string contentType = "application/pdf"; -//Define the file name -string fileName = "Output.pdf"; -//Creates a FileContentResult object by using the file contents, content type, and file name -return File(stream, contentType, fileName); {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} - + +using System.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; +using Syncfusion.Pdf.Parsing; +using Syncfusion.Pdf.Security; + //Loads the PDF document with signature field PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Input.pdf"); //Gets the page @@ -295,6 +312,12 @@ loadedDocument.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports System.Drawing +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Graphics +Imports Syncfusion.Pdf.Parsing +Imports Syncfusion.Pdf.Security + 'Loads the PDF document with signature field Dim loadedDocument As New PdfLoadedDocument("Input.pdf") 'Gets the page @@ -328,6 +351,12 @@ The following code example illustrates how to add digital signature in a PDF doc {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Digital%20Signature/Add-digital-signature-using-X509Certificate2/.NET/Add-digital-signature-using-X509Certificate2/Program.cs" %} +using Syncfusion.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; +using Syncfusion.Pdf.Security; +using System.Security.Cryptography.X509Certificates; + //Creates a new PDF document PdfDocument document = new PdfDocument(); //Adds a new page @@ -351,25 +380,21 @@ signature.Reason = "I am author of this document."; //Draws the signature image signature.Appearance.Normal.Graphics.DrawImage(signatureImage, 0, 0); -//Creating the stream object -MemoryStream stream = new MemoryStream(); -//Save the document as stream -document.Save(stream); -//If the position is not set to '0', then the PDF will be empty -stream.Position = 0; -//Close the document +//Save the document +document.Save("Output.pdf"); +//Close the document. document.Close(true); -//Defining the ContentType for pdf file -string contentType = "application/pdf"; -//Define the file name -string fileName = "Output.pdf"; -//Creates a FileContentResult object by using the file contents, content type, and file name -return File(stream, contentType, fileName); {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using System.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; +using Syncfusion.Pdf.Security; +using System.Security.Cryptography.X509Certificates; + //Creates a new PDF document PdfDocument document = new PdfDocument(); //Adds a new page @@ -401,6 +426,12 @@ document.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Drawing +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Graphics +Imports Syncfusion.Pdf.Security +Imports System.Security.Cryptography.X509Certificates + 'Creates a new PDF document Dim document As New PdfDocument() 'Adds a new page @@ -442,9 +473,12 @@ You can load the signature field from the existing PDF document using [PdfLoaded {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Digital%20Signature/Signing-an-existing-PDF-document/.NET/Signing-an-existing-PDF-document/Program.cs" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Parsing; +using Syncfusion.Pdf.Security; + //Load the PDF document -FileStream docStream = new FileStream("Input.pdf", FileMode.Open, FileAccess.Read); -PdfLoadedDocument loadedDocument = new PdfLoadedDocument(docStream); +PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Input.pdf"); //Gets the first page of the document PdfLoadedPage page = loadedDocument.Pages[0] as PdfLoadedPage; //Gets the first signature field of the PDF document @@ -455,23 +489,19 @@ FileStream certificateStream = new FileStream("PDF.pfx", FileMode.Open, FileAcce PdfCertificate certificate = new PdfCertificate(certificateStream, "password123"); field.Signature = new PdfSignature(loadedDocument, page, certificate, "Signature", field); -//Save the document into stream -MemoryStream stream = new MemoryStream(); -loadedDocument.Save(stream); -stream.Position = 0; -//Close the document +//Save the document +loadedDocument.Save("Output.pdf"); +//Close the document. loadedDocument.Close(true); -//Defining the ContentType for pdf file -string contentType = "application/pdf"; -//Define the file name -string fileName = "Output.pdf"; -//Creates a FileContentResult object by using the file contents, content type, and file name -return File(stream, contentType, fileName); {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Parsing; +using Syncfusion.Pdf.Security; + //Loads a PDF document PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Input.pdf"); //Gets the first page of the document @@ -492,6 +522,10 @@ loadedDocument.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Parsing +Imports Syncfusion.Pdf.Security + 'Loads a PDF document Dim loadedDocument As New PdfLoadedDocument("Input.pdf") 'Gets the first page of the document @@ -522,9 +556,12 @@ You can load the signature field from an existing PDF document using [PdfLoadedS {% highlight c# tabtitle="C# [Cross-platform]" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Parsing; +using Syncfusion.Pdf.Security; + //Load the PDF document -FileStream docStream = new FileStream("Input.pdf", FileMode.Open, FileAccess.Read); -PdfLoadedDocument loadedDocument = new PdfLoadedDocument(docStream); +PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Input.pdf"); //Gets the first page of the document PdfLoadedPage page = loadedDocument.Pages[0] as PdfLoadedPage; //Gets the first signature field of the PDF document @@ -535,23 +572,19 @@ FileStream certificateStream = new FileStream("PDF.pfx", FileMode.Open, FileAcce PdfCertificate certificate = new PdfCertificate(certificateStream, "password123"); field.Signature = new PdfSignature(loadedDocument, page, certificate, "Signature", field); -//Save the document into stream -MemoryStream stream = new MemoryStream(); -loadedDocument.Save(stream); -stream.Position = 0; -//Close the document +//Save the document +loadedDocument.Save("Output.pdf"); +//Close the document. loadedDocument.Close(true); -//Defining the ContentType for pdf file -string contentType = "application/pdf"; -//Define the file name -string fileName = "Output.pdf"; -//Creates a FileContentResult object by using the file contents, content type, and file name -return File(stream, contentType, fileName); {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Parsing; +using Syncfusion.Pdf.Security; + //Loads a PDF document PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Input.pdf"); //Gets the first page of the document @@ -573,7 +606,11 @@ loadedDocument.Close(true); {% endhighlight %} {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} - + +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Parsing +Imports Syncfusion.Pdf.Security + 'Loads a PDF document Dim loadedDocument As New PdfLoadedDocument("Input.pdf") 'Gets the first page of the document @@ -606,43 +643,44 @@ The following code example demonstrates how to check if a signature field is sig {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Digital%20Signature/Check-If-PDF-Is-Signed/.NET/Check-If-PDF-Is-Signed/Program.cs" %} -// Open the signed PDF file for reading -using (FileStream inputFileStream = new FileStream("Input.pdf", FileMode.Open, FileAccess.Read)) -{ - // Load the PDF document - PdfLoadedDocument loadedDocument = new PdfLoadedDocument(inputFileStream); +using Syncfusion.Pdf.Parsing; - // Check if the document contains a form with fields - if (loadedDocument.Form == null || loadedDocument.Form.Fields.Count == 0) - { - Console.WriteLine("No signature fields found in the document."); - } - else +// Load the PDF document +PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Input.pdf"); + +// Check if the document contains a form with fields +if (loadedDocument.Form == null || loadedDocument.Form.Fields.Count == 0) +{ + Console.WriteLine("No signature fields found in the document."); +} +else +{ + // Iterate through all fields in the form + foreach (PdfLoadedField field in loadedDocument.Form.Fields) { - // Iterate through all fields in the form - foreach (PdfLoadedField field in loadedDocument.Form.Fields) + // Check if the field is a signature field + PdfLoadedSignatureField signatureField = field as PdfLoadedSignatureField; + if (signatureField != null) { - // Check if the field is a signature field - PdfLoadedSignatureField signatureField = field as PdfLoadedSignatureField; - if (signatureField != null) - { - // Determine whether the signature field is signed or not - string status = signatureField.IsSigned ? "Signed" : "UnSigned"; + // Determine whether the signature field is signed or not + string status = signatureField.IsSigned ? "Signed" : "UnSigned"; - // Output the result for each signature field - Console.WriteLine("Signature Field " + signatureField.Name + " is: " + status); - } + // Output the result for each signature field + Console.WriteLine("Signature Field " + signatureField.Name + " is: " + status); } } - - // Close the document - loadedDocument.Close(true); } +// Close the document +loadedDocument.Close(true); + + {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} + using Syncfusion.Pdf.Parsing; + // Load the PDF document PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Input.pdf"); @@ -675,7 +713,9 @@ using (FileStream inputFileStream = new FileStream("Input.pdf", FileMode.Open, F {% endhighlight %} {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} - + +Imports Syncfusion.Pdf.Parsing + ' Load the PDF document Dim loadedDocument As New PdfLoadedDocument("Input.pdf") @@ -721,19 +761,22 @@ The following code example shows how to sign the PDF document from an external s {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Digital%20Signature/Externally-sign-a-PDF-document/.NET/Externally-sign-a-PDF-document/Program.cs" %} -//Get the stream from the document -FileStream documentStream = new FileStream("PDF_Succinctly.pdf ", FileMode.Open, FileAccess.Read); -//Load the existing PDF document -PdfLoadedDocument document = new PdfLoadedDocument(documentStream); +using Syncfusion.Pdf.Parsing; +using Syncfusion.Pdf.Security; +using System.Security.Cryptography; +using System.Security.Cryptography.Pkcs; +using System.Security.Cryptography.X509Certificates; + +//Load the PDF document +PdfLoadedDocument document = new PdfLoadedDocument("Input.pdf"); //Creates a digital signature PdfSignature signature = new PdfSignature(document, document.Pages[0], null, "DigitalSignature"); signature.ComputeHash += Signature_ComputeHash; -//Save the PDF document to stream -MemoryStream ms = new MemoryStream(); -document.Save(ms); -//Close the PDF document +//Save the document +document.Save("Output.pdf"); +//Close the document. document.Close(true); private static void Signature_ComputeHash1(object sender, PdfSignatureEventArgs ars) @@ -758,6 +801,12 @@ private static void Signature_ComputeHash1(object sender, PdfSignatureEventArgs {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} + +using Syncfusion.Pdf.Parsing; +using Syncfusion.Pdf.Security; +using System.Security.Cryptography; +using System.Security.Cryptography.Pkcs; +using System.Security.Cryptography.X509Certificates; //Load existing PDF document PdfLoadedDocument document = new PdfLoadedDocument("PDF_Succinctly.pdf"); @@ -792,6 +841,12 @@ void Signature_ComputeHash(object sender, PdfSignatureEventArgs arguments) {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf.Parsing +Imports Syncfusion.Pdf.Security +Imports System.Security.Cryptography +Imports System.Security.Cryptography.Pkcs +Imports System.Security.Cryptography.X509Certificates + 'Load existing PDF document Dim document As PdfLoadedDocument = New PdfLoadedDocument("PDF_Succinctly.pdf") 'Creates a digital signature @@ -827,16 +882,21 @@ End Sub You can download a complete working sample from [GitHub](https://github.com/SyncfusionExamples/PDF-Examples/tree/master/Digital%20Signature/Externally-sign-a-PDF-document/). ### Externally sign the PDF document using IPdfExternalSigner + The following code example shows how to sign the PDF document from external signature using [IPdfExternalSigner](https://help.syncfusion.com/cr/document-processing/Syncfusion.Pdf.Security.IPdfExternalSigner.html). {% tabs %} {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Digital%20Signature/Externally-sign-the-PDF-document-using-IPdfExternalSigner/.NET/Externally-sign-the-PDF-document/Program.cs" %} -//Get the stream from the document -FileStream documentStream = new FileStream("Input.pdf ", FileMode.Open, FileAccess.Read); -//Load the existing PDF document -PdfLoadedDocument loadedDocument = new PdfLoadedDocument(documentStream); +using Syncfusion.Pdf.Parsing; +using Syncfusion.Pdf.Security; +using Syncfusion.Drawing; +using System.Security.Cryptography.X509Certificates; +using System.Security.Cryptography; + +//Load the PDF document +PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Input.pdf"); //Creates a digital signature. PdfSignature signature = new PdfSignature(loadedDocument, loadedDocument.Pages[0], null, "Signature"); @@ -853,18 +913,10 @@ List certificates = new List(); certificates.Add(new X509Certificate2(Convert.FromBase64String(PublicCert))); signature.AddExternalSigner(externalSignature, certificates, null); -//Save the document into stream -MemoryStream stream = new MemoryStream(); -loadedDocument.Save(stream); -stream.Position = 0; -//Close the document +//Save the document +loadedDocument.Save("Output.pdf"); +//Close the document. loadedDocument.Close(true); -//Defining the ContentType for pdf file -string contentType = "application/pdf"; -//Define the file name -string fileName = "Output.pdf"; -//Creates a FileContentResult object by using the file contents, content type, and file name -return File(stream, contentType, fileName); //Create the external signer class and sign the document hash. class ExternalSigner : IPdfExternalSigner @@ -907,6 +959,12 @@ class ExternalSigner : IPdfExternalSigner {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf.Parsing; +using Syncfusion.Pdf.Security; +using System.Drawing; +using System.Security.Cryptography.X509Certificates; +using System.Security.Cryptography; + //Load an existing PDF document. PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Input.pdf"); @@ -966,6 +1024,12 @@ class ExternalSigner : IPdfExternalSigner {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf.Parsing +Imports Syncfusion.Pdf.Security +Imports System.Security.Cryptography +Imports System.Drawing +Imports System.Security.Cryptography.X509Certificates + 'Load an existing PDF document. Dim loadedDocument As PdfLoadedDocument = New PdfLoadedDocument("Input.pdf") @@ -1036,11 +1100,18 @@ The following example illustrates the process of adding timestamps to a PDF docu {% highlight c# tabtitle="C# [Cross-platform]" %} -// Get the stream from the input PDF document. -FileStream documentStream = new FileStream("Input.pdf", FileMode.Open, FileAccess.Read); +using Syncfusion.Pdf.Parsing; +using Syncfusion.Pdf.Security; +using Syncfusion.Drawing; +using System.Security.Cryptography.X509Certificates; +using System.Security.Cryptography; +using Org.BouncyCastle.Tsp; +using System.Net; +using System.Text; +using Org.BouncyCastle.Math; -// Load the existing PDF document. -PdfLoadedDocument loadedDocument = new PdfLoadedDocument(documentStream); +//Load the PDF document +PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Input.pdf"); // Create a digital signature for the first page of the document. PdfSignature signature = new PdfSignature(loadedDocument, loadedDocument.Pages[0], null, "Signature"); @@ -1058,12 +1129,8 @@ List certificates = new List(); certificates.Add(new X509Certificate2(Convert.FromBase64String(PublicCert))); signature.AddExternalSigner(externalSignature, certificates, null); -//Create file stream. -using (FileStream outputFileStream = new FileStream(Path.GetFullPath(@"Output.pdf"), FileMode.Create, FileAccess.ReadWrite)) -{ - //Save the PDF document to file stream. - loadedDocument.Save(outputFileStream); -} +//Save the document +loadedDocument.Save("Output.pdf"); //Close the document. loadedDocument.Close(true); @@ -1071,6 +1138,16 @@ loadedDocument.Close(true); {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf.Parsing; +using Syncfusion.Pdf.Security; +using Syncfusion.Drawing; +using System.Security.Cryptography.X509Certificates; +using System.Security.Cryptography; +using Org.BouncyCastle.Tsp; +using System.Net; +using System.Text; +using Org.BouncyCastle.Math; + //Load an existing PDF document. PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Input.pdf"); @@ -1098,6 +1175,16 @@ loadedDocument.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf.Parsing +Imports Syncfusion.Pdf.Security +Imports Syncfusion.Drawing +Imports System.Security.Cryptography.X509Certificates +Imports System.Security.Cryptography +Imports Org.BouncyCastle.Tsp +Imports System.Net +Imports System.Text +Imports Org.BouncyCastle.Math + 'Load an existing PDF document. Dim loadedDocument As PdfLoadedDocument = New PdfLoadedDocument("Input.pdf") @@ -1388,11 +1475,15 @@ You can create a Long Term validation (LTV) when signing PDF documents externall {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Digital%20Signature/Create-LTV-when-signing-PDF-documents-externally/.NET/Create-LTV-when-signing-PDF-documents-externally/Program.cs" %} - //Get the stream from the document. - FileStream documentStream = new FileStream(Path.GetFullPath(@"Data/Input.pdf"), FileMode.Open, FileAccess.Read); + using Syncfusion.Pdf; + using Syncfusion.Pdf.Parsing; + using Syncfusion.Pdf.Security; + using System.Security.Cryptography; + using System.Security.Cryptography.Pkcs; + using System.Security.Cryptography.X509Certificates; - //Load an existing PDF document. - PdfLoadedDocument document = new PdfLoadedDocument(documentStream); + //Load the PDF document + PdfLoadedDocument document = new PdfLoadedDocument("Input.pdf"); //Get the page of the existing PDF document. PdfLoadedPage loadedPage = document.Pages[0] as PdfLoadedPage; @@ -1403,14 +1494,13 @@ You can create a Long Term validation (LTV) when signing PDF documents externall //Hook up the ComputeHash event. signature.ComputeHash += Signature_ComputeHash; - //Save the document into stream - MemoryStream stream = new MemoryStream(); - document.Save(stream); + //Save the document. + document.Save("SignedDocument.pdf"); //Close the document document.Close(true); - //Load an existing PDF stream.. - PdfLoadedDocument loadedDocument = new PdfLoadedDocument(stream); + //Load an existing PDF stream. + PdfLoadedDocument loadedDocument = new PdfLoadedDocument("SignedDocument.pdf"); //Gets the first signature field of the PDF document PdfLoadedSignatureField signatureField = loadedDocument.Form.Fields[0] as PdfLoadedSignatureField; @@ -1422,12 +1512,9 @@ You can create a Long Term validation (LTV) when signing PDF documents externall //Create LTV with your public certificates. pdfSignature.CreateLongTermValidity(new List { x509 }); - //Save the PDF document - MemoryStream ms = new MemoryStream(); - loadedDocument.Save(ms); - //If the position is not set to '0' then the PDF will be empty - ms.Position = 0; - //Close the document + //Save the document + loadedDocument.Save("Output.pdf"); + //Close the document. loadedDocument.Close(true); void Signature_ComputeHash(object sender, PdfSignatureEventArgs ars) @@ -1454,6 +1541,13 @@ You can create a Long Term validation (LTV) when signing PDF documents externall {% highlight c# tabtitle="C# [Windows-specific]" %} + using Syncfusion.Pdf; + using Syncfusion.Pdf.Parsing; + using Syncfusion.Pdf.Security; + using System.Security.Cryptography; + using System.Security.Cryptography.Pkcs; + using System.Security.Cryptography.X509Certificates; + //Load an existing PDF document. PdfLoadedDocument document = new PdfLoadedDocument("Input.pdf"); @@ -1467,12 +1561,12 @@ You can create a Long Term validation (LTV) when signing PDF documents externall signature.ComputeHash += Signature_ComputeHash; //Save the document. - document.Save("SignedDocument"); + document.Save("SignedDocument.pdf"); //Close the document document.Close(true); //Load an existing PDF stream.. - PdfLoadedDocument loadedDocument = new PdfLoadedDocument("SignedDocument"); + PdfLoadedDocument loadedDocument = new PdfLoadedDocument("SignedDocument.pdf"); //Gets the first signature field of the PDF document PdfLoadedSignatureField signatureField = loadedDocument.Form.Fields[0] as PdfLoadedSignatureField; @@ -1512,6 +1606,13 @@ You can create a Long Term validation (LTV) when signing PDF documents externall {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} + Imports Syncfusion.Pdf + Imports Syncfusion.Pdf.Parsing + Imports Syncfusion.Pdf.Security + Imports System.Security.Cryptography + Imports System.Security.Cryptography.Pkcs + Imports System.Security.Cryptography.X509Certificates + ' Load an existing PDF document. Dim document As New PdfLoadedDocument("Input.pdf") @@ -1583,6 +1684,10 @@ The following code example shows how to sign a PDF document with LTA using [Time {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Digital%20Signature/Sign_PDF_with_LTA/.NET/Sign_PDF_with_LTA/Program.cs" %} +using Syncfusion.Pdf.Parsing; +using Syncfusion.Pdf.Security; +using Syncfusion.Pdf; + //Load existing PDF document. FileStream documentStream1 = new FileStream("PDF_Succinctly.pdf", FileMode.Open, FileAccess.Read); PdfLoadedDocument loadedDocument = new PdfLoadedDocument(documentStream1); @@ -1599,13 +1704,12 @@ signature.TimeStampServer = new TimeStampServer(new Uri("http://timestamping.ens signature.EnableLtv = true; //Save the PDF document. -MemoryStream stream = new MemoryStream(); -loadedDocument.Save(stream); +loadedDocument.Save("LTV_document.pdf"); //Close the document. loadedDocument.Close(true); //Load existing PDF document. -PdfLoadedDocument ltDocument = new PdfLoadedDocument(stream); +PdfLoadedDocument ltDocument = new PdfLoadedDocument("LTV_document.pdf"); //Load the existing PDF page. PdfLoadedPage lpage = ltDocument.Pages[0] as PdfLoadedPage; @@ -1613,22 +1717,19 @@ PdfLoadedPage lpage = ltDocument.Pages[0] as PdfLoadedPage; PdfSignature timeStamp = new PdfSignature(lpage, "timestamp"); timeStamp.TimeStampServer = new TimeStampServer(new Uri("http://timestamping.ensuredca.com")); -//Save and close the PDF document. -MemoryStream stream1 = new MemoryStream(); -ltDocument.Save(stream1); +//Save the document +ltDocument.Save("Output.pdf"); //Close the document. ltDocument.Close(true); -//Defining the ContentType for pdf file. -string contentType = "application/pdf"; -//Define the file name. -string fileName = "Output.pdf"; -//Creates a FileContentResult object by using the file contents, content type, and file name. -return File(stream1, contentType, fileName); {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf.Parsing; +using Syncfusion.Pdf.Security; +using Syncfusion.Pdf; + //Load existing PDF document. PdfLoadedDocument loadedDocument = new PdfLoadedDocument("PDF_Succinctly.pdf"); //Load digital ID with password. @@ -1663,6 +1764,10 @@ ltDocument.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf.Parsing +Imports Syncfusion.Pdf.Security +Imports Syncfusion.Pdf + 'Loads a PDF document. Dim loadedDocument As PdfLoadedDocument = New PdfLoadedDocument("PDF_Succinctly.pdf") 'Load digital ID with password. @@ -1717,6 +1822,11 @@ The following code example shows how to create a PDF digital signature using the {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Digital%20Signature/Sign_PDF_Windows_Certificate/.NET/Sign_PDF_Windows_Certificate/Program.cs" %} +using Syncfusion.Pdf.Parsing; +using Syncfusion.Pdf.Security; +using Syncfusion.Pdf; +using System.Security.Cryptography.X509Certificates; + //Initialize the Windows store. X509Store store = new X509Store("MY", StoreLocation.CurrentUser); store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly); @@ -1726,8 +1836,7 @@ X509Certificate2Collection fcollection = (X509Certificate2Collection)collection. X509Certificate2 digitalID = collection[0]; //Load existing PDF document. -FileStream documentStream = new FileStream("PDF_Succinctly.pdf", FileMode.Open, FileAccess.Read); -PdfLoadedDocument loadedDocument = new PdfLoadedDocument(documentStream); +PdfLoadedDocument loadedDocument = new PdfLoadedDocument("PDF_Succinctly.pdf"); //Load X509Certificate2. PdfCertificate certificate = new PdfCertificate(digitalID); @@ -1737,22 +1846,20 @@ PdfSignature signature = new PdfSignature(loadedDocument, loadedDocument.Pages[0 signature.Settings.CryptographicStandard = CryptographicStandard.CADES; signature.Settings.DigestAlgorithm = DigestAlgorithm.SHA512; -//Save the PDF document. -MemoryStream stream = new MemoryStream(); -loadedDocument.Save(stream); +//Save the document +loadedDocument.Save("Output.pdf"); //Close the document. loadedDocument.Close(true); -//Defining the ContentType for pdf file. -string contentType = "application/pdf"; -//Define the file name. -string fileName = "Output.pdf"; -//Creates a FileContentResult object by using the file contents, content type, and file name. -return File(stream, contentType, fileName); {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf.Parsing; +using Syncfusion.Pdf.Security; +using Syncfusion.Pdf; +using System.Security.Cryptography.X509Certificates; + //Initialize the Windows store. X509Store store = new X509Store("MY", StoreLocation.CurrentUser); store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly); @@ -1781,6 +1888,11 @@ loadedDocument.Close(true); {% highlight vb.net tabtitle="VB.NET" %} +Imports Syncfusion.Pdf.Parsing +Imports Syncfusion.Pdf.Security +Imports Syncfusion.Pdf +Imports System.Security.Cryptography.X509Certificates + 'Initialize the Windows store. Dim store As X509Store = New X509Store("MY", StoreLocation.CurrentUser) store.Open(OpenFlags.[ReadOnly] Or OpenFlags.OpenExistingOnly) @@ -1820,6 +1932,11 @@ Refer to the following code sample. {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Digital%20Signature/Adding-a-signature-validation-appearance-in-a-PDF/.NET/Adding-a-signature-validation-appearance-in-a-PDF/Program.cs" %} +using Syncfusion.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; +using Syncfusion.Pdf.Security; + //Creates a new PDF document PdfDocument document = new PdfDocument(); //Adds a new page @@ -1846,23 +1963,20 @@ signature.Reason = "I am author of this document."; //Draws the signature image signature.Appearance.Normal.Graphics.DrawImage(signatureImage, 0, 0); -//Save the document into stream -MemoryStream stream = new MemoryStream(); -document.Save(stream); -stream.Position = 0; -//Close the document +//Save the document +document.Save("Output.pdf"); +//Close the document. document.Close(true); -//Defining the ContentType for PDF file -string contentType = "application/pdf"; -//Define the file name -string fileName = "Output.pdf"; -//Creates a FileContentResult object by using the file contents, content type, and file name -return File(stream, contentType, fileName); {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using System.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; +using Syncfusion.Pdf.Security; + //Creates a new PDF document PdfDocument document = new PdfDocument(); //Add a new page @@ -1893,6 +2007,11 @@ document.Close( true ); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports System.Drawing +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Graphics +Imports Syncfusion.Pdf.Security + 'Creates a new PDF document Dim document As New PdfDocument() 'Adds a new page @@ -1934,6 +2053,11 @@ Essential® PDF allows you to add timestamp in the digital signatu {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Digital%20Signature/Adding-a-timestamp-in-digital-signature-of-PDF/.NET/Adding-a-timestamp-in-digital-signature-of-PDF/Program.cs" %} +using Syncfusion.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; +using Syncfusion.Pdf.Security; + //Creates a new PDF document PdfDocument document = new PdfDocument(); //Adds a new page @@ -1960,23 +2084,20 @@ signature.Reason = "I am author of this document."; //Draws the signature image signature.Appearance.Normal.Graphics.DrawImage(image, 0, 0); -//Save the document into stream -MemoryStream stream = new MemoryStream(); -document.Save(stream); -stream.Position = 0; -//Close the document +//Save the document +document.Save("Output.pdf"); +//Close the document. document.Close(true); -//Defining the ContentType for pdf file -string contentType = "application/pdf"; -//Define the file name -string fileName = "Output.pdf"; -//Creates a FileContentResult object by using the file contents, content type, and file name -return File(stream, contentType, fileName); {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using System.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; +using Syncfusion.Pdf.Security; + //Creates a new PDF document PdfDocument document = new PdfDocument(); //Adds a new page @@ -2011,6 +2132,11 @@ document.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports System.Drawing +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Graphics +Imports Syncfusion.Pdf.Security + 'Creates a new PDF document Dim document As New PdfDocument() 'Adds a new page @@ -2052,6 +2178,9 @@ You can add timestamp to the PDF document using [TimeStampServer](https://help.s {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Digital%20Signature/Adding-a-timestamp-to-PDF-document/.NET/Adding-a-timestamp-to-PDF-document/Program.cs" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Security; + //Create a new pdf document PdfDocument document = new PdfDocument(); //Adds a new page @@ -2062,23 +2191,18 @@ PdfSignature signature = new PdfSignature(page, "Signature"); //Add the time stamp by using the server URI signature.TimeStampServer = new TimeStampServer(new Uri("http://syncfusion.digistamp.com"), "user", "123456"); -//Save the document into stream -MemoryStream stream = new MemoryStream(); -document.Save(stream); -stream.Position = 0; -//Close the document +//Save the document +document.Save("Output.pdf"); +//Close the document. document.Close(true); -//Defining the ContentType for pdf file -string contentType = "application/pdf"; -//Define the file name -string fileName = "Output.pdf"; -//Creates a FileContentResult object by using the file contents, content type, and file name -return File(stream, contentType, fileName); {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Security; + //Create a new PDF document PdfDocument document = new PdfDocument(); //Add a new page @@ -2097,6 +2221,9 @@ document.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Security + 'Creates a new PDF document Dim document As New PdfDocument() 'Adds a new page @@ -2125,9 +2252,12 @@ You can add timestamp to the existing PDF document using [TimeStampServer](https {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Digital%20Signature/Adding-a-timestamp-to-an-existing-PDF/.NET/Adding-a-timestamp-to-an-existing-PDF/Program.cs" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Parsing; +using Syncfusion.Pdf.Security; + //Load the PDF document -FileStream docStream = new FileStream("Input.pdf", FileMode.Open, FileAccess.Read); -PdfLoadedDocument loadedDocument = new PdfLoadedDocument(docStream); +PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Input.pdf"); //Gets the page PdfLoadedPage page = loadedDocument.Pages[0] as PdfLoadedPage; @@ -2136,23 +2266,19 @@ PdfSignature signature = new PdfSignature(page, "Signature"); //Add the time stamp by using the server URI signature.TimeStampServer = new TimeStampServer(new Uri("http://syncfusion.digistamp.com"), "user", "123456"); -//Save the document into stream -MemoryStream stream = new MemoryStream(); -loadedDocument.Save(stream); -stream.Position = 0; -//Close the document +//Save the document +loadedDocument.Save("Output.pdf"); +//Close the document. loadedDocument.Close(true); -//Defining the ContentType for pdf file -string contentType = "application/pdf"; -//Define the file name -string fileName = "Output.pdf"; -//Creates a FileContentResult object by using the file contents, content type, and file name -return File(stream, contentType, fileName); {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Parsing; +using Syncfusion.Pdf.Security; + //Load the existing PDF document PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Input.pdf"); //Add a new page @@ -2172,6 +2298,10 @@ loadedDocument.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf.Parsing +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Security + 'Load the PDF document Dim document As New PdfLoadedDocument("Input.pdf") 'Gets the first page of the document @@ -2209,9 +2339,11 @@ You can get the above certificate details from an existing signed PDF document u {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Digital%20Signature/Retrieve-certificate-details-from-an-existing-PDF/.NET/Retrieve-certificate-details-from-an-existing-PDF/Program.cs" %} +using Syncfusion.Pdf.Parsing; +using Syncfusion.Pdf.Security; + //Load the PDF document -FileStream docStream = new FileStream("Input.pdf", FileMode.Open, FileAccess.Read); -PdfLoadedDocument loadedDocument = new PdfLoadedDocument(docStream); +PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Input.pdf"); //Get the signature field PdfLoadedSignatureField signatureField = loadedDocument.Form.Fields[0] as PdfLoadedSignatureField; @@ -2236,6 +2368,9 @@ loadedDocument.Close(true); {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf.Parsing; +using Syncfusion.Pdf.Security; + //Load the existing signed PDF PdfLoadedDocument loadedDocument = new PdfLoadedDocument("SignedDocument.pdf"); //Load the PDF form @@ -2268,6 +2403,9 @@ loadedDocument.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf.Parsing +Imports Syncfusion.Pdf.Security + 'Load the existing signed PDF Dim loadedDocument As PdfLoadedDocument = New PdfLoadedDocument("../../Signed.pdf") 'Load the PDF form @@ -2314,6 +2452,11 @@ The following code example explains how to create LTV PDF using [EnableLtv](http {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Digital%20Signature/Enable-LTV-PDF-signature/.NET/Enable-LTV-PDF-signature/Program.cs" %} + using Syncfusion.Drawing; + using Syncfusion.Pdf; + using Syncfusion.Pdf.Graphics; + using Syncfusion.Pdf.Parsing; + using Syncfusion.Pdf.Security; //Creates a new PDF document. PdfDocument document = new PdfDocument(); @@ -2333,14 +2476,12 @@ The following code example explains how to create LTV PDF using [EnableLtv](http signature.Settings.CryptographicStandard = CryptographicStandard.CADES; signature.Settings.DigestAlgorithm = DigestAlgorithm.SHA256; - //Save the document into stream - MemoryStream stream = new MemoryStream(); - document.Save(stream); + document.Save("SignedDocument.pdf"); //Close the document document.Close(true); //Load an existing PDF stream. - PdfLoadedDocument loadedDocument = new PdfLoadedDocument(stream); + PdfLoadedDocument loadedDocument = new PdfLoadedDocument("SignedDocument.pdf"); //Gets the first signature field of the PDF document PdfLoadedSignatureField signatureField = loadedDocument.Form.Fields[0] as PdfLoadedSignatureField; @@ -2349,11 +2490,9 @@ The following code example explains how to create LTV PDF using [EnableLtv](http //Enable LTV on Signature. pdfSignature.EnableLtv = true; - //Save the document into stream - MemoryStream ms = new MemoryStream(); - loadedDocument.Save(ms); - stream.ms = 0; - //Close the document + //Save the document + loadedDocument.Save("Output.pdf"); + //Close the document. loadedDocument.Close(true); @@ -2361,6 +2500,12 @@ The following code example explains how to create LTV PDF using [EnableLtv](http {% highlight c# tabtitle="C# [Windows-specific]" %} + using System.Drawing; + using Syncfusion.Pdf; + using Syncfusion.Pdf.Graphics; + using Syncfusion.Pdf.Parsing; + using Syncfusion.Pdf.Security; + //Creates a new PDF document. PdfDocument document = new PdfDocument(); @@ -2402,6 +2547,12 @@ The following code example explains how to create LTV PDF using [EnableLtv](http {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} + Imports System.Drawing + Imports Syncfusion.Pdf + Imports Syncfusion.Pdf.Graphics + Imports Syncfusion.Pdf.Parsing + Imports Syncfusion.Pdf.Security + ' Creates a new PDF document. Dim document As New PdfDocument() @@ -2459,6 +2610,11 @@ The following code example explains how to add a digital signature with [cryptog {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Digital%20Signature/Adding-a-digital-signature-with-CAdES-format/.NET/Adding-a-digital-signature-with-CAdES-format/Program.cs" %} +using Syncfusion.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; +using Syncfusion.Pdf.Security; + //Create a new PDF document PdfDocument document = new PdfDocument(); //Add a new page @@ -2487,23 +2643,20 @@ signature.Reason = "I am author of this document."; //Draws the signature image signature.Appearance.Normal.Graphics.DrawImage(signatureImage, 0, 0); -//Save the document into stream -MemoryStream stream = new MemoryStream(); -document.Save(stream); -stream.Position = 0; -//Close the document +//Save the document +document.Save("Output.pdf"); +//Close the document. document.Close(true); -//Defining the ContentType for pdf file -string contentType = "application/pdf"; -//Define the file name -string fileName = "Output.pdf"; -//Creates a FileContentResult object by using the file contents, content type, and file name -return File(stream, contentType, fileName); {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using System.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; +using Syncfusion.Pdf.Security; + //Creates a new PDF document PdfDocument document = new PdfDocument(); //Adds a new page @@ -2537,6 +2690,11 @@ document.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports System.Drawing +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Graphics +Imports Syncfusion.Pdf.Security + 'Creates a new PDF document Dim document As New PdfDocument() 'Adds a new page @@ -2589,6 +2747,11 @@ The following code example explains how to add a digital signature with various {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Digital%20Signature/Add-digital-signature-with-digest-algorithm/.NET/Add-digital-signature-with-digest-algorithm/Program.cs" %} +using Syncfusion.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; +using Syncfusion.Pdf.Security; + //Create a new PDF document PdfDocument document = new PdfDocument(); //Add a new page @@ -2617,23 +2780,20 @@ signature.Reason = "I am author of this document."; //Draws the signature image signature.Appearance.Normal.Graphics.DrawImage(signatureImage, 0, 0); -//Save the document into stream -MemoryStream stream = new MemoryStream(); -document.Save(stream); -stream.Position = 0; -//Close the document +//Save the document +document.Save("Output.pdf"); +//Close the document. document.Close(true); -//Defining the ContentType for pdf file -string contentType = "application/pdf"; -//Define the file name -string fileName = "Output.pdf"; -//Creates a FileContentResult object by using the file contents, content type, and file name -return File(stream, contentType, fileName); {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using System.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; +using Syncfusion.Pdf.Security; + //Create a new PDF document PdfDocument document = new PdfDocument(); //Add a new page @@ -2667,6 +2827,11 @@ document.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports System.Drawing +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Graphics +Imports Syncfusion.Pdf.Security + 'Creates a new PDF document Dim document As New PdfDocument() 'Adds a new page @@ -2722,11 +2887,12 @@ The following code example explains how to validate the digitally signed PDF doc {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Digital%20Signature/Validate-the-digitally-signed-PDF-signature/.NET/Validate-the-digitally-signed-PDF-signature/Program.cs" %} -// Load the input PDF document stream from the specified file path -FileStream documentStream = new FileStream(Path.GetFullPath(@"Data/Input.pdf"), FileMode.Open, FileAccess.Read); +using Syncfusion.Pdf.Parsing; +using Syncfusion.Pdf.Security; +using System.Security.Cryptography.X509Certificates; -// Load the signed PDF document using the stream -PdfLoadedDocument loadedDocument = new PdfLoadedDocument(documentStream); +// Load the signed PDF document +PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Input.pdf"); // Retrieve the first signature field from the PDF form PdfLoadedSignatureField signatureField = loadedDocument.Form.Fields[0] as PdfLoadedSignatureField; @@ -2856,11 +3022,12 @@ loadedDocument.Close(true); {% highlight c# tabtitle="C# [Windows-specific]" %} -// Load the input PDF document stream from the specified file path -FileStream documentStream = new FileStream(Path.GetFullPath(@"Data/Input.pdf"), FileMode.Open, FileAccess.Read); +using Syncfusion.Pdf.Parsing; +using Syncfusion.Pdf.Security; +using System.Security.Cryptography.X509Certificates; -// Load the signed PDF document using the stream -PdfLoadedDocument loadedDocument = new PdfLoadedDocument(documentStream); +// Load the signed PDF document +PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Input.pdf"); // Retrieve the first signature field from the PDF form PdfLoadedSignatureField signatureField = loadedDocument.Form.Fields[0] as PdfLoadedSignatureField; @@ -2990,11 +3157,12 @@ loadedDocument.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} -' Load the input PDF document stream from the specified file path -Dim documentStream As New FileStream(Path.GetFullPath("Data/Input.pdf"), FileMode.Open, FileAccess.Read) +Imports Syncfusion.Pdf.Parsing +Imports Syncfusion.Pdf.Security +Imports System.Security.Cryptography.X509Certificates ' Load the signed PDF document using the stream -Dim loadedDocument As New PdfLoadedDocument(documentStream) +Dim loadedDocument As New PdfLoadedDocument("Input.pdf") ' Retrieve the first signature field from the PDF form Dim signatureField As PdfLoadedSignatureField = TryCast(loadedDocument.Form.Fields(0), PdfLoadedSignatureField) @@ -3127,10 +3295,12 @@ The following code example explains how to validate all the signatures in digita {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Digital%20Signature/Validate-all-signatures-in-digitally-signed-PDF/.NET/Validate-all-signatures-in-digitally-signed-PDF/Program.cs" %} -//Get the stream from the document -FileStream documentStream = new FileStream("Input.pdf", FileMode.Open, FileAccess.Read); -//Load an existing signed PDF document -PdfLoadedDocument loadedDocument = new PdfLoadedDocument(documentStream); +using Syncfusion.Pdf.Parsing; +using Syncfusion.Pdf.Security; +using System.Security.Cryptography.X509Certificates; + +//Load the PDF document +PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Input.pdf"); //X509Certificate2Collection to check the signer's identity using root certificates X509Certificate2Collection collection = new X509Certificate2Collection(); @@ -3153,6 +3323,10 @@ loadedDocument.Close(true); {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf.Parsing; +using Syncfusion.Pdf.Security; +using System.Security.Cryptography.X509Certificates; + //Load an existing signed PDF document PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Input.pdf"); @@ -3173,6 +3347,10 @@ loadedDocument.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf.Parsing +Imports Syncfusion.Pdf.Security +Imports System.Security.Cryptography.X509Certificates + 'Load an existing signed PDF document Dim loadedDocument As PdfLoadedDocument = New PdfLoadedDocument("Input.pdf") @@ -3205,6 +3383,9 @@ This example shows how to validate and identify different types of digital signa {% highlight c# tabtitle="C# [Cross-platform]" %} +using Syncfusion.Pdf.Parsing; +using Syncfusion.Pdf.Security; + //Get the stream from the document FileStream documentStream = new FileStream("Input.pdf", FileMode.Open, FileAccess.Read); // Load the signed PDF document @@ -3278,6 +3459,9 @@ for (int i = form.Fields.Count - 1; i >= 0; i--) {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf.Parsing; +using Syncfusion.Pdf.Security; + // Load the signed PDF document PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Signed PDF.pdf"); @@ -3349,6 +3533,9 @@ for (int i = form.Fields.Count - 1; i >= 0; i--) {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf.Parsing +Imports Syncfusion.Pdf.Security + ' Load the signed PDF document Dim loadedDocument As New PdfLoadedDocument("Signed PDF.pdf") @@ -3420,10 +3607,14 @@ Steps for deferred signing: {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/refs/heads/master/Digital%20Signature/Deferred-signing-in-PDF-document/.NET/Deferred-signing-in-PDF-document/Program.cs" %} -//Get the stream from the document. -FileStream documentStream = new FileStream("PDF_Succinctly.pdf ", FileMode.Open, FileAccess.Read); -//Load an existing PDF document. -PdfLoadedDocument loadedDocument = new PdfLoadedDocument(documentStream); +using Syncfusion.Drawing; +using Syncfusion.Pdf.Parsing; +using Syncfusion.Pdf.Security; +using System.Security.Cryptography; +using System.Security.Cryptography.X509Certificates; + +//Load the PDF document +PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Input.pdf"); //Creates a digital signature. PdfSignature signature = new PdfSignature(loadedDocument, loadedDocument.Pages[0], null, "Signature"); @@ -3439,17 +3630,10 @@ System.Collections.Generic.List certificates = new System.Coll certificates.Add(new X509Certificate2(Convert.FromBase64String(PublicCert))); signature.AddExternalSigner(externalSignature, certificates, null); -//Save the document. -MemoryStream stream = new MemoryStream(); -loadedDocument.Save(stream); -//Close the PDF document. +//Save the document +loadedDocument.Save("Output.pdf"); +//Close the document. loadedDocument.Close(true); -//Defining the ContentType for a PDF file. -string contentType = "application/pdf"; -//Define the file name. -string fileName = "Output.pdf"; -//Creates a FileContentResult object by using the file contents, content type, and file name. -return File(stream, contentType, fileName); void DeferredSign() { @@ -3542,6 +3726,12 @@ class ExternalSigner : IPdfExternalSigner {% highlight c# tabtitle="C# [Windows-specific]" %} +using System.Drawing; +using Syncfusion.Pdf.Parsing; +using Syncfusion.Pdf.Security; +using System.Security.Cryptography; +using System.Security.Cryptography.X509Certificates; + //Load an existing PDF document. PdfLoadedDocument loadedDocument = new PdfLoadedDocument("PDF_Succinctly.pdf"); @@ -3655,6 +3845,11 @@ class ExternalSigner : IPdfExternalSigner {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports System.Drawing +Imports Syncfusion.Pdf.Parsing +Imports Syncfusion.Pdf.Security +Imports System.Security.Cryptography + 'Load an existing PDF document. Dim loadedDocument As PdfLoadedDocument = New PdfLoadedDocument("PDF_Succinctly.pdf") @@ -3770,6 +3965,10 @@ The following code sample shows how to add the estimated size of the signature i {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Digital%20Signature/Adding-the-estimated-size-of-the-signature/.NET/Adding-the-estimated-size-of-the-signature/Program.cs" %} +using Syncfusion.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Security; + //Creating a new PDF Document. PdfDocument document = new PdfDocument(); //Adding a new page to the PDF document. @@ -3784,25 +3983,19 @@ signature.Bounds = new Rectangle(10, 20, 400, 200); //Sets the estimated size of the signature. signature.EstimatedSignatureSize = 20000; -//Creating the stream object. -MemoryStream stream = new MemoryStream(); -//Save the document into stream. -document.Save(stream); -//If the position is not set to '0,' then the PDF will be empty. -stream.Position = 0; +//Save the document +document.Save("Output.pdf"); //Close the document. document.Close(true); -//Defining the ContentType for a PDF file. -string contentType = "application/pdf"; -//Define the file name. -string fileName = "Output.pdf"; -//Creates a FileContentResult object by using the file contents, content type, and file name. -return File(stream, contentType, fileName); {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using System.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Security; + //Creating a new PDF Document. PdfDocument document = new PdfDocument(); //Adding a new page to the PDF document. @@ -3825,6 +4018,10 @@ document.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports System.Drawing +Imports Syncfusion.Pdf.Parsing +Imports Syncfusion.Pdf.Security + 'Creating a new PDF Document. Dim document As PdfDocument = New PdfDocument() 'Adding a new page to the PDF document. @@ -3862,10 +4059,13 @@ Steps for deferred signing: {% highlight c# tabtitle="C# [Cross-platform]" %} -//Get the stream from a document. -FileStream documentStream = new FileStream("PDF_Succinctly.pdf ", FileMode.Open, FileAccess.Read); +using Syncfusion.Drawing; +using Syncfusion.Pdf.Parsing; +using Syncfusion.Pdf.Security; +using System.Security.Cryptography.X509Certificates; + //Load an existing PDF document. -PdfLoadedDocument loadedDocument = new PdfLoadedDocument(documentStream); +PdfLoadedDocument loadedDocument = new PdfLoadedDocument("PDF_Succinctly.pdf"); //Creates a digital signature. PdfSignature signature = new PdfSignature(loadedDocument, loadedDocument.Pages[0], null, "Signature"); @@ -3881,16 +4081,9 @@ System.Collections.Generic.List certificates = new System.Coll signature.AddExternalSigner(externalSignature, certificates, null); //Save a document. -MemoryStream stream = new MemoryStream(); -loadedDocument.Save(stream); -//Close a PDF document. +loadedDocument.Save("EmptySignature.pdf"); +//Close a document. loadedDocument.Close(true); -//Defining the ContentType for a PDF file. -string contentType = "application/pdf"; -//Define the file name. -string fileName = "Output.pdf"; -//Creates a FileContentResult object by using the file contents, content type, and file name. -return File(stream, contentType, fileName); //Create an external signer with a signed hash message. IPdfExternalSigner externalSigner = new ExternalSigner("SHA1"); @@ -3899,8 +4092,8 @@ System.Collections.Generic.List publicCertificates = new Syste publicCertificates.Add(new X509Certificate2(Convert.FromBase64String(PublicCert))); //Create an output file stream. -MemoryStream outputFileStream = new MemoryStream(); -// Get the stream from a document. +MemoryStream outputFileStream = new MemoryStream(); +//Get the stream from a document. FileStream inputFileStream = new FileStream("EmptySignature.pdf", FileMode.Open, FileAccess.Read); string pdfPassword = string.Empty; //Deferred signing without PKCS7 encoding. @@ -3960,6 +4153,11 @@ class ExternalSigner : IPdfExternalSigner {% highlight c# tabtitle="C# [Windows-specific]" %} +using System.Drawing; +using Syncfusion.Pdf.Parsing; +using Syncfusion.Pdf.Security; +using System.Security.Cryptography.X509Certificates; + //Load an existing PDF document. PdfLoadedDocument loadedDocument = new PdfLoadedDocument("PDF_Succinctly.pdf"); @@ -4049,6 +4247,11 @@ class ExternalSigner : IPdfExternalSigner {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports System.Drawing +Imports Syncfusion.Pdf.Parsing +Imports Syncfusion.Pdf.Security +Imports System.Security.Cryptography.X509Certificates + 'Load an existing PDF document. Dim loadedDocument As PdfLoadedDocument = New PdfLoadedDocument("PDF_Succinctly.pdf") @@ -4147,47 +4350,46 @@ The following code example illustrates how to draw text/images in a digital appe {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Digital%20Signature/Draw-text-or-images-in-the-signature-appearance/.NET/Draw-text-or-images-in-the-signature-appearance/Program.cs" %} -//Create a new PDF document. +using Syncfusion.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; +using Syncfusion.Pdf.Security; + +//Creates a new PDF document. PdfDocument document = new PdfDocument(); -//Add a new page. +//Adds a new page. PdfPageBase page = document.Pages.Add(); //Create PDF graphics for the page. PdfGraphics graphics = page.Graphics; -//Create a certificate instance from a PFX file with a private key. -FileStream certificateStream = new FileStream("PDF.pfx", FileMode.Open, FileAccess.Read); -PdfCertificate pdfCert = new PdfCertificate(certificateStream, "password123"); -//Create a digital signature. +//Creates a certificate instance from PFX file with private key. +PdfCertificate pdfCert = new PdfCertificate(@"PDF.pfx", "password123"); +//Creates a digital signature. PdfSignature signature = new PdfSignature(document, page, pdfCert, "Signature"); -//Set an image for signature field. -FileStream imageStream = new FileStream("signature.jpg", FileMode.Open, FileAccess.Read); -//Set an image for signature field. -PdfBitmap signatureImage = new PdfBitmap(imageStream); -//Set the signature information. -signature.Bounds = new RectangleF(new PointF(0, 0), signatureImage.PhysicalDimension); +//Sets an image for signature field. +PdfBitmap signatureImage = new PdfBitmap(@"signature.png"); +//Sets signature information. +signature.Bounds = new RectangleF(0,0,200,100); signature.ContactInfo = "johndoe@owned.us"; signature.LocationInfo = "Honolulu, Hawaii"; signature.Reason = "I am author of this document."; -//Create appearance for the digital signature. +//Create appearance for the digital siganture. signature.Appearance.Normal.Graphics.DrawImage(signatureImage, signature.Bounds); -//Save the document into stream. -MemoryStream stream = new MemoryStream(); -document.Save(stream); -stream.Position = 0; +//Save the document. +document.Save("DigitalSignature.pdf"); //Close the document. document.Close(true); -//Define the ContentType for pdf file. -string contentType = "application/pdf"; -//Define the file name. -string fileName = "Output.pdf"; -//Create a FileContentResult object by using the file contents, content type, and file name. -return File(stream, contentType, fileName); {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using System.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; +using Syncfusion.Pdf.Security; + //Creates a new PDF document. PdfDocument document = new PdfDocument(); //Adds a new page. @@ -4218,6 +4420,11 @@ document.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports System.Drawing +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Graphics +Imports Syncfusion.Pdf.Security + 'Create a new PDF document. Dim document As New PdfDocument() 'Add a new page. @@ -4257,11 +4464,11 @@ Added support for LTV validation and getting CRL and OCSP embedded details from {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Digital%20Signature/Get-LTV-information/.NET/Get-LTV-information/Program.cs" %} -//Gets the stream from the document -FileStream documentStream = new FileStream(Path.GetFullPath(@"Data/Input.pdf"), FileMode.Open, FileAccess.Read); +using Syncfusion.Pdf.Parsing; +using Syncfusion.Pdf.Security; -//Loads an existing signed PDF document -PdfLoadedDocument document = new PdfLoadedDocument(documentStream); +//Load the PDF document +PdfLoadedDocument document = new PdfLoadedDocument("Input.pdf"); // Gets the signature field PdfLoadedSignatureField signatureField = document.Form.Fields[0] as PdfLoadedSignatureField; @@ -4292,11 +4499,11 @@ document.Close(true); {% highlight c# tabtitle="C# [Windows-specific]" %} -//Gets the stream from the document -FileStream documentStream = new FileStream(Path.GetFullPath(@"Data/Input.pdf"), FileMode.Open, FileAccess.Read); +using Syncfusion.Pdf.Parsing; +using Syncfusion.Pdf.Security; -//Loads an existing signed PDF document -PdfLoadedDocument document = new PdfLoadedDocument(documentStream); +//Load the PDF document +PdfLoadedDocument document = new PdfLoadedDocument("Input.pdf"); // Gets the signature field PdfLoadedSignatureField signatureField = document.Form.Fields[0] as PdfLoadedSignatureField; @@ -4327,11 +4534,11 @@ document.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} -' Gets the stream from the document -Dim documentStream As New FileStream(Path.GetFullPath("Data/Input.pdf"), FileMode.Open, FileAccess.Read) +Imports Syncfusion.Pdf.Parsing +Imports Syncfusion.Pdf.Security ' Loads an existing signed PDF document -Dim document As New PdfLoadedDocument(documentStream) +Dim document As New PdfLoadedDocument("Input.pdf") ' Gets the signature field Dim signatureField As PdfLoadedSignatureField = TryCast(document.Form.Fields(0), PdfLoadedSignatureField) @@ -4372,11 +4579,11 @@ Added support to customize revocation validation using [PdfSignatureValidationOp {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Digital%20Signature/Customized-revocation-validation/.NET/Customized-revocation-validation/Program.cs" %} -//Gets the stream from the document -FileStream documentStream = new FileStream(Path.GetFullPath(@"Data/Input.pdf"), FileMode.Open, FileAccess.Read); +using Syncfusion.Pdf.Parsing; +using Syncfusion.Pdf.Security; -//Loads an existing signed PDF document -PdfLoadedDocument document = new PdfLoadedDocument(documentStream); +//Load the PDF document +PdfLoadedDocument document = new PdfLoadedDocument("Input.pdf"); // Gets the signature field PdfLoadedSignatureField signatureField = document.Form.Fields[0] as PdfLoadedSignatureField; @@ -4407,11 +4614,11 @@ document.Close(true); {% highlight c# tabtitle="C# [Windows-specific]" %} -//Gets the stream from the document -FileStream documentStream = new FileStream(Path.GetFullPath(@"Data/Input.pdf"), FileMode.Open, FileAccess.Read); +using Syncfusion.Pdf.Parsing; +using Syncfusion.Pdf.Security; -//Loads an existing signed PDF document -PdfLoadedDocument document = new PdfLoadedDocument(documentStream); +//Load the PDF document +PdfLoadedDocument document = new PdfLoadedDocument("Input.pdf"); // Gets the signature field PdfLoadedSignatureField signatureField = document.Form.Fields[0] as PdfLoadedSignatureField; @@ -4442,6 +4649,9 @@ document.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf.Parsing +Imports Syncfusion.Pdf.Security + ' Gets the stream from the document Dim documentStream As New FileStream(Path.GetFullPath("Data/Input.pdf"), FileMode.Open, FileAccess.Read) @@ -4484,32 +4694,26 @@ The following code example illustrates how to remove existing digital signatures {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Digital%20Signature/Remove_existing_digital_signature_from_PDF/.NET/Remove_existing_digital_signature_from_PDF/Program.cs" %} +using Syncfusion.Pdf.Parsing; + //Load an existing PDF document. -FileStream docStream = new FileStream("Input.pdf", FileMode.Open, FileAccess.Read); -PdfLoadedDocument pdfLoadedDocument = new PdfLoadedDocument(docStream); +PdfLoadedDocument pdfLoadedDocument = new PdfLoadedDocument("Input.pdf"); //Get the signature field from PDF form field collection. PdfLoadedSignatureField signatureField = pdfLoadedDocument.Form.Fields[0] as PdfLoadedSignatureField; //Remove signature field from form field collection. pdfLoadedDocument.Form.Fields.Remove(signatureField); -//Save the document into stream. -MemoryStream stream = new MemoryStream(); -pdfLoadedDocument.Save(stream); -stream.Position = 0; -//Close the document. +//Save and close the PDF document. +pdfLoadedDocument.Save("RemoveDigital.pdf"); pdfLoadedDocument.Close(true); -//Defining the ContentType for PDF file. -string contentType = "application/pdf"; -//Define the file name. -string fileName = "Output.pdf"; -//Creates a FileContentResult object by using the file contents, content type, and file name. -return File(stream, contentType, fileName); {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf.Parsing; + //Load an existing PDF document. PdfLoadedDocument pdfLoadedDocument = new PdfLoadedDocument("Input.pdf"); @@ -4526,6 +4730,8 @@ pdfLoadedDocument.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf.Parsing + 'Load an existing PDF document. Dim pdfLoadedDocument As PdfLoadedDocument = New PdfLoadedDocument("Input.pdf") @@ -4552,12 +4758,13 @@ The following code snippet illustrates how to sign a PDF document without showin {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Digital%20Signature/Sign-PDF-without-showing-digital-signature/.NET/Sign-PDF-without-showing-digital-signature/Program.cs" %} -//Get stream from an existing PDF document. -FileStream docStream = new FileStream("Input.pdf", FileMode.Open, FileAccess.Read); -PdfLoadedDocument loadedDocument = new PdfLoadedDocument(docStream); +using Syncfusion.Pdf.Parsing; +using Syncfusion.Pdf.Security; + +//Load an existing PDF document. +PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Input.pdf"); //Load digital ID with password. -FileStream certificateStream = new FileStream("PDF.pfx", FileMode.Open, FileAccess.Read); -PdfCertificate certificate = new PdfCertificate(certificateStream, "password123"); +PdfCertificate certificate = new PdfCertificate(@"PDF.pfx", "password123"); //Create a signature with loaded digital ID. PdfSignature signature = new PdfSignature(loadedDocument, loadedDocument.Pages[0], certificate, "DigitalSignature"); @@ -4568,23 +4775,17 @@ signature.Certificated = true; //Allow the form fill and and comments. signature.DocumentPermissions = PdfCertificationFlags.AllowFormFill | PdfCertificationFlags.AllowComments; -//Save the document into stream. -MemoryStream stream = new MemoryStream(); -document.Save(stream); -stream.Position = 0; -//Close the document. -document.Close(true); -//Defining the ContentType for pdf file. -string contentType = "application/pdf"; -//Define the file name. -string fileName = "Output.pdf"; -//Creates a FileContentResult object by using the file contents, content type, and file name. -return File(stream, contentType, fileName); +//Save and close the PDF document. +loadedDocument.Save("Certifying.pdf"); +loadedDocument.Close(true); {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf.Parsing; +using Syncfusion.Pdf.Security; + //Load an existing PDF document. PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Input.pdf"); //Load digital ID with password. @@ -4607,6 +4808,9 @@ loadedDocument.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf.Parsing +Imports Syncfusion.Pdf.Security + 'Load an existing PDF document. Dim loadedDocument As PdfLoadedDocument = New PdfLoadedDocument("Input.pdf") 'Load digital ID with password. @@ -4639,9 +4843,11 @@ The following code snippet illustrates how to retrieve digital signature informa {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Digital%20Signature/Retrieve-digital-signature-information-from-PDF/.NET/Retrieve-digital-signature-information-from-PDF/Program.cs" %} -//Get stream from an existing PDF document. -FileStream docStream = new FileStream("Input.pdf", FileMode.Open, FileAccess.Read); -PdfLoadedDocument loadedDocument = new PdfLoadedDocument(docStream); +using Syncfusion.Pdf.Parsing; +using Syncfusion.Pdf.Security; + +//Load the PDF document +PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Input.pdf"); //Get the signature field from PdfLoadedDocument form field collection. PdfLoadedSignatureField signatureField = loadedDocument.Form.Fields[0] as PdfLoadedSignatureField; @@ -4661,6 +4867,9 @@ loadedDocument.Close(true); {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf.Parsing; +using Syncfusion.Pdf.Security; + //Load an existing PDF document. PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Input.pdf"); @@ -4682,6 +4891,9 @@ loadedDocument.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf.Parsing +Imports Syncfusion.Pdf.Security + 'Load an existing PDF document. Dim loadedDocument As PdfLoadedDocument = New PdfLoadedDocument("Input.pdf") @@ -4715,23 +4927,25 @@ N> It is recommended to use licensed assemblies or registered license keys in yo {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/refs/heads/master/Digital%20Signature/Multiple-digital-signature/.NET/Multiple-digital-signature/Program.cs" %} -//Load the PDF document. -FileStream docStream = new FileStream("SignatureFields.pdf", FileMode.Open, FileAccess.Read); -PdfLoadedDocument loadedDocument = new PdfLoadedDocument(docStream); +using Syncfusion.Pdf.Graphics; +using Syncfusion.Pdf.Parsing; +using Syncfusion.Pdf.Security; +using Syncfusion.Pdf; + +//Load an existing PDF document. +PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Input.pdf"); //Get the first page of the document. PdfLoadedPage page = loadedDocument.Pages[0] as PdfLoadedPage; //Get the first signature field of the PDF document. PdfLoadedSignatureField signatureField1 = loadedDocument.Form.Fields[0] as PdfLoadedSignatureField; -//Creates a certificate. -FileStream certificateStream1 = new FileStream("PDF.pfx", FileMode.Open, FileAccess.Read); -PdfCertificate certificate1 = new PdfCertificate(certificateStream1, "password123"); -//Add signature to the signature field. +//Create a certificate instance from a PFX file with a private key. +PdfCertificate certificate1 = new PdfCertificate("PDF.pfx", "password123"); +//Add a signature to the signature field. signatureField1.Signature = new PdfSignature(loadedDocument, page, certificate1, "Signature", signatureField1); -//Get the image as a stream. -FileStream imageStream = new FileStream("Student Signature.jpg", FileMode.Open, FileAccess.Read); -PdfBitmap signatureImage = new PdfBitmap(imageStream); -//Draw an image in signature appearance. +//Set an image for the signature field. +PdfBitmap signatureImage = new PdfBitmap(@"Student Signature.jpg"); +//Insert an image in the signature appearance. signatureField1.Signature.Appearance.Normal.Graphics.DrawImage(signatureImage, 0, 0, 90, 20); //Save the document into the stream. @@ -4745,33 +4959,28 @@ PdfLoadedPage loadedPage = signedDocument.Pages[0] as PdfLoadedPage; //Get the first signature field of the PDF document. PdfLoadedSignatureField signatureField2 = signedDocument.Form.Fields[1] as PdfLoadedSignatureField; -//Add the signature to the signature field. -signatureField1.Signature = new PdfSignature(signedDocument, loadedPage, certificate1, "Signature", signatureField2); -//Load the image as a stream. -FileStream imageStream1 = new FileStream("Teacher Signature.png", FileMode.Open, FileAccess.Read); -PdfBitmap signatureImage1 = new PdfBitmap(imageStream1); -//Draw the image in signature appearance. -signatureField1.Signature.Appearance.Normal.Graphics.DrawImage(signatureImage1, 0, 0, 90, 20); - -//Saving the PDF to the MemoryStream. -MemoryStream signedStream = new MemoryStream(); -signedDocument.Save(signedStream); -//Set the position as '0'. -signedStream.Position = 0; -//Close the documents. +//Add a signature to the signature field. +signatureField2.Signature = new PdfSignature(signedDocument, loadedPage, certificate1, "Signature", signatureField2); +//Set an image for the signature field. +PdfBitmap signatureImage1 = new PdfBitmap(@"Teacher Signature.png"); +//Draw an image in the signature appearance. +signatureField2.Signature.Appearance.Normal.Graphics.DrawImage(signatureImage1, 0, 0, 90, 20); + +//Save the PDF document. +signedDocument.Save("Multiple_signature.pdf"); +//Close the PDF documents. signedDocument.Close(true); loadedDocument.Close(true); -//Defining the ContentType for a pdf file. -string contentType = "application/pdf"; -//Define the file name. -string fileName = "Multiple_Signature.pdf"; -//Create the FileContentResult object by using the file contents, content type, and file name. -return File(signedStream, contentType, fileName); {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf.Graphics; +using Syncfusion.Pdf.Parsing; +using Syncfusion.Pdf.Security; +using Syncfusion.Pdf; + //Load an existing PDF document. PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Input.pdf"); //Get the first page of the document. @@ -4816,6 +5025,11 @@ loadedDocument.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf.Graphics +Imports Syncfusion.Pdf.Parsing +Imports Syncfusion.Pdf.Security +Imports Syncfusion.Pdf + 'Load an existing PDF document. Dim loadedDocument As PdfLoadedDocument = New PdfLoadedDocument("Input.pdf") 'Get the first page of the document. @@ -4869,9 +5083,12 @@ The following code example illustrates how to retrieve revocation certificate in {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Digital%20Signature/Retrieve-revocation-certificate-information/.NET/Retrieve-revocation-certificate-information/Program.cs" %} -//Load an existing signed PDF document. -FileStream documentStream = new FileStream(@"Input.pdf", FileMode.Open, FileAccess.Read); -PdfLoadedDocument loadedDocument = new PdfLoadedDocument(documentStream); +using Syncfusion.Pdf.Parsing; +using Syncfusion.Pdf.Security; +using System.Security.Cryptography.X509Certificates; + +//Load the PDF document +PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Input.pdf"); //Get signature field. PdfLoadedSignatureField loadedSignatureField = loadedDocument.Form.Fields[0] as PdfLoadedSignatureField; @@ -4920,6 +5137,10 @@ loadedDocument.Close(true); {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf.Parsing; +using Syncfusion.Pdf.Security; +using System.Security.Cryptography.X509Certificates; + //Load an existing signed PDF document. PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Input.pdf"); @@ -4970,6 +5191,10 @@ loadedDocument.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf.Parsing +Imports Syncfusion.Pdf.Security +Imports System.Security.Cryptography.X509Certificates + 'Load an existing signed PDF document. Dim loadedDocument As PdfLoadedDocument = New PdfLoadedDocument("Input.pdf") @@ -5030,9 +5255,10 @@ The following code example illustrates how to retrieve signed revision informati {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Digital%20Signature/Retrieve-signed-revision-information/.NET/Retrieve-signed-revision-information/Program.cs" %} -//Load an existing PDF document. -FileStream inputStream = new FileStream(@"Input.pdf", FileMode.Open, FileAccess.Read); -PdfLoadedDocument document = new PdfLoadedDocument(inputStream); +using Syncfusion.Pdf.Parsing; + +//Load an existing PDF document +PdfLoadedDocument document = new PdfLoadedDocument("Input.pdf"); //Get the document revisions. PdfRevision[] revisions = document.Revisions; foreach (PdfRevision rev in revisions) @@ -5046,11 +5272,12 @@ PdfLoadedSignatureField field = document.Form.Fields[0] as PdfLoadedSignatureFie int revisionIndex = field.Revision; //Close the document. document.Close(true); - {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf.Parsing; + //Load an existing PDF document PdfLoadedDocument document = new PdfLoadedDocument("Input.pdf"); //Get the document revisions. @@ -5071,6 +5298,8 @@ document.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf.Parsing + 'Load an existing PDF document. Dim document As PdfLoadedDocument = New PdfLoadedDocument("Input.pdf") 'Get the document revisions. @@ -5100,9 +5329,12 @@ The following code example illustrates how to retrieve revocation certificate in {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Digital%20Signature/Retrieve-revocation-certificate-information-from-digital-signature-embed-timestamp/.NET/Program.cs" %} -//Load an existing PDF document. -FileStream inputStream = new FileStream(@"Input.pdf", FileMode.Open, FileAccess.Read); -PdfLoadedDocument document = new PdfLoadedDocument(inputStream); +using Syncfusion.Pdf.Parsing; +using Syncfusion.Pdf.Security; +using System.Security.Cryptography.X509Certificates; + +//Load an existing PDF document +PdfLoadedDocument document = new PdfLoadedDocument("Input.pdf"); //Gets the signature field. PdfLoadedSignatureField signatureField = document.Form.Fields[0] as PdfLoadedSignatureField; //Validates signature and gets the validation result. @@ -5116,6 +5348,10 @@ document.Close(true); {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf.Parsing; +using Syncfusion.Pdf.Security; +using System.Security.Cryptography.X509Certificates; + //Load an existing PDF document PdfLoadedDocument document = new PdfLoadedDocument("Input.pdf"); //Gets the signature field. @@ -5131,6 +5367,10 @@ document.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf.Parsing +Imports Syncfusion.Pdf.Security +Imports System.Security.Cryptography.X509Certificates + 'Load an existing PDF document. Dim loadedDocument As PdfLoadedDocument = New PdfLoadedDocument("Input.pdf") 'Gets the signature field. @@ -5156,15 +5396,17 @@ Utilize the **GetImages** method within the [PdfLoadedSignatureField](https://he {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Digital%20Signature/Get-images-from-the-existing-signed-signature-field/.NET/Get-images-from-the-existing-signed-signature-field/Program.cs" %} +using Syncfusion.Pdf.Interactive; +using Syncfusion.Pdf.Parsing; + //Load an existing PDF file. -FileStream fileStream = new FileStream("Input.pdf", FileMode.Open, FileAccess.Read); -PdfLoadedDocument ldoc = new PdfLoadedDocument(fileStream); +PdfLoadedDocument ldoc = new PdfLoadedDocument("Input.pdf"); //Get the existing signed signature field. PdfLoadedSignatureField loadedSignature = ldoc.Form.Fields[0] as PdfLoadedSignatureField; -//Get the image streams. -Stream[] imageStreams = loadedSignature.GetImages(); -for (int i = 0; i < imageStreams.Length; i++) { - File.WriteAllBytes("Output" + i.ToString() + ".jpg", (imageStreams[i] as MemoryStream).ToArray()); +//Get the image. +Image[] images = loadedSignature.GetImages(); +for (int i = 0; i < images.Length; i++) { + images[i].Save("Image" + i.ToString() + ".jpg", ImageFormat.Png); } //Close a PDF document. ldoc.Close(true); @@ -5173,6 +5415,9 @@ ldoc.Close(true); {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf.Interactive; +using Syncfusion.Pdf.Parsing; + //Load an existing PDF file. PdfLoadedDocument ldoc = new PdfLoadedDocument("Input.pdf"); //Get the existing signed signature field. @@ -5189,6 +5434,9 @@ ldoc.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf.Parsing +Imports Syncfusion.Pdf.Interactive + 'Load an existing PDF file. Dim fileStream As FileStream = New FileStream("Input.pdf", FileMode.Open, FileAccess.Read) Dim ldoc As PdfLoadedDocument = New PdfLoadedDocument(fileStream) @@ -5218,6 +5466,10 @@ Effortlessly Integrate **signature and timestamp** certificates into the Documen {% highlight c# tabtitle="C# [Cross-platform]" %} +using Syncfusion.Pdf.Parsing; +using Syncfusion.Pdf.Security; +using System.Security.Cryptography.X509Certificates; + //Loads an existing document PdfLoadedDocument document = new PdfLoadedDocument("Input.pdf"); //Gets the signature field @@ -5248,6 +5500,10 @@ loadedDocument.Close(true); {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf.Parsing; +using Syncfusion.Pdf.Security; +using System.Security.Cryptography.X509Certificates; + //Gets the stream from the document FileStream documentStream = new FileStream("Input.pdf", FileMode.Open, FileAccess.Read); //Loads an existing signed PDF document @@ -5280,6 +5536,10 @@ loadedDocument.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf.Parsing +Imports Syncfusion.Pdf.Security +Imports System.Security.Cryptography.X509Certificates + 'Loads an existing signed PDF document Dim document As PdfLoadedDocument = New PdfLoadedDocument("Input.pdf") 'Gets the signature field From 04eb8c4a16a025abf6325d09bd80c5361b9e415f Mon Sep 17 00:00:00 2001 From: sameerkhan001 Date: Wed, 8 Oct 2025 15:07:36 +0530 Subject: [PATCH 002/163] 985863-ug: Added two md files. --- .../NET/Working-with-Document-Conversions.md | 370 ++++++++++++------ .../PDF-Library/NET/Working-with-Document.md | 334 +++++++++++----- 2 files changed, 490 insertions(+), 214 deletions(-) diff --git a/Document-Processing/PDF/PDF-Library/NET/Working-with-Document-Conversions.md b/Document-Processing/PDF/PDF-Library/NET/Working-with-Document-Conversions.md index 5e3be7eb7..b97659453 100644 --- a/Document-Processing/PDF/PDF-Library/NET/Working-with-Document-Conversions.md +++ b/Document-Processing/PDF/PDF-Library/NET/Working-with-Document-Conversions.md @@ -89,28 +89,33 @@ For ASP.NET Core and Xamarin applications {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Document%20conversion/Word-to-PDF/Converting-Word-to-PDF-document/.NET/Converting-Word-to-PDF-document/Program.cs" %} -// Open the file as Stream. -FileStream docStream = new FileStream(@"Template.docx", FileMode.Open, FileAccess.Read); -//Loads file stream into Word document. -WordDocument wordDocument = new WordDocument(docStream, Syncfusion.DocIO.FormatType.Automatic); -//Instantiation of DocIORenderer for Word to PDF conversion. -DocIORenderer render = new DocIORenderer(); -//Converts Word document into PDF document. -PdfDocument pdfDocument = render.ConvertToPDF(wordDocument); -//Releases all resources used by the Word document and DocIO Renderer objects. -render.Dispose(); -wordDocument.Dispose(); - -//Save the document into stream. -MemoryStream stream = new MemoryStream(); -pdfDocument.Save(stream); -//Close the document. +using Syncfusion.DocIO.DLS; +using Syncfusion.DocIORenderer; +using Syncfusion.Pdf; + +//Load an existing Word document. +WordDocument wordDocument = new WordDocument("Template.docx", FormatType.Docx); +//Initialize chart to image converter for converting charts during Word to pdf conversion. +wordDocument.ChartToImageConverter = new ChartToImageConverter(); +//Create an instance of DocToPDFConverter. +DocToPDFConverter converter = new DocToPDFConverter(); +//Convert Word document into PDF document. +PdfDocument pdfDocument = converter.ConvertToPDF(wordDocument); + +//Save the PDF file. +pdfDocument.Save("WordtoPDF.pdf"); +//Close the instance of document objects. pdfDocument.Close(true); +wordDocument.Close(); {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.DocIO.DLS; +using Syncfusion.DocIORenderer; +using Syncfusion.Pdf; + //Load an existing Word document. WordDocument wordDocument = new WordDocument("Template.docx", FormatType.Docx); //Initialize chart to image converter for converting charts during Word to pdf conversion. @@ -131,6 +136,10 @@ wordDocument.Close(); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.DocIO.DLS +Imports Syncfusion.DocIORenderer +Imports Syncfusion.Pdf + 'Load an existing Word document Dim wordDocument As New WordDocument("Template.docx", FormatType.Docx) 'Initialize chart to image converter for converting charts during Word to pdf conversion @@ -175,6 +184,13 @@ Essential® DocIO allows you to customize the Word to PDF conversi {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.DocIO; +using Syncfusion.DocIO.DLS; +using Syncfusion.DocToPDFConverter; +using Syncfusion.OfficeChart; +using Syncfusion.OfficeChartToImageConverter; +using Syncfusion.Pdf; + //Loads an existing Word document. WordDocument wordDocument = new WordDocument("Sample_Image.docx", FormatType.Docx); //Initialize chart to image converter for converting charts during Word to pdf conversion. @@ -203,6 +219,13 @@ wordDocument.Close(); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.DocIO +Imports Syncfusion.DocIO.DLS +Imports Syncfusion.DocToPDFConverter +Imports Syncfusion.OfficeChart +Imports Syncfusion.OfficeChartToImageConverter +Imports Syncfusion.Pdf + 'Loads an existing Word document Dim wordDocument As New WordDocument("Sample_Image.docx", FormatType.Docx) 'Initialize chart to image converter for converting charts during Word to pdf conversion @@ -250,29 +273,32 @@ The following code illustrates how to convert a workbook to PDF Document using [ {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Document%20conversion/Excel-to-PDF/Convert-workbook-to-PDF-document/.NET/Convert-workbook-to-PDF-document/Program.cs" %} +using Syncfusion.Pdf; +using Syncfusion.XlsIO; +using Syncfusion.XlsIORenderer; + using (ExcelEngine excelEngine = new ExcelEngine()) { IApplication application = excelEngine.Excel; //Load the document. - FileStream excelStream = new FileStream("ExcelToPDF.xlsx", FileMode.Open, FileAccess.Read); - IWorkbook workbook = application.Workbooks.Open(excelStream); + IWorkbook workbook = application.Workbooks.Open("Sample.xlsx", ExcelOpenType.Automatic); //Initialize XlsIO renderer. XlsIORenderer renderer = new XlsIORenderer(); //Convert Excel document into PDF document. PdfDocument pdfDocument = renderer.ConvertToPDF(workbook); - //Save the PDF document to stream. - Stream stream = new FileStream("ExcelToPDF.pdf", FileMode.Create, FileAccess.ReadWrite); - pdfDocument.Save(stream); - //Dispose the stream. - excelStream.Dispose(); - stream.Dispose(); + //Save the PDF file. + pdfDocument.Save("ExcelToPDF.pdf"); } {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf; +using Syncfusion.XlsIO; +using Syncfusion.XlsIORenderer; + using(ExcelEngine excelEngine = new ExcelEngine()) { IApplication application = excelEngine.Excel; @@ -293,6 +319,10 @@ using(ExcelEngine excelEngine = new ExcelEngine()) {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf +Imports Syncfusion.XlsIO +Imports Syncfusion.XlsIORenderer + Using excelEngine As ExcelEngine = New ExcelEngine() Dim application As IApplication = excelEngine.Excel application.DefaultVersion = ExcelVersion.Excel2013 @@ -322,30 +352,36 @@ The following code shows how to convert a particular sheet to PDF Document using {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Document%20conversion/Excel-to-PDF/Converting-a-worksheet-to-PDF-document/.NET/Converting-a-worksheet-to-PDF-document/Program.cs" %} -using (ExcelEngine excelEngine = new ExcelEngine()) +using Syncfusion.Pdf; +using Syncfusion.XlsIO; +using Syncfusion.XlsIORenderer; + +Using(ExcelEngine excelEngine = new ExcelEngine()) { IApplication application = excelEngine.Excel; - FileStream excelStream = new FileStream("ExcelToPDF.xlsx", FileMode.Open, FileAccess.Read); - IWorkbook workbook = application.Workbooks.Open(excelStream); - IWorksheet worksheet = workbook.Worksheets[0]; - - //Initialize XlsIO renderer. - XlsIORenderer renderer = new XlsIORenderer(); - //Convert Excel document into PDF document. - PdfDocument pdfDocument = renderer.ConvertToPDF(worksheet); - - //Saving the PDF to the MemoryStream. - Stream stream = new FileStream("ExcelToPDF.pdf", FileMode.Create, FileAccess.ReadWrite); - pdfDocument.Save(stream); - //Dispose the stream. - excelStream.Dispose(); - stream.Dispose(); + application.DefaultVersion = ExcelVersion.Excel2013; + IWorkbook workbook = application.Workbooks.Open("Sample.xlsx", ExcelOpenType.Automatic); + IWorksheet sheet = workbook.Worksheets[0]; + + //convert the sheet to PDF. + ExcelToPdfConverter converter = new ExcelToPdfConverter(sheet); + //Initialize PDF document. + PdfDocument pdfDocument= new PdfDocument(); + //Convert Excel document into PDF document. + pdfDocument = converter.Convert(); + + //Save the PDF file. + pdfDocument.Save("ExcelToPDF.pdf"); } {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf; +using Syncfusion.XlsIO; +using Syncfusion.XlsIORenderer; + Using(ExcelEngine excelEngine = new ExcelEngine()) { IApplication application = excelEngine.Excel; @@ -368,6 +404,10 @@ Using(ExcelEngine excelEngine = new ExcelEngine()) {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf +Imports Syncfusion.XlsIO +Imports Syncfusion.XlsIORenderer + Using excelEngine As ExcelEngine = New ExcelEngine() Dim application As IApplication = excelEngine.Excel application.DefaultVersion = ExcelVersion.Excel2013 @@ -399,31 +439,37 @@ The following code snippet shows how to create an individual PDF document for ea {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Document%20conversion/Excel-to-PDF/Creating-individual-PDF-document-for-each-worksheet/.NET/Program.cs" %} -using (ExcelEngine excelEngine = new ExcelEngine()) +using Syncfusion.Pdf; +using Syncfusion.XlsIO; +using Syncfusion.XlsIORenderer; + +Using(ExcelEngine excelEngine = new ExcelEngine()) { IApplication application = excelEngine.Excel; - FileStream excelStream = new FileStream("ExcelToPDF.xlsx", FileMode.Open, FileAccess.Read); - IWorkbook workbook = application.Workbooks.Open(excelStream); - - //Initialize XlsIO renderer. - XlsIORenderer renderer = new XlsIORenderer(); + application.DefaultVersion = ExcelVersion.Excel2013; + IWorkbook workbook = application.Workbooks.Open("Sample.xlsx", ExcelOpenType.Automatic); + //Create a new PDF document. - PdfDocument pdfDocument = new PdfDocument(); + PdfDocument pdfDocument = new PdfDocument(); foreach (IWorksheet sheet in workbook.Worksheets) { - pdfDocument = renderer.ConvertToPDF(sheet); - + //Open the Excel document to Convert. + ExcelToPdfConverter converter = new ExcelToPdfConverter(sheet); + pdfDocument = converter.Convert(); + //Save the PDF file. - Stream stream = new FileStream(sheet.Name+".pdf", FileMode.Create, FileAccess.ReadWrite); - pdfDocument.Save(stream); - stream.Dispose(); + pdfDocument.Save(sheet.Name +".pdf"); + converter.Dispose(); } - excelStream.Dispose(); } {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf; +using Syncfusion.XlsIO; +using Syncfusion.XlsIORenderer; + Using(ExcelEngine excelEngine = new ExcelEngine()) { IApplication application = excelEngine.Excel; @@ -448,6 +494,10 @@ Using(ExcelEngine excelEngine = new ExcelEngine()) {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf +Imports Syncfusion.XlsIO +Imports Syncfusion.XlsIORenderer + Using excelEngine As ExcelEngine = New ExcelEngine() Dim application As IApplication = excelEngine.Excel application.DefaultVersion = ExcelVersion.Excel2013 @@ -480,29 +530,39 @@ To preserve the charts during Excel to PDF conversion, you should initialize the {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Document%20conversion/Excel-to-PDF/Converting-Excel-with-chart-to-PDF-document/.NET/Converting-Excel-with-chart-to-PDF-document/Program.cs" %} -using (ExcelEngine excelEngine = new ExcelEngine()) +using Syncfusion.Pdf; +using Syncfusion.XlsIO; +using Syncfusion.XlsIORenderer; + +Using(ExcelEngine excelEngine = new ExcelEngine()) { - IApplication application = excelEngine.Excel; - //Initialize XlsIO renderer. - XlsIORenderer renderer = new XlsIORenderer(); - //Load the document as stream. - FileStream excelStream = new FileStream("chart.xlsx", FileMode.Open, FileAccess.Read); - IWorkbook workbook = application.Workbooks.Open(excelStream); + IApplication application = excelEngine.Excel; + application.DefaultVersion = ExcelVersion.Excel2013; + //Instantiating the ChartToImageConverter and assigning the ChartToImageConverter instance of XlsIO application. + application.ChartToImageConverter = new ChartToImageConverter(); + //Tuning chart image quality. + application.ChartToImageConverter.ScalingMode = ScalingMode.Best; + IWorkbook workbook = application.Workbooks.Open("chart.xlsx"); + IWorksheet worksheet = workbook.Worksheets[0]; - //Convert Excel document with charts into PDF document. - PdfDocument pdfDocument = renderer.ConvertToPDF(workbook); + //Open the Excel document to Convert. + ExcelToPdfConverter converter = new ExcelToPdfConverter(workbook); - //Save the PDF document. - Stream stream = new FileStream("ExcelToPDF.pdf", FileMode.Create, FileAccess.ReadWrite); - pdfDocument.Save(stream); - //Dispose the stream. - excelStream.Dispose(); - stream.Dispose(); + //Initialize PDF document. + PdfDocument pdfDocument = new PdfDocument(); + //Convert Excel document into PDF document. + pdfDocument = converter.Convert(); + //Save the PDF file. + pdfDocument.Save("ExcelToPDF.pdf"); } {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf; +using Syncfusion.XlsIO; +using Syncfusion.XlsIORenderer; + Using(ExcelEngine excelEngine = new ExcelEngine()) { IApplication application = excelEngine.Excel; @@ -529,6 +589,10 @@ Using(ExcelEngine excelEngine = new ExcelEngine()) {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf +Imports Syncfusion.XlsIO +Imports Syncfusion.XlsIORenderer + Using excelEngine As ExcelEngine = New ExcelEngine() Dim application As IApplication = excelEngine.Excel application.DefaultVersion = ExcelVersion.Excel2013 @@ -640,31 +704,33 @@ For ASP.NET Core and Xamarin applications {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Document%20conversion/RTF-to-PDF/Convert-RTF-to-PDF-document/.NET/Convert-RTF-to-PDF-document/Program.cs" %} -//Open the file as Stream -FileStream docStream = new FileStream(@"Input.rtf", FileMode.Open, FileAccess.Read); -//Loads file stream into Word document -WordDocument wordDocument = new WordDocument(docStream, Syncfusion.DocIO.FormatType.Automatic); -//Instantiation of DocIORenderer for Word to PDF conversion -DocIORenderer render = new DocIORenderer(); -//Converts Word document into PDF document -PdfDocument pdfDocument = render.ConvertToPDF(wordDocument); - -//Releases all resources used by the Word document and DocIO Renderer objects -render.Dispose(); -wordDocument.Dispose(); - -//Save the document into stream -MemoryStream stream = new MemoryStream(); -pdfDocument.Save(stream); -//Close the document +using Syncfusion.DocIO.DLS; +using Syncfusion.DocIORenderer; +using Syncfusion.Pdf; + +//Load an existing RTF document. +WordDocument rtfDocument = new WordDocument("Input.rtf"); +//Create an instance of DocToPDFConverter. +DocToPDFConverter converter = new DocToPDFConverter(); +//Convert Word document into PDF document. +PdfDocument pdfDocument = converter.ConvertToPDF(rtfDocument); + +//Save the PDF file. +pdfDocument.Save("RTFToPDF.pdf"); +//Close the instance of document objects. pdfDocument.Close(true); +rtfDocument.Close(); {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.DocIO.DLS; +using Syncfusion.DocIORenderer; +using Syncfusion.Pdf; + //Load an existing RTF document. -WordDocument rtfDocument = new WordDocument(inputFileName); +WordDocument rtfDocument = new WordDocument("Input.rtf"); //Create an instance of DocToPDFConverter. DocToPDFConverter converter = new DocToPDFConverter(); //Convert Word document into PDF document. @@ -681,6 +747,10 @@ rtfDocument.Close(); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.DocIO.DLS +Imports Syncfusion.DocIORenderer +Imports Syncfusion.Pdf + 'Load an existing Word document Dim rtfDocument As New WordDocument(inputFileName) 'Create an instance of DocToPDFConverter @@ -718,6 +788,12 @@ Essential® DocIO allows you to customize the RTF to PDF conversio {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.DocIO.DLS; +using Syncfusion.DocToPDFConverter; +using Syncfusion.Pdf; +using System; +using System.Collections.Generic; + //Loads an existing Word document WordDocument rtfDocument = new WordDocument(inputFileName); //create an instance of DocToPDFConverter - responsible for Word to PDF conversion @@ -741,6 +817,12 @@ rtfDocument.Close(); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.DocIO.DLS +Imports Syncfusion.DocToPDFConverter +Imports Syncfusion.Pdf +Imports System +Imports System.Collections.Generic + 'Loads an existing Word document Dim rtfDocument As New WordDocument(inputFileName) 'create an instance of DocToPDFConverter - responsible for Word to PDF conversion @@ -777,26 +859,28 @@ The code snippet to illustrate the same is given below. {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Document%20conversion/TIFF-to-PDF/Converting-multipage-TIFF-to-PDF-document/.NET/Converting-multipage-TIFF-to-PDF-document/Program.cs" %} -//Create a new PDF document -PdfDocument document = new PdfDocument(); +using Syncfusion.Pdf.Graphics; +using Syncfusion.Pdf; -//Load the multi frame TIFF image from the disk -FileStream imageStream = new FileStream("image.tiff", FileMode.Open, FileAccess.Read); -PdfTiffImage tiffImage = new PdfTiffImage(imageStream); +//Create a PDF document +PdfDocument pdfDocument = new PdfDocument(); + +//Load multi frame TIFF image +PdfBitmap tiffImage = new PdfBitmap("image.tiff"); //Get the frame count int frameCount = tiffImage.FrameCount; //Access each frame and draw into the page for (int i = 0; i < frameCount; i++) { + tiffImage.ActiveFrame = i; //Add a section to the PDF document - PdfSection section = document.Sections.Add(); + PdfSection section = pdfDocument.Sections.Add(); //Set page margins section.PageSettings.Margins.All = 0; - tiffImage.ActiveFrame = i; //Create a PDF unit converter instance PdfUnitConvertor converter = new PdfUnitConvertor(); //Convert to point - Syncfusion.Drawing.SizeF size = converter.ConvertFromPixels(tiffImage.PhysicalDimension, PdfGraphicsUnit.Point); + SizeF size = converter.ConvertFromPixels(tiffImage.PhysicalDimension, PdfGraphicsUnit.Point); //Set page orientation section.PageSettings.Orientation = (size.Width > size.Height) ? PdfPageOrientation.Landscape : PdfPageOrientation.Portrait; //Set page size @@ -804,20 +888,20 @@ for (int i = 0; i < frameCount; i++) //Add a page to the section PdfPage page = section.Pages.Add(); //Draw TIFF image into the PDF page - page.Graphics.DrawImage(tiffImage, Syncfusion.Drawing.PointF.Empty, size); + page.Graphics.DrawImage(tiffImage, PointF.Empty, size); } -//Creating the stream object -MemoryStream stream = new MemoryStream(); -//Save the document as stream -document.Save(stream); -//Close the document -document.Close(true); +//Save and close the document +pdfDocument.Save("Sample.pdf"); +pdfDocument.Close(true); {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf.Graphics; +using Syncfusion.Pdf; + //Create a PDF document PdfDocument pdfDocument = new PdfDocument(); @@ -855,6 +939,9 @@ pdfDocument.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf.Graphics +Imports Syncfusion.Pdf + 'Create a PDF document Dim pdfDocument As New PdfDocument() @@ -910,6 +997,11 @@ Refer the below code snippet to draw a single frame monochrome TIFF image with J {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; +using System; +using System.Collections.Generic; + //Create a PDF document PdfDocument pdfDocument = new PdfDocument(); //Add a page @@ -930,6 +1022,11 @@ pdfDocument.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf.Graphics +Imports Syncfusion.Pdf +Imports System +Imports System.Collections.Generic + 'Create a PDF document Dim pdfDocument As New PdfDocument() 'Add a page @@ -966,28 +1063,29 @@ The below code illustrates how to convert XPS to PDF. {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Document%20conversion/Converting-XPS-to-PDF-document/.NET/Converting-XPS-to-PDF-document/Program.cs" %} -//Initialize XPS to PDF converter. +using Syncfusion.Pdf; +using Syncfusion.XPS; + +//Create converter class XPSToPdfConverter converter = new XPSToPdfConverter(); -//Open the XPS file as stream. -FileStream fileStream = new FileStream("Input.xps", FileMode.Open, FileAccess.ReadWrite); -//Convert the XPS to PDF. -PdfDocument document = converter.Convert(fileStream); - -//Creating the stream object. -MemoryStream stream = new MemoryStream(); -//Save the document into stream. -document.Save(stream); -//Close the documents. +//Convert the XPS to PDF +PdfDocument document = converter.Convert("Input.xps"); + +//Save and close the document +document.Save("Sample.pdf"); document.Close(true); {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf; +using Syncfusion.XPS; + //Create converter class XPSToPdfConverter converter = new XPSToPdfConverter(); //Convert the XPS to PDF -PdfDocument document = converter.Convert(xpsFileName); +PdfDocument document = converter.Convert("Input.xps"); //Save and close the document document.Save("Sample.pdf"); @@ -997,10 +1095,13 @@ document.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf +Imports Syncfusion.XPS + 'Create converter class Dim converter As New XPSToPdfConverter() 'Convert the XPS to PDF -Dim document As PdfDocument = converter.Convert(xpsFileName) +Dim document As PdfDocument = converter.Convert("Input.xps") 'Save and close the document document.Save("Sample.pdf") @@ -1220,6 +1321,9 @@ The following code snippet illustrates how to convert PDF page into image using {% tabs %} {% highlight c# tabtitle="C# [Cross-platform]" %} +using Syncfusion.PdfToImageConverter; +using System.IO; + //Initialize PDF to Image converter. PdfToImageConverter imageConverter = new PdfToImageConverter(); //Load the PDF document as a stream @@ -1227,13 +1331,16 @@ FileStream inputStream = new FileStream("Input.pdf", FileMode.Open, FileAccess.R imageConverter.Load(inputStream); //Convert PDF to Image. Stream outputStream = imageConverter.Convert(0, false, false); -MemoryStream stream = outputStream as MemoryStream; -return File(stream.ToArray(), System.Net.Mime.MediaTypeNames.Image.Jpeg, "sample.jpeg"); +Bitmap image = new Bitmap(outputStream); +image.Save("sample.png"); {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.PdfToImageConverter; +using System.IO; + //Initialize PDF to Image converter. PdfToImageConverter imageConverter = new PdfToImageConverter(); //Load the PDF document as a stream @@ -1248,6 +1355,9 @@ image.Save("sample.png"); {% endhighlight %} {% highlight vb tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.PdfToImageConverter +Imports System.IO + 'Initialize PDF to Image converter. Dim imageConverter As PdfToImageConverter = New PdfToImageConverter() 'Load the PDF document as a stream @@ -1279,6 +1389,9 @@ The [HTML to PDF converter library](https://www.syncfusion.com/document-processi {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/HTML%20to%20PDF/Blink/Convert-website-URL-to-PDF-document/.NET/Convert-website-URL-to-PDF-document/Program.cs, 300" %} +using Syncfusion.HtmlConverter; +using Syncfusion.Pdf; + //Initialize HTML to PDF converter. HtmlToPdfConverter htmlConverter = new HtmlToPdfConverter(); //Convert URL to PDF @@ -1292,6 +1405,9 @@ document.Close(true); {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.HtmlConverter; +using Syncfusion.Pdf; + //Initialize HTML to PDF converter. HtmlToPdfConverter htmlConverter = new HtmlToPdfConverter(); //Convert URL to PDF @@ -1305,6 +1421,9 @@ document.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.HtmlConverter +Imports Syncfusion.Pdf + ' Initialize HTML to PDF converter Dim htmlConverter As New HtmlToPdfConverter() @@ -1330,20 +1449,24 @@ The [HTML to PDF converter library](https://www.syncfusion.com/document-processi {% highlight c# tabtitle="C# [Cross-platform]" %} +using Syncfusion.HtmlConverter; +using Syncfusion.Pdf; + //Initialize HTML to PDF converter HtmlToPdfConverter htmlConverter = new HtmlToPdfConverter(); -//Convert URL to PDF document. +//Convert a SVG file to PDF with HTML converter PdfDocument document = htmlConverter.Convert("inputSVG.svg"); -//Save the document into stream -MemoryStream stream = new MemoryStream(); -document.Save(stream); -//Close the document +//Save and close the PDF document +document.Save("SVGToPDF.pdf"); document.Close(true); {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.HtmlConverter; +using Syncfusion.Pdf; + //Initialize HTML to PDF converter HtmlToPdfConverter htmlConverter = new HtmlToPdfConverter(); //Convert a SVG file to PDF with HTML converter @@ -1356,6 +1479,9 @@ document.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.HtmlConverter +Imports Syncfusion.Pdf + 'Initialize HTML to PDF converter Dim htmlConverter As HtmlToPdfConverter = New HtmlToPdfConverter() 'Convert a SVG file to PDF with HTML converter @@ -1366,4 +1492,4 @@ document.Close(True) {% endhighlight %} -{% endtabs %} + {% endtabs %} diff --git a/Document-Processing/PDF/PDF-Library/NET/Working-with-Document.md b/Document-Processing/PDF/PDF-Library/NET/Working-with-Document.md index 2557aa4ba..75759e9e7 100644 --- a/Document-Processing/PDF/PDF-Library/NET/Working-with-Document.md +++ b/Document-Processing/PDF/PDF-Library/NET/Working-with-Document.md @@ -17,6 +17,9 @@ You can choose the standard or custom page size when you add a page to the PDF d {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/PDF%20Document/Create-a-PDF-document-with-standard-page-size/.NET/Create-a-PDF-document-with-standard-page-size/Program.cs" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; + //Create a new PDF document. PdfDocument document = new PdfDocument(); // Set the page size. @@ -31,10 +34,8 @@ PdfFont font = new PdfStandardFont(PdfFontFamily.Helvetica, 20); //Draw the text. graphics.DrawString("Hello World!!!", font, PdfBrushes.Black, new Syncfusion.Drawing.PointF(0, 0)); -//Creating the stream object -MemoryStream stream = new MemoryStream(); -//Save the document into stream -document.Save(stream); +//Save the document. +document.Save("Output.pdf"); //Close the document. document.Close(true); @@ -42,6 +43,9 @@ document.Close(true); {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; + //Create a new PDF document. PdfDocument document = new PdfDocument(); // Set the page size. @@ -65,6 +69,9 @@ document.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf.Graphics +Imports Syncfusion.Pdf + 'Create a new PDF document. Dim document As New PdfDocument() 'Set the page size. @@ -96,6 +103,9 @@ You can create a PDF document with custom page size in [PdfPageSettings Size](ht {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/PDF%20Document/Create-a-PDF-document-with-custom-page-size/.NET/Create-a-PDF-document-with-custom-page-size/Program.cs" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; + //Create a new PDF document. PdfDocument document = new PdfDocument(); // Set the custom page size. @@ -110,10 +120,8 @@ PdfFont font = new PdfStandardFont(PdfFontFamily.Helvetica, 20); //Draw the text. graphics.DrawString("Hello World!!!", font, PdfBrushes.Black, new Syncfusion.Drawing.PointF(0, 0)); -//Creating the stream object -MemoryStream stream = new MemoryStream(); -//Save the document into stream -document.Save(stream); +//Save the document. +document.Save("Output.pdf"); //Close the document. document.Close(true); @@ -121,6 +129,9 @@ document.Close(true); {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; + //Create a new PDF document. PdfDocument document = new PdfDocument(); // Set the custom page size. @@ -144,6 +155,9 @@ document.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf.Graphics +Imports Syncfusion.Pdf + 'Create a new PDF document. Dim document As New PdfDocument() 'Set the custom page size. @@ -175,6 +189,9 @@ You can change page orientation from portrait to landscape, through [PdfPageOrie {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/PDF%20Document/Change-the-page-orientation-from-portrait-to-landscape/.NET/Change-the-page-orientation-from-portrait-to-landscape/Program.cs" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; + //Create a new PDF document. PdfDocument document = new PdfDocument(); // Set the page size. @@ -191,10 +208,8 @@ PdfFont font = new PdfStandardFont(PdfFontFamily.Helvetica, 20); //Draw the text. graphics.DrawString("Hello World!!!", font, PdfBrushes.Black, new Syncfusion.Drawing.PointF(0, 0)); -//Creating the stream object -MemoryStream stream = new MemoryStream(); -//Save the document into stream -document.Save(stream); +//Save the document. +document.Save("Output.pdf"); //Close the document. document.Close(true); @@ -202,6 +217,9 @@ document.Close(true); {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; + //Create a new PDF document. PdfDocument document = new PdfDocument(); // Set the page size. @@ -227,6 +245,9 @@ document.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf.Graphics +Imports Syncfusion.Pdf + 'Create a new PDF document. Dim document As New PdfDocument() ' Set the page size. @@ -262,6 +283,10 @@ You can also change orientation by setting the rotation angle using [PdfPageRota {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/PDF%20Document/Rotate_PDF_based_on_angle/.NET/Rotate_PDF_based_on_angle/Program.cs" %} +using Syncfusion.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; + //Create a new PDF document. PdfDocument document = new PdfDocument(); // Set the page size. @@ -278,10 +303,8 @@ PdfFont font = new PdfStandardFont(PdfFontFamily.Helvetica, 20); //Draw the text. graphics.DrawString("Hello World!!!", font, PdfBrushes.Black, new Syncfusion.Drawing.PointF(0, 0)); -//Creating the stream object -MemoryStream stream = new MemoryStream(); -//Save the document into stream -document.Save(stream); +//Save the document. +document.Save("Output.pdf"); //Close the document. document.Close(true); @@ -289,6 +312,10 @@ document.Close(true); {% highlight c# tabtitle="C# [Windows-specific]" %} +using System.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; + //Create a new PDF document. PdfDocument document = new PdfDocument(); // Set the page size. @@ -314,6 +341,10 @@ document.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports System.Drawing +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Graphics + 'Create a new PDF document. Dim document As New PdfDocument() 'Set the page size. @@ -349,6 +380,10 @@ PDF sections are parts of the PDF document, which may contain one or more pages {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/PDF%20Document/Create_sections_in_PDF_document/.NET/Create_sections_in_PDF_document/Program.cs" %} +using Syncfusion.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; + //Create a new PDF document. PdfDocument document = new PdfDocument(); //Add a section to PDF document. @@ -363,10 +398,8 @@ PdfFont font = new PdfStandardFont(PdfFontFamily.Helvetica, 20); //Draw the text. graphics.DrawString("Hello World!!!", font, PdfBrushes.Black, new Syncfusion.Drawing.PointF(0, 0)); -//Creating the stream object -MemoryStream stream = new MemoryStream(); -//Save the document into stream -document.Save(stream); +//Save the document. +document.Save("Output.pdf"); //Close the document. document.Close(true); @@ -374,6 +407,10 @@ document.Close(true); {% highlight c# tabtitle="C# [Windows-specific]" %} +using System.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; + //Create a new PDF document. PdfDocument document = new PdfDocument(); //Add a section to PDF document. @@ -397,6 +434,10 @@ document.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports System.Drawing +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Graphics + 'Create a new PDF document. Dim document As New PdfDocument() 'Add a section to PDF document. @@ -436,6 +477,8 @@ The following code snippet illustrates how to print a PDF document. {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.PdfViewer; + PdfDocumentView viewer = new PdfDocumentView(); //Load the PDF document viewer.Load("Input.pdf"); @@ -456,6 +499,8 @@ viewer.Dispose(); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.PdfViewer + Dim viewer As New PdfDocumentView() 'Load the PDF document viewer.Load("Input.pdf") @@ -486,6 +531,10 @@ The following code snippet illustrates how to set PDF document information. {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/PDF%20Document/Add_PDF_document_properties/.NET/Add_PDF_document_properties/Program.cs" %} +using Syncfusion.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; + //Create a new PDF document. PdfDocument document = new PdfDocument(); @@ -506,10 +555,8 @@ PdfFont font = new PdfStandardFont(PdfFontFamily.Helvetica, 20); //Draw the text. graphics.DrawString("Hello World!!!", font, PdfBrushes.Black, new PointF(0, 0)); -//Creating the stream object -MemoryStream stream = new MemoryStream(); -//Save the document into stream -document.Save(stream); +//Save the document. +document.Save("Output.pdf"); //Close the document. document.Close(true); @@ -517,6 +564,10 @@ document.Close(true); {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; + //Create a new PDF document. PdfDocument document = new PdfDocument(); @@ -546,6 +597,10 @@ document.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports System.Drawing +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Graphics + 'Create a new PDF document. Dim document As New PdfDocument() @@ -583,9 +638,10 @@ To read and modify the document [DocumentInformation](https://help.syncfusion.co {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/PDF%20Document/Change_existing_PDF_properties/.NET/Change_existing_PDF_properties/Program.cs" %} -//Load the PDF document -FileStream docStream = new FileStream("Input.pdf", FileMode.Open, FileAccess.Read); -PdfLoadedDocument document = new PdfLoadedDocument(docStream); +using Syncfusion.Pdf.Parsing; + +//Load a existing PDF document +PdfLoadedDocument document = new PdfLoadedDocument("Input.pdf"); //Modify document information. document.DocumentInformation.Author = "Syncfusion"; @@ -595,10 +651,8 @@ document.DocumentInformation.Keywords = "PDF"; document.DocumentInformation.Subject = "Document information DEMO"; document.DocumentInformation.Title = "Essential PDF Sample"; -//Creating the stream object -MemoryStream stream = new MemoryStream(); -//Save the document into stream -document.Save(stream); +//Save the document. +document.Save("Output.pdf"); //Close the document. document.Close(true); @@ -606,7 +660,9 @@ document.Close(true); {% highlight c# tabtitle="C# [Windows-specific]" %} -//Create a new PDF document. +using Syncfusion.Pdf.Parsing; + +//Load a existing PDF document PdfLoadedDocument document = new PdfLoadedDocument("Input.pdf"); //Modify document information. @@ -626,7 +682,9 @@ document.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} -'Create a new PDF document. +Imports Syncfusion.Pdf.Parsing + +'Load a existing PDF document Dim document As New PdfLoadedDocument("Input.pdf") 'Modify document information. @@ -656,9 +714,10 @@ To remove specific details from the existing document information, use the **Rem {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/PDF%20Document/Remove-specific-keys-from-the-existing-document-information/.NET/Program.cs" %} +using Syncfusion.Pdf.Parsing; + //Load an existing PDF document. -FileStream docStream = new FileStream("Input.pdf", FileMode.Open, FileAccess.Read); -PdfLoadedDocument document = new PdfLoadedDocument(docStream); +PdfLoadedDocument document = new PdfLoadedDocument("Input.pdf"); //Remove the document information properties. document.DocumentInformation.Remove("Title"); @@ -670,10 +729,8 @@ document.DocumentInformation.Remove("Producer"); document.DocumentInformation.Remove("ModDate"); document.DocumentInformation.Remove("CreationDate"); -//Creating the stream object. -MemoryStream stream = new MemoryStream(); -//Save the document into stream. -document.Save(stream); +//Save the document. +document.Save("Output.pdf"); //Close the document. document.Close(true); @@ -681,6 +738,8 @@ document.Close(true); {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf.Parsing; + //Load an existing PDF document. PdfLoadedDocument document = new PdfLoadedDocument("Input.pdf"); @@ -703,6 +762,8 @@ document.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf.Parsing + 'Load an existing PDF document. Dim document As PdfLoadedDocument = New PdfLoadedDocument("Input.pdf") @@ -735,19 +796,18 @@ The Essential® PDF supports incremental update for PDF document. {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/PDF%20Document/Perform-incremental-update-for-the-PDF-document/.NET/Perform-incremental-update-for-the-PDF-document/Program.cs" %} -//Load the PDF document -FileStream docStream = new FileStream("Input.pdf", FileMode.Open, FileAccess.Read); -PdfLoadedDocument loadedDocument = new PdfLoadedDocument(docStream); +using Syncfusion.Pdf; +using Syncfusion.Pdf.Parsing; + +PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Input.pdf"); //Disable the incremental update loadedDocument.FileStructure.IncrementalUpdate = false; //Set the compression level loadedDocument.Compression = PdfCompressionLevel.Best; -//Creating the stream object -MemoryStream stream = new MemoryStream(); -//Save the document into stream -loadedDocument.Save(stream); +//Save the document. +loadedDocument.Save("Output.pdf"); //Close the document. loadedDocument.Close(true); @@ -755,6 +815,9 @@ loadedDocument.Close(true); {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Parsing; + //Load the PDF document. PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Input.pdf"); @@ -772,6 +835,9 @@ loadedDocument.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf.Parsing +Imports Syncfusion.Pdf + 'Load the PDF document Dim loadedDocument As New PdfLoadedDocument("Input.pdf") @@ -801,6 +867,10 @@ You can hide the menu bar and toolbar by enabling [HideMenubar](https://help.syn {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/PDF%20Document/Create_PDF_with_viewer_preference/.NET/Create_PDF_with_viewer_preference/Program.cs" %} +using Syncfusion.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; + //Create a new PDF document. PdfDocument document = new PdfDocument(); //Add a page to the document. @@ -819,10 +889,8 @@ document.ViewerPreferences.HideToolbar = true; //Shows user interface elements in the document's window (such as scroll bars and navigation controls). document.ViewerPreferences.HideWindowUI = false; -//Creating the stream object -MemoryStream stream = new MemoryStream(); -//Save the document into stream -document.Save(stream); +//Save the document. +document.Save("Output.pdf"); //Close the document. document.Close(true); @@ -830,6 +898,10 @@ document.Close(true); {% highlight c# tabtitle="C# [Windows-specific]" %} +using System.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; + //Create a new PDF document. PdfDocument document = new PdfDocument(); //Add a page to the document. @@ -857,6 +929,10 @@ document.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf.Parsing +Imports Syncfusion.Pdf +Imports System.Drawing + 'Create a new PDF document. Dim document As New PdfDocument() 'Add a page to the document. @@ -892,6 +968,9 @@ You can also allow the reader application to initially display the bookmarks, th {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/PDF%20Document/Create-PDF-with-display-of-specific-panel/.NET/Create-PDF-with-display-of-specific-panel/Program.cs" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; + //Create a new PDF document. PdfDocument document = new PdfDocument(); //Add a page to the document. @@ -906,9 +985,8 @@ graphics.DrawString("Hello World!!!", font, PdfBrushes.Black, new Syncfusion.Dra //Show the attachments panel. document.ViewerPreferences.PageMode = PdfPageMode.UseAttachments; -//Save the document into stream -MemoryStream stream = new MemoryStream(); -document.Save(stream); +//Save the document. +document.Save("Output.pdf"); //Close the document. document.Close(true); @@ -916,6 +994,9 @@ document.Close(true); {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; + //Create a new PDF document. PdfDocument document = new PdfDocument(); //Add a page to the document. @@ -939,6 +1020,9 @@ document.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf.Graphics +Imports Syncfusion.Pdf + 'Create a new PDF document. Dim document As New PdfDocument() 'Add a page to the document. @@ -978,6 +1062,10 @@ The following code sample illustrates how to create a PDF document in multi-thre {% highlight c# tabtitle="C# [Windows-specific]" %} +using System.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; + IEnumerable works = Enumerable.Range(0, 100); Parallel.ForEach(works, index => GeneratePDF(index)); @@ -1010,6 +1098,10 @@ document.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Drawing +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Graphics + Dim works As IEnumerable(Of Integer) = Enumerable.Range(0, 100) Parallel.ForEach(works, Sub(index) GeneratePDF(index)) Private Sub GeneratePDF(ByVal index As Integer) @@ -1046,6 +1138,11 @@ To modify the existing PDF document in multi-threading environment [EnableThread {% tabs %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using System.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; +using Syncfusion.Pdf.Parsing; + IEnumerable works = Enumerable.Range(0, 100); Parallel.ForEach(works, index => GeneratePDF(index)); @@ -1075,6 +1172,11 @@ doc.Close(true); {% endhighlight %} {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Drawing +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Graphics +Imports Syncfusion.Pdf.Parsing + Dim works As IEnumerable(Of Integer) = Enumerable.Range(0, 100) Parallel.ForEach(works, Sub(index) GeneratePDF(index)) Private Sub GeneratePDF(ByVal index As Integer) @@ -1115,6 +1217,10 @@ The following code snippet explains how to have uniform resource naming in a PDF {% tabs %} {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/PDF%20Document/Create_PDF_with_Uniform_Resouce_Naming/.NET/Create_PDF_with_Uniform_Resouce_Naming/Program.cs" %} +using Syncfusion.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; + //Disable unique resource naming PdfDocument.EnableUniqueResourceNaming = false; @@ -1139,16 +1245,19 @@ PdfFont font3 = new PdfCjkStandardFont(PdfCjkFontFamily.HeiseiMinchoW3, 20); //Draw the text graphics.DrawString("こんにちは世界", font3, PdfBrushes.Blue, new PointF(50, 150)); -//Saving the PDF to the MemoryStream -MemoryStream stream = new MemoryStream(); -doc.Save(stream); -//Close the document +//Save the document. +doc.Save("Output.pdf"); +//Close the document. doc.Close(true); {%endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using System.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; + //Disable unique resource naming PdfDocument.EnableUniqueResourceNaming = false; @@ -1180,6 +1289,10 @@ doc.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Drawing +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Graphics + 'Disable unique resource naming PdfDocument.EnableUniqueResourceNaming = False @@ -1222,9 +1335,11 @@ Enabling this property will optimize the memory but difference in time occurs ba {% tabs %} {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/PDF%20Document/Manage_memory_while_appending_PDF_document/.NET/Manage_memory_while_appending_PDF_document/Program.cs" %} -//Load an existing PDF document -FileStream docStream = new FileStream("file1.pdf", FileMode.Open, FileAccess.Read); -PdfLoadedDocument loadedDocument = new PdfLoadedDocument(docStream); +using Syncfusion.Pdf; +using Syncfusion.Pdf.Parsing; + +//Load an existing PDF document. +PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Input.pdf"); //Create a new PDF document PdfDocument document = new PdfDocument(); @@ -1234,17 +1349,18 @@ document.EnableMemoryOptimization = true; //Append the document with source document document.Append(loadedDocument); -//Save the document into stream -MemoryStream stream = new MemoryStream(); -document.Save(stream); -//Close the documents -document.Close(true); +//Save the document. +loadedDocument.Save("Output.pdf"); +//Close the document. loadedDocument.Close(true); {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Parsing; + //Load an existing PDF document PdfLoadedDocument loadedDocument = new PdfLoadedDocument("file1.pdf"); @@ -1265,6 +1381,10 @@ loadedDocument.Close(true); {% endhighlight %} {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} + +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Parsing + 'Load an existing PDF document Dim loadedDocument As New PdfLoadedDocument("file1.pdf") @@ -1293,10 +1413,13 @@ Syncfusion PDF Library provides support to check whether the existing PDF docume {% tabs %} {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/PDF%20Document/Find_corrupted_PDF_document/.NET/Find_corrupted_PDF_document/Program.cs" %} + +using Syncfusion.Pdf; +using Syncfusion.Pdf.Parsing; +using System.Text; + //Load the PDF document -FileStream docStream = new FileStream("Input.pdf", FileMode.Open, FileAccess.Read); -//Create a new instance for the PDF analyzer -PdfDocumentAnalyzer analyzer = new PdfDocumentAnalyzer(docStream); +PdfDocumentAnalyzer analyzer = new PdfDocumentAnalyzer("Input.pdf"); //Get the syntax errors SyntaxAnalyzerResult result = analyzer.AnalyzeSyntax(); @@ -1321,6 +1444,10 @@ analyzer.Close(); {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Parsing; +using System.Text; + //Create a new instance for the PDF analyzer PdfDocumentAnalyzer analyzer = new PdfDocumentAnalyzer("Input.pdf"); @@ -1347,6 +1474,10 @@ analyzer.Close(); {% endhighlight %} {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} + +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Parsing + 'Create a new instance for the PDF analyzer Dim analyzer As PdfDocumentAnalyzer = New PdfDocumentAnalyzer("Input.pdf") @@ -1379,6 +1510,9 @@ Refer to the following code sample to achieve the same, {% tabs %} {% highlight c# tabtitle="C# [Windows-specific]" %} + +using Syncfusion.Pdf.Parsing; + //Load an existing document. PdfLoadedDocument loadedDocument = new PdfLoadedDocument("input.pdf"); //Embed all the non-embedded fonts. @@ -1393,6 +1527,9 @@ loadedDocument.Close(true); {% endhighlight %} {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} + +Imports Syncfusion.Pdf.Parsing + //Load an existing document. Dim loadedDocument As PdfLoadedDocument = New PdfLoadedDocument("input.pdf") // Embed all the non-embedded fonts. @@ -1415,6 +1552,8 @@ The Essential® PDF allows you to get or set the [BaseUri](https:/ {% tabs %} {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/PDF%20Document/Add_BaseUri_in_the_PDF_document/.NET/Add_BaseUri_in_the_PDF_document/Program.cs" %} +using Syncfusion.Pdf; + //Create a new instance of the PdfDocument class. PdfDocument document = new PdfDocument(); //Set the Base URI. @@ -1423,14 +1562,15 @@ document.BaseUri = "https://www.syncfusion.com/"; PdfPage page = document.Pages.Add(); //Save the document. -MemoryStream stream = new MemoryStream(); -document.Save(stream); +document.Save("Output.pdf"); //Close the document. document.Close(true); {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf; + //Create a new instance of the PdfDocument class. PdfDocument document = new PdfDocument(); //Set the Base URI. @@ -1446,6 +1586,9 @@ document.Close(true); {% endhighlight %} {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} + +Imports Syncfusion.Pdf.Parsing + 'Create a new instance of the PdfDocument class. Dim document As PdfDocument = New PdfDocument() 'Set the Base URI. @@ -1467,17 +1610,21 @@ The following code example illustrates the retrieval of [BaseUri](https://help.s {% tabs %} {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/PDF%20Document/Retrieve_BaseUri_from_the_existing_PDF/.NET/Retrieve_BaseUri_from_the_existing_PDF/Program.cs" %} -//Load the PDF document as file stream. -FileStream docStream = new FileStream("Input.pdf", FileMode.Open, FileAccess.Read); -//Load a PDF document. -PdfLoadedDocument document = new PdfLoadedDocument(docStream); +using Syncfusion.Pdf.Parsing; + +//Load an existing PDF document. +PdfLoadedDocument document = new PdfLoadedDocument("Input.pdf"); //Get the Base URI. string baseUri = document.BaseUri; //Close the document. document.Close(true); + {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} + +using Syncfusion.Pdf.Parsing; + //Load an existing document. PdfLoadedDocument document = new PdfLoadedDocument("Input.pdf"); @@ -1488,6 +1635,9 @@ document.Close(true); {% endhighlight %} {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} + +Imports Syncfusion.Pdf.Parsing + 'Load an existing document. Dim document As PdfLoadedDocument = New PdfLoadedDocument("Input.pdf") 'Get the Base URI. @@ -1507,6 +1657,10 @@ Essential® PDF enables you to track the save progress through the {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/PDF%20Document/Create-a-PDF-document-with-save-progress/.NET/PDF-document-with-save-progress/Program.cs" %} + using Syncfusion.Pdf.Graphics; + using Syncfusion.Pdf; + using Syncfusion.Drawing; + // Create a new PDF document. PdfDocument document = new PdfDocument(); @@ -1529,13 +1683,8 @@ Essential® PDF enables you to track the save progress through the // Subscribe to the SaveProgress event. document.SaveProgress += new PdfDocument.ProgressEventHandler(document_SaveProgress); - // Create a file stream to save the PDF document. - using (FileStream outputFileStream = new FileStream(Path.GetFullPath(@"Output/Output.pdf"), FileMode.Create, FileAccess.ReadWrite)) - { - // Save the PDF document to the file stream. - document.Save(outputFileStream); - } - + //Save the document. + document.Save("Output.pdf"); // Close the document. document.Close(true); @@ -1551,6 +1700,10 @@ Essential® PDF enables you to track the save progress through the {% highlight c# tabtitle="C# [Windows-specific]" %} + using Syncfusion.Pdf.Graphics; + using Syncfusion.Pdf; + using System.Drawing; + // Create a new PDF document. PdfDocument document = new PdfDocument(); // Add multiple pages to the document. @@ -1567,12 +1720,8 @@ Essential® PDF enables you to track the save progress through the } // Subscribe to the SaveProgress event. document.SaveProgress += new PdfDocument.ProgressEventHandler(document_SaveProgress); - // Create a file stream to save the PDF document. - using (FileStream outputFileStream = new FileStream(Path.GetFullPath(@"../../../Output/Output.pdf"), FileMode.Create, FileAccess.ReadWrite)) - { - // Save the PDF document to the file stream. - document.Save(outputFileStream); - } + //Save the document. + document.Save("Output.pdf"); // Close the document. document.Close(true); @@ -1587,6 +1736,10 @@ Essential® PDF enables you to track the save progress through the {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} + Imports Syncfusion.Pdf.Graphics + Imports Syncfusion.Pdf + Imports Syncfusion.Drawing + Module Program Sub Main() ' Create a new PDF document. @@ -1604,11 +1757,8 @@ Essential® PDF enables you to track the save progress through the Next ' Subscribe to the SaveProgress event. AddHandler document.SaveProgress, AddressOf document_SaveProgress - ' Create a file stream to save the PDF document. - Using outputFileStream As New FileStream(Path.GetFullPath("../../../Output/Output.pdf"), FileMode.Create, FileAccess.ReadWrite) - ' Save the PDF document to the file stream. - document.Save(outputFileStream) - End Using + ' Save the document. + document.Save("Output.pdf") ' Close the document. document.Close(True) End Sub From 8b5061c73938863d27347cc07b1d7daeff775c03 Mon Sep 17 00:00:00 2001 From: sameerkhan001 Date: Wed, 8 Oct 2025 18:31:40 +0530 Subject: [PATCH 003/163] 985863-ug: Modified 3 md files. --- .../NET/Working-with-Flow-Layout.md | 76 +++++++++--- .../NET/Working-with-Headers-and-Footers.md | 35 ++++-- .../NET/Working-with-HyperLinks.md | 114 ++++++++++++++---- 3 files changed, 179 insertions(+), 46 deletions(-) diff --git a/Document-Processing/PDF/PDF-Library/NET/Working-with-Flow-Layout.md b/Document-Processing/PDF/PDF-Library/NET/Working-with-Flow-Layout.md index 5a5e0eb6d..3bceda99c 100644 --- a/Document-Processing/PDF/PDF-Library/NET/Working-with-Flow-Layout.md +++ b/Document-Processing/PDF/PDF-Library/NET/Working-with-Flow-Layout.md @@ -90,11 +90,11 @@ PdfDocument pdfDocument = render.ConvertToPDF(wordDocument); render.Dispose(); wordDocument.Dispose(); -//Save the document into stream. -MemoryStream stream = new MemoryStream(); -pdfDocument.Save(stream); -//Close the documents. +//Save and close the PDF document. +pdfDocument.Save("Output.pdf"); pdfDocument.Close(true); +//Close the document. +wordDocument.Close(); {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} @@ -180,6 +180,11 @@ You can create PDF document with text and image using the following code snippet {% tabs %} {% highlight c# tabtitle="C# [Cross-platform]" %} + +using Syncfusion.Pdf; +using Syncfusion.DocIO.DLS; +using Syncfusion.DocToPDFConverter; + //A new document is created. WordDocument document = new WordDocument(); //Adding a new section to the document. @@ -230,15 +235,18 @@ PdfDocument pdfDocument = render.ConvertToPDF(document); render.Dispose(); document.Dispose(); -//Save the document into stream. -MemoryStream stream = new MemoryStream(); -pdfDocument.Save(stream); -//Close the documents. +//Saves the PDF file. +pdfDocument.Save("Sample.pdf"); pdfDocument.Close(true); +document.Close(); {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf; +using Syncfusion.DocIO.DLS; +using Syncfusion.DocToPDFConverter; + //A new document is created. WordDocument document = new WordDocument(); //Adding a new section to the document. @@ -293,6 +301,11 @@ document.Close(); {% endhighlight %} {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} + +Imports Syncfusion.DocIO.DLS +Imports Syncfusion.DocToPDFConverter +Imports Syncfusion.Pdf + 'A new document is created Dim document As New WordDocument() 'Adding a new section to the document @@ -355,6 +368,11 @@ You can create PDF document with simple table using the following code snippet. {% tabs %} {% highlight c# tabtitle="C# [Cross-platform]" %} + +using Syncfusion.Pdf; +using Syncfusion.DocIO.DLS; +using Syncfusion.DocToPDFConverter; + //Creates a new Word document. WordDocument wordDocument = new WordDocument(); //Adding a new section to the document. @@ -424,15 +442,19 @@ PdfDocument pdfDocument = render.ConvertToPDF(wordDocument); render.Dispose(); wordDocument.Dispose(); -//Save the document into stream. -MemoryStream stream = new MemoryStream(); -pdfDocument.Save(stream); -//Close the documents. +//Save and close the PDF document. +pdfDocument.Save("Output.pdf"); pdfDocument.Close(true); +//Close the document. +wordDocument.Close(); {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf; +using Syncfusion.DocIO.DLS; +using Syncfusion.DocToPDFConverter; + //Creates a new Word document. WordDocument wordDocument = new WordDocument(); //Adding a new section to the document. @@ -508,6 +530,11 @@ wordDocument.Close(); {% endhighlight %} {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} + +Imports Syncfusion.DocIO.DLS +Imports Syncfusion.DocToPDFConverter +Imports Syncfusion.Pdf + 'Creates a new Word document Dim wordDocument As New WordDocument() 'Adding a new section to the document @@ -593,7 +620,13 @@ Syncfusion Essential® PDF supports creating a PDF document with f The following code snippet explains how to create a PDF document with image, paragraph text, header text, a line below the header text, and a table using flow model. {% tabs %} -{% highlight c# tabtitle="C#" %} +{% highlight c# tabtitle="C#" [Cross-platform] %} + +using Syncfusion.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; +using Syncfusion.Pdf.Grid; + //Create a new PDF document. PdfDocument document = new PdfDocument(); //Add a page to the document. @@ -650,15 +683,20 @@ grid.ApplyBuiltinStyle(PdfGridBuiltinStyle.GridTable5DarkAccent5); //Draw the table in page, below the line with a height gap of 20. grid.Draw(page, new PointF(0, layoutResult.Bounds.Bottom + 20)); -//Saving the PDF to the MemoryStream. -MemoryStream stream = new MemoryStream(); -document.Save(stream); +//Save the PDF document. +document.Save("Output.pdf"); //Close the instance of PdfDocument. document.Close(true); + {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using System.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; +using Syncfusion.Pdf.Grid; + //Create a new PDF document. PdfDocument document = new PdfDocument(); //Add a page to the document. @@ -722,6 +760,12 @@ document.Close(true); {% endhighlight %} {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} + +Imports System.Drawing +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Graphics +Imports Syncfusion.Pdf.Grid + 'Create a new PDF document Dim document As PdfDocument = New PdfDocument 'Add a page to the document diff --git a/Document-Processing/PDF/PDF-Library/NET/Working-with-Headers-and-Footers.md b/Document-Processing/PDF/PDF-Library/NET/Working-with-Headers-and-Footers.md index dd22c7e57..ad0b75ad9 100644 --- a/Document-Processing/PDF/PDF-Library/NET/Working-with-Headers-and-Footers.md +++ b/Document-Processing/PDF/PDF-Library/NET/Working-with-Headers-and-Footers.md @@ -22,6 +22,10 @@ The below code snippet explains how to draw the page numbers in footer using aut {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Header%20and%20Footer/Adding-an-automatic-field-in-header-and-footer/.NET/Adding-an-automatic-field-in-header-and-footer/Program.cs" %} +using Syncfusion.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; + //Create a new PDF document. PdfDocument pdfDocument = new PdfDocument(); //Add a page to the PDF document @@ -52,16 +56,18 @@ compositeField.Draw(footer.Graphics, new PointF(470, 40)); //Add the footer template at the bottom. pdfDocument.Template.Bottom = footer; -//Save the document into stream. -MemoryStream stream = new MemoryStream(); -pdfDocument.Save(stream); -//Closes the document. +//Save and close the document. +pdfDocument.Save("Output.pdf"); pdfDocument.Close(true); {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using System.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; + //Create a new PDF document. PdfDocument pdfDocument = new PdfDocument(); //Add a page to the PDF document @@ -98,6 +104,10 @@ pdfDocument.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Drawing +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Graphics + 'Create a new PDF document. Dim pdfDocument As New PdfDocument() 'Add a page to the PDF document. @@ -146,6 +156,10 @@ The example below illustrates how to implement a dynamic footer that updates uni {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Header%20and%20Footer/Adding-dynamic-headers-and-footers-in-PDF/.NET/Adding-dynamic-headers-and-footers-in-PDF/Program.cs" %} +using Syncfusion.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; + // Create a new PDF document. PdfDocument document = new PdfDocument(); @@ -213,10 +227,7 @@ PdfPage firstPage = document.Pages.Add(); textElement.Draw(firstPage, new PointF(0, headerHeight)); // Save and close the document. -using (FileStream outputFileStream = new FileStream(Path.GetFullPath(@"Output/Output.pdf"), FileMode.Create, FileAccess.Write)) -{ - document.Save(outputFileStream); -} +document.Save("Output.pdf"); document.Close(true); // Add header and footer to every page. @@ -249,6 +260,10 @@ static void PageAddedHandler(object sender, PageAddedEventArgs e) {% highlight c# tabtitle="C# [Windows-specific]" %} +using System.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; + // Create a new PDF document. PdfDocument document = new PdfDocument(); @@ -349,6 +364,10 @@ static void PageAddedHandler(object sender, PageAddedEventArgs e) {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Drawing +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Graphics + ' Create a new PDF document. Dim document As New PdfDocument() diff --git a/Document-Processing/PDF/PDF-Library/NET/Working-with-HyperLinks.md b/Document-Processing/PDF/PDF-Library/NET/Working-with-HyperLinks.md index 2a18cf994..ee5922abf 100644 --- a/Document-Processing/PDF/PDF-Library/NET/Working-with-HyperLinks.md +++ b/Document-Processing/PDF/PDF-Library/NET/Working-with-HyperLinks.md @@ -11,7 +11,7 @@ In PDF, hyperlinks can be added to allow the users to navigate to another part o ## Working with Web navigation -You can navigate to specified URL from a PDF document by using the [PdfTextWebLink](https://help.syncfusion.com/cr/document-processing/Syncfusion.Pdf.Interactive.PdfTextWebLink.html) class. +You can navigate to specified URL from a PDF document by using the [PdfTextWebLink](https://help.syncfusion.com/cr/document-processing/Syncfusion.Pdf.Interactive.PdfTextWebLink.html) class. Please refer the below code snippet for navigating to the web page. @@ -19,6 +19,11 @@ Please refer the below code snippet for navigating to the web page. {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Hyperlinks/Navigate-to-specific-URL-from-a-PDF-document/.NET/Navigate-to-specific-URL-from-a-PDF-document/Program.cs" %} +using Syncfusion.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; +using Syncfusion.Pdf.Interactive; + //Create a new PDF document. PdfDocument document = new PdfDocument(); //Add a page to the document. @@ -37,9 +42,8 @@ textLink.Font = font; //Draw the hyperlink in PDF page. textLink.DrawTextWebLink(page, new PointF(10, 40)); -//Save the document into stream. -MemoryStream stream = new MemoryStream(); -document.Save(stream); +//Save the document. +document.Save("Output.pdf"); //Close the document. document.Close(true); @@ -47,6 +51,11 @@ document.Close(true); {% highlight c# tabtitle="C# [Windows-specific]" %} +using System.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; +using Syncfusion.Pdf.Interactive; + //Create a new PDF document. PdfDocument document = new PdfDocument(); //Add a page to the document. @@ -74,6 +83,10 @@ document.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Drawing +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Graphics + 'Create a new PDF document. Dim document As New PdfDocument() 'Add a page to the document. @@ -109,9 +122,14 @@ To add a web hyperlink to an existing document, please refer the below code snip {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Hyperlinks/Add-a-web-hyperlink-to-an-existing-PDF-document/.NET/Add-a-web-hyperlink-to-an-existing-PDF-document/Program.cs" %} +using Syncfusion.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; +using Syncfusion.Pdf.Interactive; +using Syncfusion.Pdf.Parsing; + //Load the PDF document. -FileStream docStream = new FileStream(fileName, FileMode.Open, FileAccess.Read); -PdfLoadedDocument loadedDocument = new PdfLoadedDocument(docStream); +PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Input.pdf"); //Load the page. PdfLoadedPage loadedPage = loadedDocument.Pages[0] as PdfLoadedPage; //Create the font. @@ -128,9 +146,8 @@ textLink.Font = font; //Draw the hyperlink in loaded page graphics. textLink.DrawTextWebLink(loadedPage.Graphics, new PointF(10, 40)); -//Save the document into stream. -MemoryStream stream = new MemoryStream(); -loadedDocument.Save(stream); +//Save the document. +loadedDocument.Save("Output.pdf"); //Close the document. loadedDocument.Close(true); @@ -138,6 +155,12 @@ loadedDocument.Close(true); {% highlight c# tabtitle="C# [Windows-specific]" %} +using System.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; +using Syncfusion.Pdf.Interactive; +using Syncfusion.Pdf.Parsing; + //Load the existing PDF document. PdfLoadedDocument loadedDocument = new PdfLoadedDocument(@"Filename.pdf"); //Load the page. @@ -165,6 +188,11 @@ loadedDocument.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Drawing +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Graphics +Imports Syncfusion.Pdf.Parsing + 'Load the existing PDF document. Dim loadedDocument As New PdfLoadedDocument("fileName.pdf") 'Load the page. @@ -202,6 +230,11 @@ To allow the users to navigate to any other part of the same document, [PdfDocum {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Hyperlinks/Add-the-hyperlink-for-internal-document-navigation/.NET/Add-the-hyperlink-for-internal-document-navigation/Program.cs" %} +using Syncfusion.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; +using Syncfusion.Pdf.Interactive; + //Create a new PDF document. PdfDocument document = new PdfDocument(); //Create a new page. @@ -228,9 +261,8 @@ documentLinkAnnotation.Destination.Zoom = 5; //Add this annotation to a new page. page.Annotations.Add(documentLinkAnnotation); -//Save the document into stream. -MemoryStream stream = new MemoryStream(); -document.Save(stream); +//Save the document. +document.Save("Output.pdf"); //Close the document. document.Close(true); @@ -238,6 +270,11 @@ document.Close(true); {% highlight c# tabtitle="C# [Windows-specific]" %} +using System.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; +using Syncfusion.Pdf.Interactive; + //Create a new PDF document. PdfDocument document = new PdfDocument(); //Create a new page. @@ -273,6 +310,10 @@ document.Close(); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Drawing +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Graphics + 'Create a new PDF document. Dim document As New PdfDocument() 'Create a new page. @@ -316,9 +357,14 @@ To add a [PdfDocumentLinkAnnotation](https://help.syncfusion.com/cr/document-pro {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Hyperlinks/Internal-document-navigation-to-an-existing-PDF/.NET/Internal-document-navigation-to-an-existing-PDF/Program.cs" %} +using Syncfusion.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; +using Syncfusion.Pdf.Interactive; +using Syncfusion.Pdf.Parsing; + //Load the PDF document. -FileStream docStream = new FileStream("fileName.pdf", FileMode.Open, FileAccess.Read); -PdfLoadedDocument loadedDocument = new PdfLoadedDocument(docStream); +PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Input.pdf"); //Load the page. PdfLoadedPage loadedPage = loadedDocument.Pages[0] as PdfLoadedPage; //Create a new rectangle. @@ -337,9 +383,8 @@ documentLinkAnnotation.Destination.Location = new PointF(10, 0); //Add this annotation to respective page. loadedPage.Annotations.Add(documentLinkAnnotation); -//Save the document into stream. -MemoryStream stream = new MemoryStream(); -loadedDocument.Save(stream); +//Save the document. +loadedDocument.Save("Output.pdf"); //Close the document. loadedDocument.Close(true); @@ -347,6 +392,12 @@ loadedDocument.Close(true); {% highlight c# tabtitle="C# [Windows-specific]" %} +using System.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; +using Syncfusion.Pdf.Interactive; +using Syncfusion.Pdf.Parsing; + //Load the existing PDF document. PdfLoadedDocument loadedDocument = new PdfLoadedDocument(@"fileName.pdf"); //Load the page. @@ -376,6 +427,11 @@ loadedDocument.Close(); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Drawing +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Graphics +Imports Syncfusion.Pdf.Parsing + 'Load the existing PDF document. Dim loadedDocument As New PdfLoadedDocument("fileName.pdf") 'Load the page. @@ -417,6 +473,9 @@ Please refer the below code snippet for navigating to external documents. {% highlight c# tabtitle="C# [Cross-platform]" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Interactive; + //Create the PDF document. PdfDocument document = new PdfDocument(); //Creates a new page. @@ -429,9 +488,8 @@ PdfFileLinkAnnotation fileLinkAnnotation = new PdfFileLinkAnnotation(bounds, fil //Add this annotation to a page. page.Annotations.Add(fileLinkAnnotation); -//Save the document into stream. -MemoryStream stream = new MemoryStream(); -document.Save(stream); +//Save the document. +document.Save("Output.pdf"); //Close the document. document.Close(true); @@ -439,6 +497,9 @@ document.Close(true); {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Interactive; + //Create the PDF document. PdfDocument document = new PdfDocument(); //Creates a new page. @@ -460,6 +521,9 @@ document.Close(); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Interactive + 'Create the PDF document Dim document As New PdfDocument() 'Creates a new page and adds it as the last page of the document @@ -495,7 +559,10 @@ To open a file in relative path, the [PdfLaunchAction](https://help.syncfusion.c {% endhighlight %} -{% highlight c# tabtitle="C#" %} +{% highlight c# tabtitle="C#" [Windows-specific] %} + +using Syncfusion.Pdf; +using Syncfusion.Pdf.Interactive; //Create a new PDF document. PdfDocument document = new PdfDocument(); @@ -520,7 +587,10 @@ document.Close(); {% endhighlight %} -{% highlight vb.net tabtitle="VB.NET" %} +{% highlight vb.net tabtitle="VB.NET" [Windows-specific] %} + +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Interactive 'Create a new PDF document Dim document As New PdfDocument() From 1bb765bb9fffb842b0d213e8bb5ac0c901b309ab Mon Sep 17 00:00:00 2001 From: sameerkhan001 Date: Thu, 9 Oct 2025 13:30:01 +0530 Subject: [PATCH 004/163] 985863-ug: Updated four files. --- .../NET/Working-with-Image-Extraction.md | 54 +++++- .../PDF-Library/NET/Working-with-Images.md | 177 +++++++++++++----- .../NET/Working-with-JavaScript.md | 83 ++++---- .../PDF-Library/NET/Working-with-Layers.md | 174 ++++++----------- 4 files changed, 272 insertions(+), 216 deletions(-) diff --git a/Document-Processing/PDF/PDF-Library/NET/Working-with-Image-Extraction.md b/Document-Processing/PDF/PDF-Library/NET/Working-with-Image-Extraction.md index c1e9a3cf1..ee399f432 100644 --- a/Document-Processing/PDF/PDF-Library/NET/Working-with-Image-Extraction.md +++ b/Document-Processing/PDF/PDF-Library/NET/Working-with-Image-Extraction.md @@ -15,9 +15,12 @@ Refer to the following code snippet to extract the images from a PDF page. {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Image%20Extraction/Extract-images-from-a-PDF-pages/.NET/Extract-images-from-a-PDF-pages/Program.cs" %} -//Load an existing PDF -FileStream docStream = new FileStream("Input.pdf", FileMode.Open, FileAccess.Read); -PdfLoadedDocument loadedDocument = new PdfLoadedDocument(docStream); +using Syncfusion.Pdf; +using Syncfusion.Pdf.Exporting; +using Syncfusion.Pdf.Parsing; + +//Load the PDF document. +PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Input.pdf"); //Load the first page PdfPageBase pageBase = loadedDocument.Pages[0]; @@ -30,8 +33,12 @@ loadedDocument.Close(true); {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Exporting; +using Syncfusion.Pdf.Parsing; + //Load an existing PDF -PdfLoadedDocument loadedDocument = new PdfLoadedDocument(fileName); +PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Input.pdf"); //Load the first page PdfPageBase pageBase = loadedDocument.Pages[0]; @@ -44,8 +51,12 @@ loadedDocument.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Exporting +Imports Syncfusion.Pdf.Parsing + 'Load an existing PDF -Dim loadedDocument As New PdfLoadedDocument(fileName) +Dim loadedDocument As New PdfLoadedDocument("Input.pdf") 'Load the first page Dim pageBase As PdfPageBase = loadedDocument.Pages(0) @@ -72,9 +83,13 @@ Refer to the following code snippet to extract the image info from a PDF page. {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Image%20Extraction/Extract-the-image-info-from-a-PDF-page/.NET/Extract-the-image-info-from-a-PDF-page/Program.cs" %} -//Load an existing PDF -FileStream docStream = new FileStream("Input.pdf", FileMode.Open, FileAccess.Read); -PdfLoadedDocument loadedDocument = new PdfLoadedDocument(docStream); +using Syncfusion.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Exporting; +using Syncfusion.Pdf.Parsing; + +//Load the PDF document. +PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Input.pdf"); //Load the first page PdfPageBase pageBase = loadedDocument.Pages[0]; @@ -87,8 +102,13 @@ loadedDocument.Close(true); {% highlight c# tabtitle="C# [Windows-specific]" %} +using System.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Exporting; +using Syncfusion.Pdf.Parsing; + //Load an existing PDF -PdfLoadedDocument loadedDocument = new PdfLoadedDocument(fileName); +PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Input.pdf"); //Load the first page PdfPageBase pageBase = loadedDocument.Pages[0]; @@ -101,8 +121,13 @@ loadedDocument.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports System.Drawing +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Exporting +Imports Syncfusion.Pdf.Parsing + 'Load an existing PDF -Dim loadedDocument As New PdfLoadedDocument(fileName) +Dim loadedDocument As New PdfLoadedDocument("Input.pdf") 'Load the first page Dim pageBase As PdfPageBase = loadedDocument.Pages(0) @@ -125,6 +150,9 @@ The following code example illustrates how to extract images from an entire PDF {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Image%20Extraction/Extract-images-from-PDF-documents/.NET/Extract-images-from-PDF-documents/Program.cs" %} +using Syncfusion.Pdf.Parsing; +using System.IO; + //Get stream from an existing PDF document. FileStream inputStream = new FileStream(@"Input.pdf", FileMode.Open, FileAccess.Read); //Initialize the PDF document extractor. @@ -144,6 +172,9 @@ documentExtractor.Dispose(); {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf.Parsing; +using System.IO; + //Get stream from an existing PDF document. FileStream inputStream = new FileStream(@"Input.pdf", FileMode.Open, FileAccess.Read); //Initialize the PDF document extractor. @@ -163,6 +194,9 @@ documentExtractor.Dispose(); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf.Parsing +Imports System.IO + 'Get stream from an existing PDF document. Dim inputStream As FileStream = New FileStream("Input.pdf", FileMode.Open, FileAccess.Read) 'Initialize the PDF document extractor. diff --git a/Document-Processing/PDF/PDF-Library/NET/Working-with-Images.md b/Document-Processing/PDF/PDF-Library/NET/Working-with-Images.md index 33c5f9f79..38ca465a8 100644 --- a/Document-Processing/PDF/PDF-Library/NET/Working-with-Images.md +++ b/Document-Processing/PDF/PDF-Library/NET/Working-with-Images.md @@ -34,6 +34,9 @@ The following code snippet shows how to add a file from disk to the PDF document {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Images/Insert-image-in-a-new-PDF-document/.NET/Insert-image-in-a-new-PDF-document/Program.cs" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; + //Create a new PDF document PdfDocument doc = new PdfDocument(); //Add a page to the document @@ -47,10 +50,8 @@ PdfBitmap image = new PdfBitmap(imageStream); //Draw the image graphics.DrawImage(image, 0, 0); -//Creating the stream object -MemoryStream stream = new MemoryStream(); -//Save the document as stream -doc.Save(stream); +//Save the document +doc.Save("Output.pdf"); //Close the document doc.Close(true); @@ -58,6 +59,9 @@ doc.Close(true); {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; + //Create a new PDF document PdfDocument doc = new PdfDocument(); //Add a page to the document @@ -79,6 +83,9 @@ doc.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Graphics + 'Create a new PDF document Dim doc As New PdfDocument() 'Add a page to the document @@ -110,9 +117,12 @@ You can also add images into an existing PDF document using the below code snipp {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Images/Insert-image-in-an-existing-PDF-document/.NET/Insert-image-in-an-existing-PDF-document/Program.cs" %} -//Load the PDF document -FileStream docStream = new FileStream("Input.pdf", FileMode.Open, FileAccess.Read); -PdfLoadedDocument doc = new PdfLoadedDocument(docStream); +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; +using Syncfusion.Pdf.Parsing; + +//Load the PDF document. +PdfLoadedDocument doc = new PdfLoadedDocument("Input.pdf"); //Get first page from document PdfLoadedPage page = doc.Pages[0] as PdfLoadedPage; @@ -124,10 +134,8 @@ PdfBitmap image = new PdfBitmap(imageStream); //Draw the image graphics.DrawImage(image, 0, 0); -//Creating the stream object -MemoryStream stream = new MemoryStream(); -//Save the document as stream -doc.Save(stream); +//Save the document +doc.Save("Output.pdf"); //Close the document doc.Close(true); @@ -135,6 +143,10 @@ doc.Close(true); {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; +using Syncfusion.Pdf.Parsing; + //Load a PDF document PdfLoadedDocument doc = new PdfLoadedDocument("input.pdf"); //Get first page from document @@ -156,6 +168,10 @@ doc.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Graphics +Imports Syncfusion.Pdf.Parsing + 'Load a PDF document Dim doc As New PdfLoadedDocument("input.pdf") 'Get first page from document @@ -182,9 +198,12 @@ To add image from stream, use the below code snippet. {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Images/Insert-image-in-an-existing-PDF-document/.NET/Insert-image-in-an-existing-PDF-document/Program.cs" %} -//Load the PDF document -FileStream docStream = new FileStream("Input.pdf", FileMode.Open, FileAccess.Read); -PdfLoadedDocument doc = new PdfLoadedDocument(docStream); +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; +using Syncfusion.Pdf.Parsing; + +//Load the PDF document. +PdfLoadedDocument doc = new PdfLoadedDocument("Input.pdf"); //Get first page from document PdfLoadedPage page = doc.Pages[0] as PdfLoadedPage; @@ -196,10 +215,8 @@ PdfBitmap image = new PdfBitmap(imageStream); //Draw the image graphics.DrawImage(image, 0, 0); -//Creating the stream object -MemoryStream stream = new MemoryStream(); -//Save the document as stream -doc.Save(stream); +//Save the document +doc.Save("Output.pdf"); //Close the document doc.Close(true); @@ -207,6 +224,10 @@ doc.Close(true); {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; +using Syncfusion.Pdf.Parsing; + //Load a PDF document PdfLoadedDocument doc = new PdfLoadedDocument("input.pdf"); //Get first page from document @@ -230,6 +251,10 @@ doc.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Graphics +Imports Syncfusion.Pdf.Parsing + 'Load a PDF document Dim doc As New PdfLoadedDocument("input.pdf") 'Get first page from document @@ -278,6 +303,10 @@ The following code illustrate this, {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; +using System.Drawing; + //Create a PDF Document PdfDocument doc = new PdfDocument(); //Add pages to the document @@ -304,6 +333,10 @@ doc.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf.Parsing +Imports Syncfusion.Pdf.Graphics +Imports System.Drawing + 'Create a PDF Document Dim doc As New PdfDocument() 'Add pages to the document @@ -342,6 +375,9 @@ The following code illustrate shows how to add a mask to TIFF image. {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Images/Add-a-mask-to-TIFF-image/.NET/Add-a-mask-to-TIFF-image/Program.cs" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; + //Create a PDF document PdfDocument doc = new PdfDocument(); //Add pages to the document @@ -360,9 +396,8 @@ image.Mask = mask; graphics.DrawImage(image, 0, 0); ///Creating the stream object -MemoryStream stream = new MemoryStream(); -//Save the document as stream -doc.Save(stream); +//Save the document +doc.Save("Output.pdf"); //Close the document doc.Close(true); @@ -370,6 +405,9 @@ doc.Close(true); {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; + //Create a PDF document PdfDocument doc = new PdfDocument(); //Add pages to the document @@ -394,6 +432,9 @@ doc.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Graphics + 'Create a PDF document Dim doc As New PdfDocument() 'Add pages to the document @@ -430,9 +471,11 @@ Essential® PDF allows you to replace images in an existing docume {% highlight c# tabtitle="C# [Cross-platform]" %} -//Load an existing PDF document. -FileStream pdfStream = new FileStream("Input.pdf", FileMode.Open, FileAccess.Read); -PdfLoadedDocument loadedDocument = new PdfLoadedDocument(pdfStream); +using Syncfusion.Pdf.Graphics; +using Syncfusion.Pdf.Parsing; + +//Load the PDF document. +PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Input.pdf"); //Create an image instance. FileStream imageStream = new FileStream(Path.GetFullPath("Autumn Leaves.jpg"), FileMode.Open, FileAccess.Read); @@ -440,9 +483,8 @@ PdfBitmap bmp = new PdfBitmap(imageStream); //Replace the first image in the page loadedDocument.Pages[0].ReplaceImage(0, bmp); -MemoryStream stream = new MemoryStream(); -//Save the document as stream -loadedDocument.Save(stream); +//Save the document +loadedDocument.Save("Output.pdf"); //Close the document loadedDocument.Close(true); @@ -450,6 +492,9 @@ loadedDocument.Close(true); {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf.Graphics; +using Syncfusion.Pdf.Parsing; + //Load the PDF document PdfLoadedDocument doc = new PdfLoadedDocument(@"image.pdf"); //Create an image instance @@ -466,6 +511,9 @@ doc.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf.Parsing +Imports Syncfusion.Pdf.Graphics + 'Load the PDF document Dim doc As New PdfLoadedDocument("image.pdf") 'Create an image instance @@ -492,6 +540,9 @@ You can allow a large image to paginate across multiple pages in the PDF documen {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Images/Paginate-an-image-in-PDF-document/.NET/Paginate-an-image-in-PDF-document/Program.cs" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; + //Create Document PdfDocument doc = new PdfDocument(); //Add new page @@ -507,17 +558,17 @@ format.Layout = PdfLayoutType.Paginate; //Draw image image.Draw(page, 20, 400, format); -//Creating the stream object -MemoryStream stream = new MemoryStream(); -//Save the document as stream -doc.Save(stream); -//Close the document +//Save the PDF +doc.Save("output.pdf"); doc.Close(true); {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; + //Create Document PdfDocument doc = new PdfDocument(); //Add new page @@ -540,6 +591,9 @@ doc.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Graphics + 'Create Document Dim doc As New PdfDocument() 'Add new page @@ -572,6 +626,9 @@ You can add transparency and rotation to the image using [SetTransparency](https {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Images/Add-transparancy-and-rotation-to-the-image/.NET/Add-transparancy-and-rotation-to-the-image/Program.cs" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; + //Create Document PdfDocument doc = new PdfDocument(); //Add a new page @@ -594,17 +651,17 @@ image.Draw(page, 0, 0); //Restore the graphics state page.Graphics.Restore(state); -//Creating the stream object -MemoryStream stream = new MemoryStream(); -//Save the document as strea -doc.Save(stream); -//Close the document +//Save the PDF +doc.Save("output.pdf"); doc.Close(true); {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; + //Create Document PdfDocument doc = new PdfDocument(); //Add a new page @@ -633,6 +690,9 @@ doc.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Graphics + 'Create Document Dim doc As New PdfDocument() 'Add a new page @@ -673,6 +733,9 @@ The code snippet to illustrate the same is given below. {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Images/Converting-multi-page-TIFF-to-PDF/.NET/Converting-multi-page-TIFF-to-PDF/Program.cs" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; + //Create a new PDF document PdfDocument doc = new PdfDocument(); //Set page margins @@ -691,17 +754,17 @@ for (int i = 0; i < frameCount; i++) tiffImage.ActiveFrame = i; graphics.DrawImage(tiffImage, 0, 0, page.GetClientSize().Width, page.GetClientSize().Height); } -//Creating the stream object -MemoryStream stream = new MemoryStream(); -//Save the document as stream -doc.Save(stream); -//Close the document -doc.Close(true); +//Save and close the document +pdfDocument.Save("Sample.pdf"); +pdfDocument.Close(true); {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; + //Create a PDF document PdfDocument pdfDocument = new PdfDocument(); //Set page margins @@ -728,6 +791,9 @@ pdfDocument.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Graphics + 'Create a PDF document Dim pdfDocument As New PdfDocument() 'Set page margins @@ -767,27 +833,31 @@ The code snippet to illustrate the same is given below. {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Images/Remove-images-from-PDF-document/.NET/Remove-images-from-PDF-document/Program.cs" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Exporting; +using Syncfusion.Pdf.Parsing; + //Load an existing PDF. -FileStream docStream = new FileStream(fileName, FileMode.Open, FileAccess.Read); -PdfLoadedDocument loadedDocument = new PdfLoadedDocument(docStream); +PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Input.pdf"); //Load the first page. PdfPageBase pageBase = loadedDocument.Pages[0]; //Extract images from the first page. PdfImageInfo[] imageInfo = loadedDocument.Pages[0].GetImagesInfo(); //Remove the Image. pageBase.RemoveImage(imageInfo[0]); -//Create the stream object -MemoryStream stream = new MemoryStream(); -//Save the document into stream -loadedDocument.Save(stream); -//Close the document +//Save and close the document +loadedDocument.Save("Sample.pdf"); loadedDocument.Close(true); {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Exporting; +using Syncfusion.Pdf.Parsing; + //Load a PDF document PdfLoadedDocument doc = new PdfLoadedDocument("input.pdf"); //Load the first page @@ -805,6 +875,10 @@ doc.Close(true); {% endhighlight %} {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} + +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Parsing + 'Load an existing PDF Dim loadedDocument As PdfLoadedDocument = New PdfLoadedDocument("input.pdf") 'Load the first page @@ -813,10 +887,9 @@ Dim pageBase As PdfPageBase = loadedDocument.Pages(0) Dim imageInfo As PdfImageInfo = pageBase.ImagesInfo(0) 'Remove the Image pageBase.RemoveImage(imageInfo) -Dim stream As New MemoryStream() 'Save the document -loadedDocument.Save(stream) +loadedDocument.Save("Output.pdf") 'Close the document loadedDocument.Close(True) diff --git a/Document-Processing/PDF/PDF-Library/NET/Working-with-JavaScript.md b/Document-Processing/PDF/PDF-Library/NET/Working-with-JavaScript.md index 07ad2112a..966551198 100644 --- a/Document-Processing/PDF/PDF-Library/NET/Working-with-JavaScript.md +++ b/Document-Processing/PDF/PDF-Library/NET/Working-with-JavaScript.md @@ -22,6 +22,9 @@ You can add the JavaScript action to the PDF document by using [PdfJavaScriptAct {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/JavaScript/Add-the-JavaScript-action-to-the-PDF-document/.NET/Add-the-JavaScript-action-to-the-PDF-document/Program.cs" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Interactive; + //Create a new document PdfDocument document = new PdfDocument(); //Add a page @@ -32,23 +35,17 @@ PdfJavaScriptAction scriptAction = new PdfJavaScriptAction("app.alert(\"Hello Wo //Add the JavaScript action document.Actions.AfterOpen = scriptAction; -//Save the document into stream -MemoryStream stream = new MemoryStream(); -document.Save(stream); -stream.Position = 0; -//Close the document +//Save and close the PDF document +document.Save("Output.pdf"); document.Close(true); -//Defining the content type for PDF file -string contentType = "application/pdf"; -//Define the file name -string fileName = "Output.pdf"; -//Creates a FileContentResult object by using the file contents, content type, and file name -return File(stream, contentType, fileName); {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Interactive; + //Create a new document PdfDocument document = new PdfDocument(); //Add a page @@ -67,6 +64,9 @@ document.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Interactive + 'Create a new document Dim document As New PdfDocument() 'Add a page @@ -97,6 +97,11 @@ The following code snippet illustrate this. {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/JavaScript/Add-JavaScript-action-to-the-form-fields-in-a-PDF/.NET/Add-JavaScript-action-to-the-form-fields-in-a-PDF/Program.cs" %} +using Syncfusion.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; +using Syncfusion.Pdf.Interactive; + //Create a new PDF document PdfDocument document = new PdfDocument(); //Creates a new page @@ -116,23 +121,19 @@ submitButton.Actions.MouseDown = scriptAction; //Add the submit button to the new document document.Form.Fields.Add(submitButton); -//Save the document into stream -MemoryStream stream = new MemoryStream(); -document.Save(stream); -stream.Position = 0; -//Close the document +//Save and close the PDF document +document.Save("Output.pdf"); document.Close(true); -//Defining the ContentType for PDF file -string contentType = "application/pdf"; -//Define the file name -string fileName = "Output.pdf"; -//Creates a FileContentResult object by using the file contents, content type, and file name -return File(stream, contentType, fileName); {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using System.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; +using Syncfusion.Pdf.Interactive; + //Create a new PDF document PdfDocument document = new PdfDocument(); //Creates a new page @@ -161,6 +162,11 @@ document.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports System.Drawing +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Interactive +Imports Syncfusion.Pdf.Graphics + 'Create a new PDF document Dim document As New PdfDocument() 'Creates a new page @@ -199,6 +205,10 @@ The 3D Annotations are used to represent 3D artworks in a PDF document. You can {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/JavaScript/Add-JavaScript-to-3D-annotation-in-a-PDF-document/.NET/Add-JavaScript-to-3D-annotation-in-a-PDF-document/Program.cs" %} +using Syncfusion.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Interactive; + //Creates a new PDF document PdfDocument document = new PdfDocument(); //Creates a new page @@ -218,23 +228,18 @@ pdf3dAnnotation.Activation = activation; //Adds annotation to page page.Annotations.Add(pdf3dAnnotation); -//Save the document into stream -MemoryStream stream = new MemoryStream(); -document.Save(stream); -stream.Position = 0; -//Closes the document +//Save and close the PDF document +document.Save("Output.pdf"); document.Close(true); -//Defining the content type for PDF file -string contentType = "application/pdf"; -//Define the file name -string fileName = "3DAnnotation.pdf"; -//Creates a FileContentResult object by using the file contents, content type, and file name -return File(stream, contentType, fileName); {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using System.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Interactive; + //Creates a new PDF document PdfDocument document = new PdfDocument(); //Creates a new page @@ -261,6 +266,10 @@ document.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports System.Drawing +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Interactive + 'Creates a new PDF document Dim document As New PdfDocument() 'Creates a new page @@ -297,6 +306,10 @@ Add or modify the JavaScript action in a [PdfLoadedDocument](https://help.syncfu {% highlight c# tabtitle="C# [Windows-specific]" %} +using System.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Interactive; + //Load an existing PDF document. PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Input.pdf"); @@ -312,6 +325,10 @@ loadedDocument.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports System.Drawing +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Interactive + 'Load the PDF document. Dim loadedDocument As PdfLoadedDocument = New PdfLoadedDocument("Input.pdf") diff --git a/Document-Processing/PDF/PDF-Library/NET/Working-with-Layers.md b/Document-Processing/PDF/PDF-Library/NET/Working-with-Layers.md index 11603afce..bdd9a615d 100644 --- a/Document-Processing/PDF/PDF-Library/NET/Working-with-Layers.md +++ b/Document-Processing/PDF/PDF-Library/NET/Working-with-Layers.md @@ -20,6 +20,10 @@ Essential® PDF allows the users to create a layer in a PDF page u {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Layer/Adding-layers-in-a-PDF-document/.NET/Adding-layers-in-a-PDF-document/Program.cs" %} +using Syncfusion.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; + //Create PDF document. PdfDocument document = new PdfDocument(); //Add the page. @@ -41,23 +45,19 @@ graphics.TranslateTransform(100, 180); //Draw ellipse. graphics.DrawEllipse(pen, bounds); -//Save and close the document. -MemoryStream stream = new MemoryStream(); -document.Save(stream); -stream.Position = 0; -//Close the document. +//Save the document. +document.Save("Sample.pdf"); +//Close the document document.Close(true); -//Defining the ContentType for PDF file. -string contentType = "application/pdf"; -//Define the file name. -string fileName = "Output.pdf"; -//Creates a FileContentResult object by using the file contents, content type, and file name. -return File(stream, contentType, fileName); {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using System.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; + //Create PDF document. PdfDocument document = new PdfDocument(); //Add the page. @@ -126,9 +126,13 @@ The below code illustrates how to add the multiple layers in an existing PDF doc {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Layer/Add-the-multiple-layers-in-an-existing-PDF-document/.NET/Add-the-multiple-layers-in-an-existing-PDF-document/Program.cs" %} +using Syncfusion.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; +using Syncfusion.Pdf.Parsing; + //Load the PDF document -FileStream docStream = new FileStream("Input.pdf", FileMode.Open, FileAccess.Read); -PdfLoadedDocument loadedDocument = new PdfLoadedDocument(docStream); +PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Input.pdf"); //Get first page from document PdfLoadedPage loadedPage = loadedDocument.Pages[0] as PdfLoadedPage; @@ -148,25 +152,22 @@ graphics.TranslateTransform(100, 180); //Draw ellipse. graphics.DrawEllipse(pen, bounds); -//Save and close the document -MemoryStream stream = new MemoryStream(); -loadedDocument.Save(stream); -stream.Position = 0; -//Close the document. -loadedDocument.Close(true); -//Defining the ContentType for pdf file. -string contentType = "application/pdf"; -//Define the file name. -string fileName = "Output.pdf"; -//Creates a FileContentResult object by using the file contents, content type, and file name. -return File(stream, contentType, fileName); +//Save the document. +document.Save("Sample.pdf"); +//Close the document +document.Close(true); {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} -//Load the existing PDF document. -PdfLoadedDocument loadedDocument = new PdfLoadedDocument(fileName); +using System.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; +using Syncfusion.Pdf.Parsing; + +//Load the PDF document +PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Input.pdf"); //Get first page from document PdfLoadedPage loadedPage = loadedDocument.Pages[0] as PdfLoadedPage; @@ -196,7 +197,7 @@ loadedDocument.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} 'Load the existing PDF document. -Dim loadedDocument As New PdfLoadedDocument(fileName) +Dim loadedDocument As New PdfLoadedDocument("Input.pdf") 'Get first page from document Dim loadedPage As PdfLoadedPage = TryCast(loadedDocument.Pages(0), PdfLoadedPage) @@ -255,18 +256,10 @@ annotation.Layer = layer; //Add annotation to the created page page.Annotations.Add(annotation); -//Save and close the document -MemoryStream stream = new MemoryStream(); -document.Save(stream); -stream.Position = 0; +//Save the document. +document.Save("Sample.pdf"); //Close the document document.Close(true); -//Defining the ContentType for PDF file -string contentType = "application/pdf"; -//Define the file name. -string fileName = "Output.pdf"; -//Creates a FileContentResult object by using the file contents, content type, and file name -return File(stream, contentType, fileName); {% endhighlight %} @@ -339,8 +332,7 @@ The following code illustrates how to add annotation to the layers in an existin {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Layer/Add-annotation-to-the-layer-in-an-existing-PDF-document/.NET/Add-annotation-to-the-layer-in-an-existing-PDF-document/Program.cs" %} //Load the PDF document -FileStream docStream = new FileStream("Input.pdf", FileMode.Open, FileAccess.Read); -PdfLoadedDocument loadedDocument = new PdfLoadedDocument(docStream); +PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Input.pdf"); //Gets the first page from the document PdfLoadedPage loadedPage = loadedDocument.Pages[0] as PdfLoadedPage; @@ -359,18 +351,10 @@ annotation.Layer = Layer; //Add annotation to the created page loadedPage.Annotations.Add(annotation); -//Save and close the document -MemoryStream stream = new MemoryStream(); -loadedDocument.Save(stream); -stream.Position = 0; +//Save the document. +loadedDocument.Save("Sample.pdf"); //Close the document loadedDocument.Close(true); -//Defining the ContentType for PDF file -string contentType = "application/pdf"; -//Define the file name -string fileName = "Output.pdf"; -//Creates a FileContentResult object by using the file contents, content type, and file name -return File(stream, contentType, fileName); {% endhighlight %} @@ -466,20 +450,10 @@ graphics.TranslateTransform(100, 180); //Draw an ellipse graphics.DrawEllipse(pen, bounds); -//Creating the stream object -MemoryStream stream = new MemoryStream(); -//Save the document as stream -document.Save(stream); -//If the position is not set to '0', the PDF will be empty -stream.Position = 0; +//Save the document. +document.Save("Sample.pdf"); //Close the document document.Close(true); -//Defining the ContentType for PDF file -string contentType = "application/pdf"; -//Define the file name -string fileName = "Output.pdf"; -//Creates a FileContentResult object by using the file contents, content type, and file name -return File(stream, contentType, fileName); {% endhighlight %} @@ -558,8 +532,7 @@ You can remove the layers using [RemoveAt](https://help.syncfusion.com/cr/docume {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Layer/Removing-layers-from-an-existing-PDF-document/.NET/Removing-layers-from-an-existing-PDF-document/Program.cs" %} //Load the PDF document -FileStream docStream = new FileStream("Input.pdf", FileMode.Open, FileAccess.Read); -PdfLoadedDocument document = new PdfLoadedDocument(docStream); +PdfLoadedDocument document = new PdfLoadedDocument("Input.pdf"); //Gets the first page from the document PdfLoadedPage loadedPage = document.Pages[0] as PdfLoadedPage; @@ -568,18 +541,10 @@ PdfPageLayerCollection layers = loadedPage.Layers; //Remove the layer layers.RemoveAt(0); -//Save and close the document -MemoryStream stream = new MemoryStream(); -document.Save(stream); -stream.Position = 0; +//Save the document +document.Save("Output.pdf"); //Close the document document.Close(true); -//Defining the ContentType for pdf file. -string contentType = "application/pdf"; -//Define the file name. -string fileName = "Output.pdf"; -//Creates a FileContentResult object by using the file contents, content type, and file name. -return File(stream, contentType, fileName); {% endhighlight %} @@ -634,23 +599,17 @@ You can flatten a layer in a PDF document by removing it from the [PdfDocumentLa {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Layer/Flattening-the-layers-in-an-existing-PDF-document/.NET/Flattening-the-layers-in-an-existing-PDF-document/Program.cs" %} //Load the existing PDF document -FileStream inputStream = new FileStream("Layers.pdf", FileMode.Open); -PdfLoadedDocument loadedDocument = new PdfLoadedDocument(inputStream); +PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Input.pdf"); //Get the layer collection PdfDocumentLayerCollection layers = loadedDocument.Layers; //Flatten a layer in the PDF document layers.RemoveAt(0); -//Saving the PDF to the MemoryStream -MemoryStream stream = new MemoryStream(); -loadedDocument.Save(stream); -//Set the position as '0' -stream.Position = 0; -//Download the PDF document in the browser -FileStreamResult fileStreamResult = new FileStreamResult(stream, "application/pdf"); -fileStreamResult.FileDownloadName = "Output.pdf"; -return fileStreamResult; +//Save the PDF document +loadedDocument.Save("Output.pdf"); +//Close the instance of PdfLoadedDocument +loadedDocument.Close(true); {% endhighlight %} @@ -724,18 +683,10 @@ graphics.TranslateTransform(100, 180); //Draw ellipse graphics.DrawEllipse(pen, bounds); -//Save and close the document -MemoryStream stream = new MemoryStream(); -document.Save(stream); -stream.Position = 0; -//Close the document +//Save the PDF document +document.Save("Output.pdf"); +//Close the instance of PdfLoadedDocument document.Close(true); -//Defining the content type for PDF file -string contentType = "application/pdf"; -//Define the file name -string fileName = "Output.pdf"; -//Creates a FileContentResult object by using the file contents, content type, and file name -return File(stream, contentType, fileName); {% endhighlight %} @@ -813,26 +764,17 @@ The following code illustrates how to toggle the visibility of layers in an exis {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Layer/Toggle-the-visibility-of-layers-in-an-existing-PDF/.NET/Toggle-the-visibility-of-layers-in-an-existing-PDF/Program.cs" %} //Load the PDF document -FileStream docStream = new FileStream("Input.pdf", FileMode.Open, FileAccess.Read); -PdfLoadedDocument document = new PdfLoadedDocument(docStream); +PdfLoadedDocument document = new PdfLoadedDocument("Input.pdf"); //Gets the first layer from the layer collection PdfLayer layer = document.Layers[0]; //Disable the visibility layer.Visible = false; -//Save and close the document -MemoryStream stream = new MemoryStream(); -document.Save(stream); -stream.Position = 0; +//Save the document +document.Save("Output.pdf"); //Close the document document.Close(true); -//Defining the content type for PDF file. -string contentType = "application/pdf"; -//Define the file name -string fileName = "Output.pdf"; -//Creates a FileContentResult object by using the file contents, content type, and file name -return File(stream, contentType, fileName); {% endhighlight %} @@ -899,20 +841,10 @@ PdfGraphics graphics = layer.CreateGraphics(page); //Draw ellipse. graphics.DrawEllipse(PdfPens.Red, new RectangleF(50, 50, 40, 40)); -//Creating the stream object. -MemoryStream stream = new MemoryStream(); -//Save the document into stream. -document.Save(stream); -//If the position is not set to '0,' then the PDF will be empty. -stream.Position = 0; -//Close the document. +//Save the PDF document. +document.Save("Output.pdf"); +//Close the PDF document. document.Close(true); -//Defining the content type for a PDF file. -string contentType = "application/pdf"; -//Define the file name. -string fileName = "Output.pdf"; -//Creates a FileContentResult object by using the file contents, content type, and file name. -return File(stream, contentType, fileName); {% endhighlight %} From c95eb717e8c89bfd4545a30d6ee5ffa7eef83c2d Mon Sep 17 00:00:00 2001 From: Irfana Jaffer Sadhik Date: Thu, 9 Oct 2025 15:40:20 +0530 Subject: [PATCH 005/163] Task-824021-Exclude BlinkBinaries folder --- .../HTML-To-PDF/NET/troubleshooting.md | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/Document-Processing/PDF/Conversions/HTML-To-PDF/NET/troubleshooting.md b/Document-Processing/PDF/Conversions/HTML-To-PDF/NET/troubleshooting.md index 5599d4a2f..da168c46b 100644 --- a/Document-Processing/PDF/Conversions/HTML-To-PDF/NET/troubleshooting.md +++ b/Document-Processing/PDF/Conversions/HTML-To-PDF/NET/troubleshooting.md @@ -1546,5 +1546,26 @@ N> We have option to exclude the default Blink binaries from the installation pa +{% endhighlight %} +{% endtabs %} + +## How to Exclude BlinkBinaries or Runtime Files in Build or Deployment + +The runtime files, or blink binaries, will be copied into a bin or published folder while building and publishing the application. +By including the native option in the package reference of the csproj file, you can exclude the runtime files or blink binaries from being copied into the bin or publish folder while building and publishing the application. But you need to place the BlinkBinaries in the server disk and set the BlinkPath in the BlinkConverterSettings to perform the conversion. + +N> Using this approach, you can reduce the deployment size on your own servers. + +Refer to the following package reference: + +{% tabs %} +{% highlight C# %} + + + + native + + + {% endhighlight %} {% endtabs %} \ No newline at end of file From e5daaa0b84b1788f3d4fe8a5b5fc7f13076e9470 Mon Sep 17 00:00:00 2001 From: Irfana Jaffer Sadhik Date: Thu, 9 Oct 2025 17:16:21 +0530 Subject: [PATCH 006/163] Task-642687-Updated the Html To Pdf in linux UG --- ...rt-HTML-to-PDF-in-Azure-Functions-Linux.md | 65 +++++++++++++++++-- 1 file changed, 58 insertions(+), 7 deletions(-) diff --git a/Document-Processing/PDF/Conversions/HTML-To-PDF/NET/Convert-HTML-to-PDF-in-Azure-Functions-Linux.md b/Document-Processing/PDF/Conversions/HTML-To-PDF/NET/Convert-HTML-to-PDF-in-Azure-Functions-Linux.md index 875979f3a..cde5b2eb0 100644 --- a/Document-Processing/PDF/Conversions/HTML-To-PDF/NET/Convert-HTML-to-PDF-in-Azure-Functions-Linux.md +++ b/Document-Processing/PDF/Conversions/HTML-To-PDF/NET/Convert-HTML-to-PDF-in-Azure-Functions-Linux.md @@ -24,11 +24,57 @@ Step 3: Select the function worker as .NET 8.0 isolated (Long-term support), and ![Convert HTMLToPDF Azure Functions Step3](Azure_images\Azure-function-linux\AzureFunctions3.png) Step 4: Install the [Syncfusion.HtmlToPdfConverter.Net.Linux](https://www.nuget.org/packages/Syncfusion.HtmlToPdfConverter.Net.Linux/) NuGet package as a reference to your .NET Core application [NuGet.org](https://www.nuget.org/). -![Convert HTMLToPDF Azure Functions Step3](Azure_images\Azure-function-linux\Nuget-package.png) +![Convert HTMLToPDF Azure Functions Step4](Azure_images\Azure-function-linux\Nuget-package.png) N> Starting with v16.2.0.x, if you reference Syncfusion® assemblies from trial setup or from the NuGet feed, you also have to add "Syncfusion.Licensing" assembly reference and include a license key in your projects. Please refer to this [link](https://help.syncfusion.com/common/essential-studio/licensing/overview) to know about registering Syncfusion® license key in your application to use our components. -Step 5: Include the following namespaces in Function1.cs file. + +Step 5: Create a shell file with the below commands in the project and name it as dependenciesInstall.sh. In this article, these steps have been followed to install dependencies packages. + +{% highlight c# tabtitle="C#" %} + +DIR="/home/site/wwwroot/Package" +if [ -d "$DIR" ]; then + echo "'$DIR' found and now copying files, please wait ..." + PACKAGE_USR="/home/site/wwwroot/Package/usr" + if [ -d "$PACKAGE_USR" ]; then + cp -r /home/site/wwwroot/Package/usr/lib/x86_64-linux-gnu/ /usr/lib/ + fi + PACKAGE_LIB="/home/site/wwwroot/Package/lib" + if [ -d "$PACKAGE_LIB" ]; then + rm /home/site/wwwroot/Package/lib/x86_64-linux-gnu/libc.so.6; + rm /home/site/wwwroot/Package/lib/x86_64-linux-gnu/libc-2.28.so; + rm /home/site/wwwroot/Package/lib/x86_64-linux-gnu/libselinux.so.1; + cp -r /home/site/wwwroot/Package/lib/x86_64-linux-gnu/ /lib/; + ldconfig; + fi +else + apt-get update && apt-get install -yq --no-install-recommends libasound2 libatk1.0-0 libc6 libcairo2 libcups2 libdbus-1-3 libexpat1 libfontconfig1 libgcc1 libgconf-2-4 libgdk-pixbuf2.0-0 libglib2.0-0 libgtk-3-0 libnspr4 libpango-1.0-0 libpangocairo-1.0-0 libstdc++6 libx11-6 libx11-xcb1 libxcb1 libxcursor1 libxdamage1 libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 libxss1 libxtst6 libnss3 libgbm1; + mkdir /home/site/wwwroot/Package; + mkdir /home/site/wwwroot/Package/usr; + mkdir /home/site/wwwroot/Package/usr/lib; + mkdir /home/site/wwwroot/Package/usr/lib/x86_64-linux-gnu; + mkdir /home/site/wwwroot/Package/lib; + mkdir /home/site/wwwroot/Package/lib/x86_64-linux-gnu; + PACKAGE_USR="/home/site/wwwroot/Package/usr" + if [ -d "$PACKAGE_USR" ]; then + cp -r /usr/lib/x86_64-linux-gnu/ /home/site/wwwroot/Package/usr/lib/ + fi + PACKAGE_LIB="/home/site/wwwroot/Package/lib" + if [ -d "$PACKAGE_LIB" ]; then + cp -r /lib/x86_64-linux-gnu/ /home/site/wwwroot/Package/lib/ + fi +fi + +{% endhighlight %} + +![Convert HTMLToPDF Azure Functions Step5](htmlconversion_images\ShellCommand.png) + +Step 6: Set Copy to Output Directory as “Copy if newer” to the dependenciesInstall.sh file. + +![Convert HTMLToPDF Azure Functions Step6](htmlconversion_images\CopyToNewwer.png) + +Step 7: Include the following namespaces in Function1.cs file. {% highlight c# tabtitle="C#" %} @@ -39,7 +85,7 @@ Step 5: Include the following namespaces in Function1.cs file. {% endhighlight %} -Step 6: This Azure Function converts HTML to PDF using HTTP triggers. It handles GET/POST requests, processes the HTML, and returns a PDF response. +Step 8: This Azure Function converts HTML to PDF using HTTP triggers. It handles GET/POST requests, processes the HTML, and returns a PDF response. {% highlight c# tabtitle="C#" %} @@ -67,7 +113,7 @@ Step 6: This Azure Function converts HTML to PDF using HTTP triggers. It handles {% endhighlight %} -step 7: Use the following code example in the HtmlToPdfConvert method to convert HTML to a PDF document using the [Convert](https://help.syncfusion.com/cr/document-processing/Syncfusion.HtmlConverter.HtmlToPdfConverter.html#Syncfusion_HtmlConverter_HtmlToPdfConverter_Convert_System_String_) method in the [HtmlToPdfConverter](https://help.syncfusion.com/cr/document-processing/Syncfusion.HtmlConverter.HtmlToPdfConverter.html) class. The Blink command line arguments are configured based on the given [CommandLineArguments](https://help.syncfusion.com/cr/document-processing/Syncfusion.HtmlConverter.BlinkConverterSettings.html#Syncfusion_HtmlConverter_BlinkConverterSettings_CommandLineArguments) property of the [BlinkConverterSettings](https://help.syncfusion.com/cr/document-processing/Syncfusion.HtmlConverter.BlinkConverterSettings.html) class. +step 9: Use the following code example in the HtmlToPdfConvert method to convert HTML to a PDF document using the [Convert](https://help.syncfusion.com/cr/document-processing/Syncfusion.HtmlConverter.HtmlToPdfConverter.html#Syncfusion_HtmlConverter_HtmlToPdfConverter_Convert_System_String_) method in the [HtmlToPdfConverter](https://help.syncfusion.com/cr/document-processing/Syncfusion.HtmlConverter.HtmlToPdfConverter.html) class. The Blink command line arguments are configured based on the given [CommandLineArguments](https://help.syncfusion.com/cr/document-processing/Syncfusion.HtmlConverter.BlinkConverterSettings.html#Syncfusion_HtmlConverter_BlinkConverterSettings_CommandLineArguments) property of the [BlinkConverterSettings](https://help.syncfusion.com/cr/document-processing/Syncfusion.HtmlConverter.BlinkConverterSettings.html) class. {% highlight c# tabtitle="C#" %} @@ -99,6 +145,11 @@ public byte[] HtmlToPdfConvert(string htmlText) Bottom = 20 } }; + //Set command line arguments to run without sandbox. + settings.CommandLineArguments.Add("--no-sandbox"); + settings.CommandLineArguments.Add("--disable-setuid-sandbox"); + + htmlConverter.ConverterSettings = settings; // Convert HTML to PDF @@ -127,7 +178,7 @@ N> settings.CommandLineArguments.Add("--disable-setuid-sandbox"); N> ``` N> These arguments are only required when using **older versions** of the library that depend on Blink in sandbox-restricted environments. -Step 8: This code is designed to ensure that the necessary Linux packages for HTML to PDF conversion are installed if the operating system is Linux. It adjusts file permissions and executes a shell script to carry out the installation. +Step 10: This code is designed to ensure that the necessary Linux packages for HTML to PDF conversion are installed if the operating system is Linux. It adjusts file permissions and executes a shell script to carry out the installation. {% highlight c# tabtitle="C#" %} @@ -195,7 +246,7 @@ private static void InstallLinuxPackages() {% endhighlight %} -Step 9: Add the following helper methods to copy and set permission to the BlinkBinariesLinux folder. +Step 11: Add the following helper methods to copy and set permission to the BlinkBinariesLinux folder. {% highlight c# tabtitle="C#" %} @@ -257,7 +308,7 @@ private static void SetExecutablePermission(string tempBlinkDir) {% endhighlight %} -Step 10: Include the below enum in the Function1.cs file. +Step 12: Include the below enum in the Function1.cs file. {% highlight c# tabtitle="C#" %} From 191d993825e87fe6a5fc647d4f0c09ec03a81c59 Mon Sep 17 00:00:00 2001 From: Irfana Jaffer Sadhik Date: Thu, 9 Oct 2025 17:43:20 +0530 Subject: [PATCH 007/163] Task-642687-- Updated with Image files --- ...rt-HTML-to-PDF-in-Azure-Functions-Linux.md | 64 ++++++++---------- .../NET/htmlconversion_images/CopyToNewer.png | Bin 0 -> 53807 bytes .../htmlconversion_images/ShellCommand.png | Bin 0 -> 129507 bytes 3 files changed, 29 insertions(+), 35 deletions(-) create mode 100644 Document-Processing/PDF/Conversions/HTML-To-PDF/NET/htmlconversion_images/CopyToNewer.png create mode 100644 Document-Processing/PDF/Conversions/HTML-To-PDF/NET/htmlconversion_images/ShellCommand.png diff --git a/Document-Processing/PDF/Conversions/HTML-To-PDF/NET/Convert-HTML-to-PDF-in-Azure-Functions-Linux.md b/Document-Processing/PDF/Conversions/HTML-To-PDF/NET/Convert-HTML-to-PDF-in-Azure-Functions-Linux.md index cde5b2eb0..ae46d69db 100644 --- a/Document-Processing/PDF/Conversions/HTML-To-PDF/NET/Convert-HTML-to-PDF-in-Azure-Functions-Linux.md +++ b/Document-Processing/PDF/Conversions/HTML-To-PDF/NET/Convert-HTML-to-PDF-in-Azure-Functions-Linux.md @@ -33,39 +33,37 @@ Step 5: Create a shell file with the below commands in the project and name it a {% highlight c# tabtitle="C#" %} -DIR="/home/site/wwwroot/Package" -if [ -d "$DIR" ]; then - echo "'$DIR' found and now copying files, please wait ..." - PACKAGE_USR="/home/site/wwwroot/Package/usr" - if [ -d "$PACKAGE_USR" ]; then - cp -r /home/site/wwwroot/Package/usr/lib/x86_64-linux-gnu/ /usr/lib/ - fi - PACKAGE_LIB="/home/site/wwwroot/Package/lib" - if [ -d "$PACKAGE_LIB" ]; then - rm /home/site/wwwroot/Package/lib/x86_64-linux-gnu/libc.so.6; - rm /home/site/wwwroot/Package/lib/x86_64-linux-gnu/libc-2.28.so; - rm /home/site/wwwroot/Package/lib/x86_64-linux-gnu/libselinux.so.1; - cp -r /home/site/wwwroot/Package/lib/x86_64-linux-gnu/ /lib/; - ldconfig; - fi +echo "Starting dependencies installation script..." + +# Ensure rsync is installed +if ! command -v rsync &> /dev/null; then + echo "rsync could not be found, installing..." + apt-get update && apt-get install -yq rsync +fi + +FILE_PATH="/home/site/wwwroot/Package/usr/lib/x86_64-linux-gnu/libnss3.so" +if [ -f "$FILE_PATH" ]; then + echo "Dependencies file exists." + PACKAGE_USR="/home/site/wwwroot/Package/usr/lib/x86_64-linux-gnu" + if [ -d "$PACKAGE_USR" ]; then + echo "Copying user libraries..." + rsync -av --update /home/site/wwwroot/Package/usr/lib/ /usr/lib/ + echo "copied successfully..." + fi else - apt-get update && apt-get install -yq --no-install-recommends libasound2 libatk1.0-0 libc6 libcairo2 libcups2 libdbus-1-3 libexpat1 libfontconfig1 libgcc1 libgconf-2-4 libgdk-pixbuf2.0-0 libglib2.0-0 libgtk-3-0 libnspr4 libpango-1.0-0 libpangocairo-1.0-0 libstdc++6 libx11-6 libx11-xcb1 libxcb1 libxcursor1 libxdamage1 libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 libxss1 libxtst6 libnss3 libgbm1; - mkdir /home/site/wwwroot/Package; - mkdir /home/site/wwwroot/Package/usr; - mkdir /home/site/wwwroot/Package/usr/lib; - mkdir /home/site/wwwroot/Package/usr/lib/x86_64-linux-gnu; - mkdir /home/site/wwwroot/Package/lib; - mkdir /home/site/wwwroot/Package/lib/x86_64-linux-gnu; - PACKAGE_USR="/home/site/wwwroot/Package/usr" - if [ -d "$PACKAGE_USR" ]; then - cp -r /usr/lib/x86_64-linux-gnu/ /home/site/wwwroot/Package/usr/lib/ - fi - PACKAGE_LIB="/home/site/wwwroot/Package/lib" - if [ -d "$PACKAGE_LIB" ]; then - cp -r /lib/x86_64-linux-gnu/ /home/site/wwwroot/Package/lib/ - fi + echo "Package directory does not exist. Installing dependencies..." + apt-get update && apt-get install -yq --no-install-recommends libasound2 libatk1.0-0 libc6 libcairo2 libcups2 libdbus-1-3 libexpat1 libfontconfig1 libgcc1 libgconf-2-4 libgdk-pixbuf2.0-0 libglib2.0-0 libgtk-3-0 libnspr4 libpango-1.0-0 libpangocairo-1.0-0 libstdc++6 libx11-6 libx11-xcb1 libxcb1 libxcursor1 libxdamage1 libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 libxss1 libxtst6 libnss3 libgbm1 + mkdir -p /home/site/wwwroot/Package/usr/lib/x86_64-linux-gnu + mkdir -p /home/site/wwwroot/Package/lib/x86_64-linux-gnu + PACKAGE_USR="/home/site/wwwroot/Package/usr/lib/x86_64-linux-gnu" + if [ -d "$PACKAGE_USR" ]; then + echo "Copying user libraries to package..." + rsync -av /usr/lib/x86_64-linux-gnu/ /home/site/wwwroot/Package/usr/lib/x86_64-linux-gnu + fi fi +echo "Dependencies installation script completed." + {% endhighlight %} ![Convert HTMLToPDF Azure Functions Step5](htmlconversion_images\ShellCommand.png) @@ -145,11 +143,7 @@ public byte[] HtmlToPdfConvert(string htmlText) Bottom = 20 } }; - //Set command line arguments to run without sandbox. - settings.CommandLineArguments.Add("--no-sandbox"); - settings.CommandLineArguments.Add("--disable-setuid-sandbox"); - - + htmlConverter.ConverterSettings = settings; // Convert HTML to PDF diff --git a/Document-Processing/PDF/Conversions/HTML-To-PDF/NET/htmlconversion_images/CopyToNewer.png b/Document-Processing/PDF/Conversions/HTML-To-PDF/NET/htmlconversion_images/CopyToNewer.png new file mode 100644 index 0000000000000000000000000000000000000000..ce31cb90af30d1b9ddeb9547567a24e5e1b53aeb GIT binary patch literal 53807 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 PUe{FDQ!6-sBk+F#S`?0( literal 0 HcmV?d00001 diff --git a/Document-Processing/PDF/Conversions/HTML-To-PDF/NET/htmlconversion_images/ShellCommand.png b/Document-Processing/PDF/Conversions/HTML-To-PDF/NET/htmlconversion_images/ShellCommand.png new file mode 100644 index 0000000000000000000000000000000000000000..40cd59ddad4a8c78f9602e90bcd4667b7e4092dc GIT binary patch literal 129507 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∾mA`}j!HmPEVBVcf1OwZq0!UFKnkb|Gze{1M&seoCvf-8d%mDN{B z%gHa6>w#`iFZ|9poJw=K2 z8zeVlpf96+Jy{R`DrfjP$m}+f*(P(s*bc8Kk0LBIl$4x4A^eRgoRR?+ld_+7BTi`) z;Z{q?8H0pRgU;4FapFc*UFXNhWN_-+kt=v74=YQyjM%icDDi4p!#uxFi?FDqHa=A$ z%J=B%)6?-VZ3)DX2Yg|w`8lW$7;a0C+{1*qmo&`>dW<%b!B88)K^L<;_$bSuI$J>X z1&^)``MBm|C@*SC#>+2^eeDqsa10_zBN_%8fHi2Sb!Acc+8Z#p`^>) z@j-kR6H`fk4$xkoq4$R-M?wKreEh-`SD^=0GN3Up;ptc=3My$-lO8^-(T_=UK@}`e zO3MJPn{G|Nx{_JO@@uSG%HbX!8OFS3s00Djb_iQo`J}w8c`$TQYbgQdjUn}!=-3Mh z*L#t!JSrMGg~@j6Vkn5?`H_W!zQH&9L;6E(QLleyoMJpi5!=;SoAjIV?^acLQ?S8D}0% zWgQ(EbsvtN87CBH7dG(xFuSCo6OkDel^VAT2R~ciPd6G9r)ggrKyF6{$bSgv`Nblc zD8Hmst{P?9K|@1BOm}1UE`bxLc2LWXpl-T4hu?KXrtA=Ry;QQ7QRo&c97swe%LU9! zll75RJ%&t9b`RbVzJ^1x^}18GnE5?}m#mVbE~6#rhlgnymQdbsn_f&xWLUY!PhO4pU`Is z*IeLp_Ca!Ho3bsVEpps){R}+lZU>9S1&N$sA2x#m9OEAp~GwI2gf8k zaScCv9#6Ow>D=<{S@W29+WKZR3ZCVfhH`*O842ImKQP)yRVw2gw~ObgS1&GkC^PCn z{)O(gVx6?%XXDGsZ-9!qW_X>5BmYF}ezYH5&B`->BV@bYsVX4}k$ZXQUrY)JZYN~D zG3xL~%d%|RI>l*naP%5LZ`MM;>8|RD9m?-oA~da$Wkrj)4x}xTQ2xqWgE$e=hu= mzau6N;eS70C~F-1{(d1|7P% Date: Thu, 9 Oct 2025 17:47:56 +0530 Subject: [PATCH 008/163] updated title --- .../Convert-HTML-to-PDF-in-Azure-Functions-Linux.md | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/Document-Processing/PDF/Conversions/HTML-To-PDF/NET/Convert-HTML-to-PDF-in-Azure-Functions-Linux.md b/Document-Processing/PDF/Conversions/HTML-To-PDF/NET/Convert-HTML-to-PDF-in-Azure-Functions-Linux.md index ae46d69db..b899c8208 100644 --- a/Document-Processing/PDF/Conversions/HTML-To-PDF/NET/Convert-HTML-to-PDF-in-Azure-Functions-Linux.md +++ b/Document-Processing/PDF/Conversions/HTML-To-PDF/NET/Convert-HTML-to-PDF-in-Azure-Functions-Linux.md @@ -31,7 +31,7 @@ N> Starting with v16.2.0.x, if you reference Syncfusion® assembli Step 5: Create a shell file with the below commands in the project and name it as dependenciesInstall.sh. In this article, these steps have been followed to install dependencies packages. -{% highlight c# tabtitle="C#" %} +{% highlight bash tabtitle="Shell" %} echo "Starting dependencies installation script..." @@ -48,13 +48,20 @@ if [ -f "$FILE_PATH" ]; then if [ -d "$PACKAGE_USR" ]; then echo "Copying user libraries..." rsync -av --update /home/site/wwwroot/Package/usr/lib/ /usr/lib/ - echo "copied successfully..." + echo "Copied successfully..." fi else echo "Package directory does not exist. Installing dependencies..." - apt-get update && apt-get install -yq --no-install-recommends libasound2 libatk1.0-0 libc6 libcairo2 libcups2 libdbus-1-3 libexpat1 libfontconfig1 libgcc1 libgconf-2-4 libgdk-pixbuf2.0-0 libglib2.0-0 libgtk-3-0 libnspr4 libpango-1.0-0 libpangocairo-1.0-0 libstdc++6 libx11-6 libx11-xcb1 libxcb1 libxcursor1 libxdamage1 libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 libxss1 libxtst6 libnss3 libgbm1 + apt-get update && apt-get install -yq --no-install-recommends \ + libasound2 libatk1.0-0 libc6 libcairo2 libcups2 libdbus-1-3 libexpat1 \ + libfontconfig1 libgcc1 libgconf-2-4 libgdk-pixbuf2.0-0 libglib2.0-0 \ + libgtk-3-0 libnspr4 libpango-1.0-0 libpangocairo-1.0-0 libstdc++6 \ + libx11-6 libx11-xcb1 libxcb1 libxcursor1 libxdamage1 libxext6 \ + libxfixes3 libxi6 libxrandr2 libxrender1 libxss1 libxtst6 libnss3 libgbm1 + mkdir -p /home/site/wwwroot/Package/usr/lib/x86_64-linux-gnu mkdir -p /home/site/wwwroot/Package/lib/x86_64-linux-gnu + PACKAGE_USR="/home/site/wwwroot/Package/usr/lib/x86_64-linux-gnu" if [ -d "$PACKAGE_USR" ]; then echo "Copying user libraries to package..." From f8eb7e78ddefbee0e5526b4e905ca36142a4628a Mon Sep 17 00:00:00 2001 From: sameerkhan001 Date: Thu, 9 Oct 2025 18:08:37 +0530 Subject: [PATCH 009/163] 985863-ug: Added nine file changes. --- .../NET/Working-with-HyperLinks.md | 4 +- .../PDF-Library/NET/Working-with-Layers.md | 112 +++++ .../PDF-Library/NET/Working-with-Metadata.md | 317 +++++++------- .../NET/Working-with-Named-Destination.md | 86 +++- .../NET/Working-with-PDF-Conformance.md | 400 ++++++++++-------- .../NET/Working-with-PDF-Templates.md | 144 +++++-- .../PDF/PDF-Library/NET/Working-with-Pages.md | 365 ++++++++++------ .../PDF-Library/NET/Working-with-Portfolio.md | 69 ++- .../PDF-Library/NET/Working-with-Redaction.md | 299 +++++++++---- 9 files changed, 1135 insertions(+), 661 deletions(-) diff --git a/Document-Processing/PDF/PDF-Library/NET/Working-with-HyperLinks.md b/Document-Processing/PDF/PDF-Library/NET/Working-with-HyperLinks.md index ee5922abf..cce02b755 100644 --- a/Document-Processing/PDF/PDF-Library/NET/Working-with-HyperLinks.md +++ b/Document-Processing/PDF/PDF-Library/NET/Working-with-HyperLinks.md @@ -1,11 +1,11 @@ --- -title: Working with Hyperlinks | Syncfusion +title: Working with Hyperlinks in PDF | Syncfusion description: This section explains how to add hyperlink in a new and existing PDF document using Syncfusion .NET PDF library platform: document-processing control: PDF documentation: UG --- -# Working with Hyperlinks +# Working with Hyperlinks in PDF In PDF, hyperlinks can be added to allow the users to navigate to another part of PDF file, web page or any other external content. Essential® PDF provides support for all these types of hyperlink. diff --git a/Document-Processing/PDF/PDF-Library/NET/Working-with-Layers.md b/Document-Processing/PDF/PDF-Library/NET/Working-with-Layers.md index bdd9a615d..98e5eb3c2 100644 --- a/Document-Processing/PDF/PDF-Library/NET/Working-with-Layers.md +++ b/Document-Processing/PDF/PDF-Library/NET/Working-with-Layers.md @@ -88,6 +88,10 @@ document.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Graphics +Imports System.Drawing + 'Create PDF document. Dim document As New PdfDocument() 'Add the page. @@ -196,6 +200,11 @@ loadedDocument.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Graphics +Imports Syncfusion.Pdf.Parsing +Imports System.Drawing + 'Load the existing PDF document. Dim loadedDocument As New PdfLoadedDocument("Input.pdf") 'Get first page from document @@ -236,6 +245,11 @@ Essential® PDF allows the users to add different types of [Annota {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Layer/Adding-annotation-to-layer-in-the-PDF-document/.NET/Adding-annotation-to-layer-in-the-PDF-document/Program.cs" %} +using Syncfusion.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; +using Syncfusion.Pdf.Interactive; + //Create new PDF document PdfDocument document = new PdfDocument(); //Add page @@ -265,6 +279,11 @@ document.Close(true); {% highlight c# tabtitle="C# [Windows-specific]" %} +using System.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; +using Syncfusion.Pdf.Interactive; + //Create new PDF document PdfDocument document = new PdfDocument(); //Add page @@ -294,6 +313,11 @@ document.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Graphics +Imports Syncfusion.Pdf.Interactive +Imports System.Drawing + 'Create new PDF document Dim document As New PdfDocument() 'Add page @@ -331,6 +355,12 @@ The following code illustrates how to add annotation to the layers in an existin {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Layer/Add-annotation-to-the-layer-in-an-existing-PDF-document/.NET/Add-annotation-to-the-layer-in-an-existing-PDF-document/Program.cs" %} +using Syncfusion.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; +using Syncfusion.Pdf.Interactive; +using Syncfusion.Pdf.Parsing; + //Load the PDF document PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Input.pdf"); //Gets the first page from the document @@ -360,6 +390,12 @@ loadedDocument.Close(true); {% highlight c# tabtitle="C# [Windows-specific]" %} +using System.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; +using Syncfusion.Pdf.Interactive; +using Syncfusion.Pdf.Parsing; + //Load the existing PDF document PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Input.pdf"); //Gets the first page from the document @@ -389,6 +425,12 @@ loadedDocument.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Graphics +Imports Syncfusion.Pdf.Parsing +Imports Syncfusion.Pdf.Interactive +Imports System.Drawing + 'Load the existing PDF document Dim loadedDocument As New PdfLoadedDocument("Input.pdf") 'Gets the first page from the document @@ -428,6 +470,10 @@ Essential® PDF allows users to add nested layers in the PDF docum {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Layer/Add-nested-layers-in-the-PDF-document/.NET/Add-nested-layers-in-the-PDF-document/Program.cs" %} +using Syncfusion.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; + //Create the PDF document PdfDocument document = new PdfDocument(); //Add the page @@ -459,6 +505,10 @@ document.Close(true); {% highlight c# tabtitle="C# [Windows-specific]" %} +using System.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; + //Create the PDF document PdfDocument document = new PdfDocument(); //Add the page @@ -490,6 +540,10 @@ document.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Graphics +Imports System.Drawing + 'Create the PDF document Dim document As New PdfDocument() 'Add the page @@ -531,6 +585,9 @@ You can remove the layers using [RemoveAt](https://help.syncfusion.com/cr/docume {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Layer/Removing-layers-from-an-existing-PDF-document/.NET/Removing-layers-from-an-existing-PDF-document/Program.cs" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Parsing; + //Load the PDF document PdfLoadedDocument document = new PdfLoadedDocument("Input.pdf"); //Gets the first page from the document @@ -550,6 +607,9 @@ document.Close(true); {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Parsing; + //Load the existing PDF document PdfLoadedDocument document = new PdfLoadedDocument("Input.pdf"); //Gets the first page from the document @@ -569,6 +629,9 @@ document.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Parsing + 'Load the existing PDF document Dim document As PdfLoadedDocument = New PdfLoadedDocument("Input.pdf") 'Gets the first page from the document @@ -598,6 +661,9 @@ You can flatten a layer in a PDF document by removing it from the [PdfDocumentLa {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Layer/Flattening-the-layers-in-an-existing-PDF-document/.NET/Flattening-the-layers-in-an-existing-PDF-document/Program.cs" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Parsing; + //Load the existing PDF document PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Input.pdf"); @@ -615,6 +681,9 @@ loadedDocument.Close(true); {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Parsing; + //Load the existing PDF document PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Layers.pdf"); @@ -632,6 +701,9 @@ loadedDocument.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Parsing + 'Load the existing PDF document Dim loadedDocument As PdfLoadedDocument = New PdfLoadedDocument("Layers.pdf") @@ -661,6 +733,10 @@ The below code illustrates how to toggle the visibility of layers in new PDF doc {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Layer/Toggle-the-visibility-of-layers-in-new-PDF-document/.NET/Toggle-the-visibility-of-layers-in-new-PDF-document/Program.cs" %} +using Syncfusion.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; + //Create the document PdfDocument document = new PdfDocument(); //Create a page @@ -692,6 +768,10 @@ document.Close(true); {% highlight c# tabtitle="C# [Windows-specific]" %} +using System.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; + //Create the document PdfDocument document = new PdfDocument(); //Create a page @@ -724,6 +804,9 @@ document.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Graphics +Imports System.Drawing 'Create the document Dim document As New PdfDocument() 'Create a page @@ -763,6 +846,9 @@ The following code illustrates how to toggle the visibility of layers in an exis {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Layer/Toggle-the-visibility-of-layers-in-an-existing-PDF/.NET/Toggle-the-visibility-of-layers-in-an-existing-PDF/Program.cs" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Parsing; + //Load the PDF document PdfLoadedDocument document = new PdfLoadedDocument("Input.pdf"); @@ -780,6 +866,9 @@ document.Close(true); {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Parsing; + //Load the existing PDF document PdfLoadedDocument document = new PdfLoadedDocument("Input.pdf"); @@ -797,6 +886,9 @@ document.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Parsing + 'Load the existing PDF document Dim document As PdfLoadedDocument = New PdfLoadedDocument("Input.pdf") @@ -826,6 +918,10 @@ The following code sample shows how to add a lock state to the layer in a new PD {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Layer/Add-a-lock-state-to-the-layer-in-a-new-PDF-document/.NET/Add-a-lock-state-to-the-layer-in-a-new-PDF-document/Program.cs" %} +using Syncfusion.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; + //Creating a new PDF document. PdfDocument document = new PdfDocument(); //Adding a new page to the PDF document. @@ -850,6 +946,10 @@ document.Close(true); {% highlight c# tabtitle="C# [Windows-specific]" %} +using System.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; + //Creating a new PDF document. PdfDocument document = new PdfDocument(); //Adding a new page to the PDF document. @@ -874,6 +974,10 @@ document.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Graphics +Imports System.Drawing + 'Creating a new PDF document. Dim document As PdfDocument = New PdfDocument() 'Adding a new page to the PDF document. @@ -918,6 +1022,10 @@ This is illustrated in the following code sample. {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; +using Syncfusion.Pdf.Parsing; + //Load the existing PDF document. PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Layers.pdf"); @@ -941,6 +1049,10 @@ loadedDocument.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Graphics +Imports Syncfusion.Pdf.Parsing + 'Load the existing PDF document. Dim loadedDocument As PdfLoadedDocument = New PdfLoadedDocument("Output.pdf") diff --git a/Document-Processing/PDF/PDF-Library/NET/Working-with-Metadata.md b/Document-Processing/PDF/PDF-Library/NET/Working-with-Metadata.md index 795912637..12093da51 100644 --- a/Document-Processing/PDF/PDF-Library/NET/Working-with-Metadata.md +++ b/Document-Processing/PDF/PDF-Library/NET/Working-with-Metadata.md @@ -24,6 +24,9 @@ You can add XMP metadata in a PDF document using the [XmpMetadata](https://help. {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Metadata/Adding-XMP-metadata-in-PDF-document/.NET/Adding-XMP-metadata-in-PDF-document/Program.cs" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Xmp; + //Create a PDF document PdfDocument pdfDoc = new PdfDocument(); //Create a page @@ -47,22 +50,16 @@ basic.Nickname = "nickname"; basic.Rating.Add(-25); //Save and close the document -MemoryStream stream = new MemoryStream(); -pdfDoc.Save(stream); -stream.Position = 0; -//Close the document +pdfDoc.Save("Output.pdf"); pdfDoc.Close(true); -//Defining the content type for PDF file -string contentType = "application/pdf"; -//Define the file name -string fileName = "DocumentInformation.pdf"; -//Creates a FileContentResult object by using the file contents, content type, and file name -return File(stream, contentType, fileName); {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Xmp; + //Create a PDF document PdfDocument pdfDoc = new PdfDocument(); //Create a page @@ -86,13 +83,16 @@ basic.Nickname = "nickname"; basic.Rating.Add(-25); //Save and close the document -pdfDoc.Save("DocumentInformation.pdf"); +pdfDoc.Save("Output.pdf"); pdfDoc.Close(true); {% endhighlight %} {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf.Xmp +Imports Syncfusion.Pdf + 'Create a PDF document Dim pdfDoc As New PdfDocument() 'Create a page @@ -133,9 +133,12 @@ You can add metadata in an existing PDF document using the [XmpMetadata](https:/ {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Metadata/Adding-XMP-metadata-to-an-existing-PDF-document/.NET/Adding-XMP-metadata-to-an-existing-PDF-document/Program.cs" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Parsing; +using Syncfusion.Pdf.Xmp; + //Load the PDF document -FileStream docStream = new FileStream("Input.pdf", FileMode.Open, FileAccess.Read); -PdfLoadedDocument pdfDoc = new PdfLoadedDocument(docStream); +PdfLoadedDocument pdfDoc = new PdfLoadedDocument("Input.pdf"); //Get XMP object XmpMetadata metaData = pdfDoc.DocumentInformation.XmpMetadata; @@ -155,22 +158,18 @@ basic.Nickname = "nickname"; basic.Rating.Add(-25); //Save and close the document -MemoryStream stream = new MemoryStream(); -pdfDoc.Save(stream); -stream.Position = 0; -//Close the document +pdfDoc.Save("Output.pdf"); pdfDoc.Close(true); -//Defining the content type for PDF file -string contentType = "application/pdf"; -//Define the file name -string fileName = "DocumentInformation.pdf"; -//Creates a FileContentResult object by using the file contents, content type, and file name -return File(stream, contentType, fileName); + {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Parsing; +using Syncfusion.Pdf.Xmp; + //Load the document PdfLoadedDocument pdfDoc = new PdfLoadedDocument("input.pdf"); @@ -192,13 +191,17 @@ basic.Nickname = "nickname"; basic.Rating.Add(-25); //Save and close the document -pdfDoc.Save("DocumentInformation.pdf"); +pdfDoc.Save("Output.pdf"); pdfDoc.Close(true); {% endhighlight %} {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf.Parsing +Imports Syncfusion.Pdf.Xmp +Imports Syncfusion.Pdf + 'Load the document Dim pdfDoc As New PdfLoadedDocument("input.pdf") @@ -260,6 +263,9 @@ The [BasicSchema](https://help.syncfusion.com/cr/document-processing/Syncfusion. {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Metadata/Create-PDF-document-with-XMP-basic-schema/.NET/Create-PDF-document-with-XMP-basic-schema/Program.cs" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Xmp; + //Create a PDF document PdfDocument pdfDoc = new PdfDocument(); //Create a page @@ -283,22 +289,17 @@ basic.Nickname = "nickname"; basic.Rating.Add(-25); //Save and close the document -MemoryStream stream = new MemoryStream(); -pdfDoc.Save(stream); -stream.Position = 0; -//Close the document +pdfDoc.Save("Output.pdf"); pdfDoc.Close(true); -//Defining the content type for PDF file -string contentType = "application/pdf"; -//Define the file name -string fileName = "DocumentInformation.pdf"; -//Creates a FileContentResult object by using the file contents, content type, and file name -return File(stream, contentType, fileName); + {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Xmp; + //Create a PDF document PdfDocument pdfDoc = new PdfDocument(); //Create a page @@ -322,13 +323,16 @@ basic.Nickname = "nickname"; basic.Rating.Add(-25); //Save and close the document -pdfDoc.Save("DocumentInformation.pdf"); +pdfDoc.Save("Output.pdf"); pdfDoc.Close(true); {% endhighlight %} {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf.Xmp +Imports Syncfusion.Pdf + 'Create a PDF document Dim pdfDoc As New PdfDocument() 'Create a page @@ -381,6 +385,9 @@ The [DublinCoreSchema](https://help.syncfusion.com/cr/document-processing/Syncfu {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Metadata/Create-PDF-document-with-dubline-core-schema-properties/.NET/Create-PDF-document-with-dubline-core-schema-properties/Program.cs" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Xmp; + //Create new PDF document PdfDocument pdfDoc = new PdfDocument(); //Add a new page @@ -399,22 +406,16 @@ dublin.Type.Add("PDF"); dublin.Publisher.Add("Essential PDF"); //Save and close the document -MemoryStream stream = new MemoryStream(); -pdfDoc.Save(stream); -stream.Position = 0; -//Close the document +pdfDoc.Save("Output.pdf"); pdfDoc.Close(true); -//Defining the content type for PDF file -string contentType = "application/pdf"; -//Define the file name -string fileName = "DocumentInformation.pdf"; -//Creates a FileContentResult object by using the file contents, content type, and file name -return File(stream, contentType, fileName); {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Xmp; + //Create new PDF document PdfDocument pdfDoc = new PdfDocument(); //Add a new page @@ -433,13 +434,16 @@ dublin.Type.Add("PDF"); dublin.Publisher.Add("Essential PDF"); //Save and close the document -pdfDoc.Save("DocumentInformation.pdf"); +pdfDoc.Save("Output.pdf"); pdfDoc.Close(true); {% endhighlight %} {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf.Xmp +Imports Syncfusion.Pdf + 'Create new PDF document Dim pdfDoc As New PdfDocument() 'Add a new page @@ -483,6 +487,9 @@ The [RightsManagementSchema](https://help.syncfusion.com/cr/document-processing/ {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Metadata/Create-PDF-document-with-right-management-schema/.NET/Create-PDF-document-with-right-management-schema/Program.cs" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Xmp; + //Create PDF document PdfDocument pdfDoc = new PdfDocument(); //Add a new page @@ -499,22 +506,16 @@ rights.Owner.Add("Syncfusion"); rights.Marked = true; //Save and close the document -MemoryStream stream = new MemoryStream(); -pdfDoc.Save(stream); -stream.Position = 0; -//Close the document +pdfDoc.Save("Output.pdf"); pdfDoc.Close(true); -//Defining the content type for PDF file -string contentType = "application/pdf"; -//Define the file name -string fileName = "DocumentInformation.pdf"; -//Creates a FileContentResult object by using the file contents, content type, and file name -return File(stream, contentType, fileName); {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Xmp; + //Create PDF document PdfDocument pdfDoc = new PdfDocument(); //Add a new page @@ -530,13 +531,16 @@ rights.Owner.Add("Syncfusion"); rights.Marked = true; //Save and close the document -pdfDoc.Save("DocumentInformation.pdf"); +pdfDoc.Save("Output.pdf"); pdfDoc.Close(true); {% endhighlight %} {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf.Xmp +Imports Syncfusion.Pdf + 'Create PDF document Dim pdfDoc As New PdfDocument() 'Add a new page @@ -572,6 +576,9 @@ This schema describes very simple workflow or job information and the [BasicJobT {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Metadata/Create-PDF-document-with-basic-job-ticket-schema/.NET/Create-PDF-document-with-basic-job-ticket-schema/Program.cs" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Xmp; + //Create a document PdfDocument pdfDoc = new PdfDocument(); //Add a page @@ -586,22 +593,16 @@ BasicJobTicketSchema basicJob = metaData.BasicJobTicketSchema; basicJob.JobRef.Add("PDF document creation"); //Save and close the document -MemoryStream stream = new MemoryStream(); -pdfDoc.Save(stream); -stream.Position = 0; -//Close the document. +pdfDoc.Save("Output.pdf"); pdfDoc.Close(true); -//Defining the content type for PDF file -string contentType = "application/pdf"; -//Define the file name -string fileName = "DocumentInformation.pdf"; -//Creates a FileContentResult object by using the file contents, content type, and file name -return File(stream, contentType, fileName); {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Xmp; + //Create a document PdfDocument pdfDoc = new PdfDocument(); //Add a page @@ -616,13 +617,16 @@ BasicJobTicketSchema basicJob = metaData.BasicJobTicketSchema; basicJob.JobRef.Add("PDF document creation"); //Save and close the document -pdfDoc.Save("DocumentInformation.pdf"); +pdfDoc.Save("Output.pdf"); pdfDoc.Close(true); {% endhighlight %} {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf.Xmp +Imports Syncfusion.Pdf + 'Create a document Dim pdfDoc As New PdfDocument() 'Add a page @@ -661,6 +665,9 @@ The [PagedTextSchema](https://help.syncfusion.com/cr/document-processing/Syncfus {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Metadata/Create-PDF-document-with-pages-text-schema/.NET/Create-PDF-document-with-pages-text-schema/Program.cs" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Xmp; + //Create a PDF document PdfDocument pdfDoc = new PdfDocument(); //Create a Page @@ -678,22 +685,16 @@ pagedText.NPages = 1; pagedText.PlateNames.Add("Sample page"); //Save and close the document -MemoryStream stream = new MemoryStream(); -pdfDoc.Save(stream); -stream.Position = 0; -//Close the document +pdfDoc.Save("Output.pdf"); pdfDoc.Close(true); -//Defining the content type for PDF file -string contentType = "application/pdf"; -//Define the file name -string fileName = "DocumentInformation.pdf"; -//Creates a FileContentResult object by using the file contents, content type, and file name -return File(stream, contentType, fileName); {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Xmp; + //Create a Pdf document PdfDocument pdfDoc = new PdfDocument(); //Create a Page @@ -711,13 +712,16 @@ pagedText.NPages = 1; pagedText.PlateNames.Add("Sample page"); //Save and close the document -pdfDoc.Save("DocumentInformation.pdf"); +pdfDoc.Save("Output.pdf"); pdfDoc.Close(true); {% endhighlight %} {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf.Xmp +Imports Syncfusion.Pdf + 'Create a PDF document Dim pdfDoc As New PdfDocument() 'Create a Page @@ -752,6 +756,9 @@ This schema specifies the properties used with Adobe PDF documents. The [PDFSche {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Metadata/Create-PDF-document-with-PDF-schema/.NET/Create-PDF-document-with-PDF-schema/Program.cs" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Xmp; + //Create a PDF document PdfDocument pdfDoc = new PdfDocument(); //Add a page @@ -768,22 +775,16 @@ pdfSchema.PDFVersion = "1.5"; pdfSchema.Keywords = "Essential PDF"; //Save and close the document -MemoryStream stream = new MemoryStream(); -pdfDoc.Save(stream); -stream.Position = 0; -//Close the document +pdfDoc.Save("Output.pdf"); pdfDoc.Close(true); -//Defining the content type for PDF file -string contentType = "application/pdf"; -//Define the file name -string fileName = "DocumentInformation.pdf"; -//Creates a FileContentResult object by using the file contents, content type, and file name -return File(stream, contentType, fileName); {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Xmp; + //Create a PDF document PdfDocument pdfDoc = new PdfDocument(); //Add a page @@ -800,13 +801,16 @@ pdfSchema.PDFVersion = "1.5"; pdfSchema.Keywords = "Essential PDF"; //Save and close the document -pdfDoc.Save("DocumentInformation.pdf"); +pdfDoc.Save("Output.pdf"); pdfDoc.Close(true); {% endhighlight %} {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf.Xmp +Imports Syncfusion.Pdf + 'Create a PDF document Dim pdfDoc As New PdfDocument() 'Add a page @@ -845,6 +849,9 @@ Add the following code sample to define the custom schema in a PDF document. {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Metadata/Create-PDF-document-with-custom-schema/.NET/Create-PDF-document-with-custom-schema/Program.cs" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Xmp; + //Create PDF document PdfDocument pdfDoc = new PdfDocument(); //Add a new page @@ -860,23 +867,17 @@ customSchema["DOCID"] = "SYNCSAM001"; customSchema["Encryption"] = "Standard"; customSchema["Project"] = "Data processing"; -//Save the document -MemoryStream stream = new MemoryStream(); -pdfDoc.Save(stream); -stream.Position = 0; -//Close the document +//Save and close the document +pdfDoc.Save("Output.pdf"); pdfDoc.Close(true); -//Defining the content type for PDF file -string contentType = "application/pdf"; -//Define the file name -string fileName = "DocumentInformation.pdf"; -//Creates a FileContentResult object by using the file contents, content type, and file name -return File(stream, contentType, fileName); {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Xmp; + //Create Pdf document PdfDocument pdfDoc = new PdfDocument(); //Add a new page @@ -894,13 +895,16 @@ customSchema["Encryption"] = "Standard"; customSchema["Project"] = "Data processing"; //Save and close the document -pdfDoc.Save("DocumentInformation.pdf"); +pdfDoc.Save("Output.pdf"); pdfDoc.Close(true); {% endhighlight %} {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf.Xmp +Imports Syncfusion.Pdf + 'Create PDF document Dim pdfDoc As New PdfDocument() 'Add a new page @@ -935,6 +939,9 @@ Essential® PDF allows you to add required metadata (custom schema {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Metadata/Adding-custom-schema-to-the-PDF-document/.NET/Adding-custom-schema-to-the-PDF-document/Program.cs" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Xmp; + //Create PDF document PdfDocument pdfDoc = new PdfDocument(); //Add a new page @@ -950,22 +957,16 @@ customSchema["creationDate"] = DateTime.Now.ToString(); customSchema["DOCID"] = "SYNCSAM001"; //Save and close the document -MemoryStream stream = new MemoryStream(); -pdfDoc.Save(stream); -stream.Position = 0; -//Close the document +pdfDoc.Save("Output.pdf"); pdfDoc.Close(true); -//Defining the content type for PDF file -string contentType = "application/pdf"; -//Define the file name -string fileName = "CustomMetaField.pdf"; -//Creates a FileContentResult object by using the file contents, content type, and file name -return File(stream, contentType, fileName); {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Xmp; + //Create PDF document PdfDocument pdfDoc = new PdfDocument(); //Add a new page @@ -988,6 +989,9 @@ pdfDoc.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf.Xmp +Imports Syncfusion.Pdf + 'Create PDF document Dim pdfDoc As New PdfDocument() 'Add a new page @@ -1020,6 +1024,9 @@ The custom metadata can be added in PDF document by using the [CustomMetadata](h {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Metadata/Adding-custom-metadata-to-the-PDF-document/.NET/Adding-custom-metadata-to-the-PDF-document/Program.cs" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Xmp; + //Create PDF document PdfDocument pdfDoc = new PdfDocument(); //Add new PDF page @@ -1031,22 +1038,16 @@ pdfDoc.DocumentInformation.CustomMetadata["CompanyName"] = "Syncfusion"; pdfDoc.DocumentInformation.CustomMetadata["Key"] = "DocumentKey"; //Save and close the document -MemoryStream stream = new MemoryStream(); -pdfDoc.Save(stream); -stream.Position = 0; -//Close the document +pdfDoc.Save("Output.pdf"); pdfDoc.Close(true); -//Defining the content type for PDF file -string contentType = "application/pdf"; -//Define the file name -string fileName = "AddCustomField.pdf"; -//Creates a FileContentResult object by using the file contents, content type, and file name -return File(stream, contentType, fileName); {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Xmp; + //Create PDF document PdfDocument pdfDoc = new PdfDocument(); //Add new PDF page @@ -1065,6 +1066,9 @@ pdfDoc.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf.Xmp +Imports Syncfusion.Pdf + 'Create PDF document Dim pdfDoc As New PdfDocument() 'Add new PDF page @@ -1093,30 +1097,28 @@ Removing the custom metadata from an existing PDF document using the [Remove](ht {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Metadata/Remove-custom-metadata-from-an-existing-PDF-document/.NET/Remove-custom-metadata-from-an-existing-PDF-document/Program.cs" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Xmp; +using Syncfusion.Pdf.Parsing; + //Load the PDF document -FileStream docStream = new FileStream("Input.pdf", FileMode.Open, FileAccess.Read); -PdfLoadedDocument loadedDocument = new PdfLoadedDocument(docStream); +PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Input.pdf"); //Remove custom metadata using key name loadedDocument.DocumentInformation.CustomMetadata.Remove("Key"); //Save and close the document -MemoryStream stream = new MemoryStream(); -loadedDocument.Save(stream); -stream.Position = 0; -//Close the document +loadedDocument.Save("Output.pdf"); loadedDocument.Close(true); -//Defining the content type for PDF file -string contentType = "application/pdf"; -//Define the file name -string fileName = "Output.pdf"; -//Creates a FileContentResult object by using the file contents, content type, and file name -return File(stream, contentType, fileName); {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Xmp; +using Syncfusion.Pdf.Parsing; + //Load the document PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Input.pdf"); @@ -1131,6 +1133,10 @@ loadedDocument.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf.Parsing +Imports Syncfusion.Pdf.Xmp +Imports Syncfusion.Pdf + 'Load the document Dim loadedDocument As PdfLoadedDocument = New PdfLoadedDocument("Input.pdf") @@ -1159,6 +1165,10 @@ You can add the XMP metadata along with an image to the PDF document. The [PdfBi {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Metadata/Adding-XMP-metadata-along-with-an-image-in-PDF/.NET/Adding-XMP-metadata-along-with-an-image-in-PDF/Program.cs" %} +using Syncfusion.Pdf.Graphics; +using Syncfusion.Pdf; +using System.Reflection.Metadata; + //Create a new PDF document PdfDocument doc = new PdfDocument(); //Add a page to the document @@ -1172,24 +1182,18 @@ PdfBitmap image = new PdfBitmap(imageStream, true); //Draw the image graphics.DrawImage(image, 0, 0); -//Creating the stream object -MemoryStream stream = new MemoryStream(); -//Save the document as stream -doc.Save(stream); -stream.Position = 0; +//Save the document +doc.Save("Output.pdf"); //Close the document doc.Close(true); -//Defining the content type for PDF file -string contentType = "application/pdf"; -//Define the file name -string fileName = "Output.pdf"; -//Creates a FileContentResult object by using the file contents, content type, and file name -return File(stream, contentType, fileName); - {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf.Graphics; +using Syncfusion.Pdf; +using System.Reflection.Metadata; + //Create a new PDF document PdfDocument doc = new PdfDocument(); //Add a page to the document @@ -1211,6 +1215,10 @@ doc.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Graphics +Imports System.Reflection.Metadata + 'Create a new PDF document Dim doc As New PdfDocument() 'Add a page to the document @@ -1244,9 +1252,12 @@ Refer to the following code example to extract the image metadata from a PDF ima {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Metadata/Extracting-XMP-metadata-from-PDF-image/.NET/Extracting-XMP-metadata-from-PDF-image/Program.cs" %} -//Load an existing PDF -FileStream docStream = new FileStream("Input.pdf", FileMode.Open, FileAccess.Read); -PdfLoadedDocument loadedDocument = new PdfLoadedDocument(docStream); +using Syncfusion.Pdf.Parsing; +using Syncfusion.Pdf.Xmp; +using Syncfusion.Pdf; + +//Load the PDF document +PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Input.pdf"); //Load the first page PdfPageBase pageBase = loadedDocument.Pages[0]; @@ -1262,6 +1273,10 @@ loadedDocument.Close(true); {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf.Parsing; +using Syncfusion.Pdf.Xmp; +using Syncfusion.Pdf; + //Load an existing PDF document PdfLoadedDocument loadedDocument = new PdfLoadedDocument(fileName); //Load the first page @@ -1279,6 +1294,10 @@ loadedDocument.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf.Parsing +Imports Syncfusion.Pdf.Xmp +Imports Syncfusion.Pdf + 'Load an existing PDF Dim loadedDocument As New PdfLoadedDocument(fileName) 'Load the first page diff --git a/Document-Processing/PDF/PDF-Library/NET/Working-with-Named-Destination.md b/Document-Processing/PDF/PDF-Library/NET/Working-with-Named-Destination.md index b864b4559..71141373f 100644 --- a/Document-Processing/PDF/PDF-Library/NET/Working-with-Named-Destination.md +++ b/Document-Processing/PDF/PDF-Library/NET/Working-with-Named-Destination.md @@ -28,6 +28,11 @@ The following code example shows how to add named destination in a new PDF docum {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Named%20Destination/Adding-named-destination-to-a-PDF-document/.NET/Adding-named-destination-to-a-PDF-document/Program.cs" %} +using Syncfusion.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; +using Syncfusion.Pdf.Interactive; + //Create a new PDF document. PdfDocument doc = new PdfDocument(); //Add a page to the document. @@ -43,16 +48,19 @@ doc.NamedDestinationCollection.Add(destination); //Draw the text. page.Graphics.DrawString("Hello World!!", new PdfStandardFont(PdfFontFamily.Helvetica, 10), PdfBrushes.Black, new PointF(0, 500)); -//Save the document into stream. -MemoryStream stream = new MemoryStream(); -doc.Save(stream); -//Closes the document +//Save the document. +doc.Save("Output.pdf"); +//Close the document. doc.Close(true); - {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using System.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; +using Syncfusion.Pdf.Interactive; + //Create a new PDF document. PdfDocument doc = new PdfDocument(); //Add a page to the document. @@ -77,6 +85,11 @@ doc.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports System.Drawing +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Graphics +Imports Syncfusion.Pdf.Interactive + 'Create a new PDF document. Dim doc As New PdfDocument() 'Add a page to the document. @@ -111,9 +124,13 @@ The following code example shows how to add named destination in an existing PDF {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Named%20Destination/Adding-named-destination-to-an-existing-PDF-document/.NET/Adding-named-destination-to-an-existing-PDF-document/Program.cs" %} +using Syncfusion.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Interactive; +using Syncfusion.Pdf.Parsing; + //Load the PDF document. -FileStream docStream = new FileStream("Input.pdf", FileMode.Open, FileAccess.Read); -PdfLoadedDocument loadedDocument = new PdfLoadedDocument(docStream); +PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Input.pdf"); //Get the first page of the document. PdfPageBase page = loadedDocument.Pages[0]; //Create an instance for named destination. @@ -125,16 +142,20 @@ destination.Destination.Location = new PointF(0, 500); destination.Destination.Zoom = 4; loadedDocument.NamedDestinationCollection.Add(destination); -//Save the document into stream. -MemoryStream stream = new MemoryStream(); -loadedDocument.Save(stream); -//Closes the document. +//Save the document. +loadedDocument.Save("Output.pdf"); +//Close the document. loadedDocument.Close(true); {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using System.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Interactive; +using Syncfusion.Pdf.Parsing; + //Load the PDF document. PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Input.pdf"); //Get the first page of the document. @@ -157,6 +178,11 @@ loadedDocument.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports System.Drawing +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Parsing +Imports Syncfusion.Pdf.Interactive + 'Load the PDF document. Dim loadedDocument As New PdfLoadedDocument("Input.pdf") 'Get the first page of the document. @@ -189,9 +215,11 @@ You can remove the named destination using [Remove](https://help.syncfusion.com/ {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Named%20Destination/Remove-and-modify-the-named-destination-in-a-PDF/.NET/Remove-and-modify-the-named-destination-in-a-PDF/Program.cs" %} +using Syncfusion.Pdf.Interactive; +using Syncfusion.Pdf.Parsing; + //Load the PDF document. -FileStream docStream = new FileStream("Barcode.pdf", FileMode.Open, FileAccess.Read); -PdfLoadedDocument lDoc = new PdfLoadedDocument(docStream); +PdfLoadedDocument lDoc = new PdfLoadedDocument("Input.pdf"); //Get the named destination collection. PdfNamedDestinationCollection destinationCollection = lDoc.NamedDestinationCollection; //Remove the named destination by title. @@ -200,9 +228,8 @@ destinationCollection.Remove("TOC"); PdfNamedDestination destination = destinationCollection[0]; destination.Title = "POC"; -//Save the document into stream. -MemoryStream stream = new MemoryStream(); -lDoc.Save(stream); +//Save the document. +lDoc.Save("Output.pdf"); //Close the document. lDoc.Close(true); @@ -210,6 +237,9 @@ lDoc.Close(true); {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf.Interactive; +using Syncfusion.Pdf.Parsing; + //Load the PDF document. PdfLoadedDocument lDoc = new PdfLoadedDocument("Sample.pdf"); //Get the named destination collection. @@ -230,6 +260,9 @@ lDoc.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf.Parsing +Imports Syncfusion.Pdf.Interactive + 'Load the PDF document. Dim lDoc As New PdfLoadedDocument("Sample.pdf") 'Get the named destination collection. @@ -260,6 +293,11 @@ The following code example shows how to add named destination to the [Bookmarks] {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Named%20Destination/Adding-named-destination-to-the-bookmarks/.NET/Adding-named-destination-to-the-bookmarks/Program.cs" %} +using Syncfusion.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; +using Syncfusion.Pdf.Interactive; + //Create a new PDF document. PdfDocument doc = new PdfDocument(); //Add a page to the document. @@ -278,10 +316,8 @@ PdfBookmark bookmark = doc.Bookmarks.Add("TOC"); //Assign the named destination to the bookmark. bookmark.NamedDestination = destination; -//Save the document into stream. -MemoryStream stream = new MemoryStream(); -doc.Save(stream); -stream.Position = 0; +//Save the document. +doc.Save("Sample.pdf"); //Close the document. doc.Close(true); @@ -289,6 +325,11 @@ doc.Close(true); {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; +using Syncfusion.Pdf.Interactive; + //Create a new PDF document. PdfDocument doc = new PdfDocument(); //Add a page to the document. @@ -316,6 +357,11 @@ doc.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports System.Drawing +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Graphics +Imports Syncfusion.Pdf.Interactive + 'Create a new PDF document. Dim doc As New PdfDocument() 'Add a page to the document. diff --git a/Document-Processing/PDF/PDF-Library/NET/Working-with-PDF-Conformance.md b/Document-Processing/PDF/PDF-Library/NET/Working-with-PDF-Conformance.md index ecf21596b..30a3ab9f7 100644 --- a/Document-Processing/PDF/PDF-Library/NET/Working-with-PDF-Conformance.md +++ b/Document-Processing/PDF/PDF-Library/NET/Working-with-PDF-Conformance.md @@ -123,6 +123,9 @@ You can create a PDF/A-1b document by specifying the conformance level as ```Pdf {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/PDF%20Conformance/Creating-the-new-PDFA1B-document/.NET/Creating-the-new-PDFA1B-document/Program.cs" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; + //Create a new document with PDF/A-1b standard PdfDocument document = new PdfDocument(PdfConformanceLevel.Pdf_A1B); //Add a page to the document @@ -137,25 +140,16 @@ PdfFont font = new PdfTrueTypeFont(fontStream, 14); //Draw the text graphics.DrawString("Hello World!!!", font, PdfBrushes.Black, new Syncfusion.Drawing.PointF(0, 0)); -//Creating the stream object -MemoryStream stream = new MemoryStream(); -//Save the document into memory stream -document.Save(stream); -//If the position is not set to '0', then the PDF will be empty -stream.Position = 0; -//Close the document +//Save and close the document. +document.Save("Output.pdf"); document.Close(true); -//Defining the content type for PDF file -string contentType = "application/pdf"; -//Define the file name -string fileName = "Output.pdf"; -//Creates a FileContentResult object by using the file contents, content type, and file name -return File(stream, contentType, fileName); - {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; + //Create a new document with PDF/A-1b standard. PdfDocument document = new PdfDocument(PdfConformanceLevel.Pdf_A1B); //Add a page. @@ -180,6 +174,9 @@ document.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Graphics + 'Create a new document with PDF/A-1b standard. Dim document As New PdfDocument(PdfConformanceLevel.Pdf_A1B) 'Add a page. @@ -214,6 +211,9 @@ You can create a PDF/A-2b document by specifying the conformance level as ```Pdf {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/PDF%20Conformance/Creating-the-new-PDFA2B-document/.NET/Creating-the-new-PDFA2B-document/Program.cs" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; + //Create a new document with PDF/A-2b standard PdfDocument document = new PdfDocument(PdfConformanceLevel.Pdf_A2B); //Add a page to the document @@ -228,25 +228,17 @@ PdfFont font = new PdfTrueTypeFont(fontStream, 14); //Draw the text graphics.DrawString("Hello World!!!", font, PdfBrushes.Black, new Syncfusion.Drawing.PointF(0, 0)); -//Creating the stream object -MemoryStream stream = new MemoryStream(); -//Save the document into memory stream -document.Save(stream); -//If the position is not set to '0', then the PDF will be empty -stream.Position = 0; -//Close the document +//Save and close the document. +document.Save("Output.pdf"); document.Close(true); -//Defining the ContentType for PDF file -string contentType = "application/pdf"; -//Define the file name -string fileName = "Output.pdf"; -//Creates a FileContentResult object by using the file contents, content type, and file name -return File(stream, contentType, fileName); {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; + //Create a new document with PDF/A-2b standard PdfDocument document = new PdfDocument(PdfConformanceLevel.Pdf_A2B); //Add a page @@ -271,6 +263,9 @@ document.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Graphics + 'Create a new document with PDF/A-2b standard Dim document As New PdfDocument(PdfConformanceLevel.Pdf_A2B) 'Add a page @@ -307,6 +302,10 @@ You can create a PDF/A-3b document by specifying the conformance level as Pdf_A3 {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/PDF%20Conformance/Creating-the-new-PDFA3B-document/.NET/Creating-the-new-PDFA3B-document/Program.cs" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; +using Syncfusion.Pdf.Interactive; + //Create a new document with PDF/A-3b standard PdfDocument document = new PdfDocument(PdfConformanceLevel.Pdf_A3B); //Add a page to the document @@ -330,25 +329,18 @@ PdfFont font = new PdfTrueTypeFont(fontStream, 14); //Draw the text graphics.DrawString("Hello World!!!", font, PdfBrushes.Black, new Syncfusion.Drawing.PointF(0, 0)); -//Creating the stream object -MemoryStream stream = new MemoryStream(); -//Save the document into memory stream -document.Save(stream); -//If the position is not set to '0', then the PDF will be empty -stream.Position = 0; -//Close the document +//Save and close the document. +document.Save("Output.pdf"); document.Close(true); -//Defining the ContentType for PDF file -string contentType = "application/pdf"; -//Define the file name -string fileName = "Output.pdf"; -//Creates a FileContentResult object by using the file contents, content type, and file name -return File(stream, contentType, fileName); {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; +using Syncfusion.Pdf.Interactive; + //Create a new document with PDF/A-3b standard PdfDocument document = new PdfDocument(PdfConformanceLevel.Pdf_A3B); //Add a page @@ -381,6 +373,10 @@ document.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Graphics +Imports Syncfusion.Pdf.Interactive + 'Create a new document with PDF/A-3b standard Dim document As New PdfDocument(PdfConformanceLevel.Pdf_A3B) 'Add a page @@ -425,6 +421,9 @@ You can create a PDF/A-1a document by specifying the conformance level as ```Pdf {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/PDF%20Conformance/Creating-the-new-PDFA1A-document/.NET/Creating-the-new-PDFA1A-document/Program.cs" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; + //Create a new document with PDF/A-1a standard PdfDocument document = new PdfDocument(PdfConformanceLevel.Pdf_A1A); //Add a page to the document @@ -438,25 +437,16 @@ PdfFont font = new PdfTrueTypeFont(fontStream, 14); //Draw the text graphics.DrawString("Hello World!!!", font, PdfBrushes.Black, new Syncfusion.Drawing.PointF(0, 0)); -//Creating the stream object -MemoryStream stream = new MemoryStream(); -//Save the document into memory stream -document.Save(stream); -//If the position is not set to '0', then the PDF will be empty -stream.Position = 0; -//Close the document +//Save and close the document. +document.Save("Output.pdf"); document.Close(true); -//Defining the ContentType for PDF file -string contentType = "application/pdf"; -//Define the file name -string fileName = "Output.pdf"; -//Creates a FileContentResult object by using the file contents, content type, and file name -return File(stream, contentType, fileName); - {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; + //Create a new document with PDF/A-1a standard. PdfDocument document = new PdfDocument(PdfConformanceLevel.Pdf_A1A); //Add a page. @@ -480,6 +470,9 @@ document.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Graphics + 'Create a new document with PDF/A-1a standard. Dim document As New PdfDocument(PdfConformanceLevel.Pdf_A1A) 'Add a page. @@ -515,6 +508,9 @@ You can create a PDF/A-2a document by specifying the conformance level as ```Pdf {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/PDF%20Conformance/Creating-the-new-PDFA2A-document/.NET/Creating-the-new-PDFA2A-document/Program.cs" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; + //Create a new document with PDF/A-2a standard PdfDocument document = new PdfDocument(PdfConformanceLevel.Pdf_A2A); //Add a page to the document @@ -528,25 +524,17 @@ PdfFont font = new PdfTrueTypeFont(fontStream, 14); //Draw the text graphics.DrawString("Hello World!!!", font, PdfBrushes.Black, new Syncfusion.Drawing.PointF(0, 0)); -//Creating the stream object -MemoryStream stream = new MemoryStream(); -//Save the document into memory stream -document.Save(stream); -//If the position is not set to '0', then the PDF will be empty -stream.Position = 0; -//Close the document +//Save and close the document. +document.Save("Output.pdf"); document.Close(true); -//Defining the ContentType for PDF file -string contentType = "application/pdf"; -//Define the file name -string fileName = "Output.pdf"; -//Creates a FileContentResult object by using the file contents, content type, and file name -return File(stream, contentType, fileName); {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; + //Create a new document with PDF/A-2a standard PdfDocument document = new PdfDocument(PdfConformanceLevel.Pdf_A2A); //Add a page @@ -570,6 +558,9 @@ document.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Graphics + 'Create a new document with PDF/A-2a standard Dim document As New PdfDocument(PdfConformanceLevel.Pdf_A2A) 'Add a page @@ -605,6 +596,10 @@ You can create a PDF/A-3a document by specifying the conformance level as ``Pdf_ {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/PDF%20Conformance/Creating-the-new-PDFA3A-document/.NET/Creating-the-new-PDFA3A-document/Program.cs" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; +using Syncfusion.Pdf.Interactive; + //Create a new document with PDF/A-3a standard PdfDocument document = new PdfDocument(PdfConformanceLevel.Pdf_A3A); //Add a page to the document @@ -628,25 +623,18 @@ PdfFont font = new PdfTrueTypeFont(fontStream, 14); //Draw the text graphics.DrawString("Hello World!!!", font, PdfBrushes.Black, new Syncfusion.Drawing.PointF(0, 0)); -//Creating the stream object -MemoryStream stream = new MemoryStream(); -//Save the document into memory stream -document.Save(stream); -//If the position is not set to '0', then the PDF will be empty -stream.Position = 0; -//Close the document +//Save and close the document. +document.Save("Output.pdf"); document.Close(true); -//Defining the ContentType for PDF file -string contentType = "application/pdf"; -//Define the file name -string fileName = "Output.pdf"; -//Creates a FileContentResult object by using the file contents, content type, and file name -return File(stream, contentType, fileName); {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; +using Syncfusion.Pdf.Interactive; + //Create a new document with PDF/A-3a standard PdfDocument document = new PdfDocument(PdfConformanceLevel.Pdf_A3A); //Add a page @@ -680,6 +668,10 @@ document.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Graphics +Imports Syncfusion.Pdf.Interactive + 'Create a new document with PDF/A-3a standard Dim document As New PdfDocument(PdfConformanceLevel.Pdf_A3A) 'Add a page @@ -725,6 +717,9 @@ You can create a PDF/A-2u document by specifying the conformance level as ```Pdf {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/PDF%20Conformance/Creating-the-new-PDFA2U-document/.NET/Creating-the-new-PDFA2U-document/Program.cs" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; + //Create a new document with PDF/A-2u standard PdfDocument document = new PdfDocument(PdfConformanceLevel.Pdf_A2U); //Add a page to the document @@ -738,25 +733,16 @@ PdfFont font = new PdfTrueTypeFont(fontStream, 14); //Draw the text graphics.DrawString("Hello World!!!", font, PdfBrushes.Black, new Syncfusion.Drawing.PointF(0, 0)); -//Creating the stream object -MemoryStream stream = new MemoryStream(); -//Save the document into memory stream -document.Save(stream); -//If the position is not set to '0', then the PDF will be empty -stream.Position = 0; -//Close the document +//Save and close the document. +document.Save("Output.pdf"); document.Close(true); -//Defining the ContentType for PDF file -string contentType = "application/pdf"; -//Define the file name -string fileName = "Output.pdf"; -//Creates a FileContentResult object by using the file contents, content type, and file name -return File(stream, contentType, fileName); - {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; + //Create a new document with PDF/A-2u standard PdfDocument document = new PdfDocument(PdfConformanceLevel.Pdf_A2U); //Add a page @@ -780,6 +766,9 @@ document.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Graphics + 'Create a new document with PDF/A-2u standard Dim document As New PdfDocument(PdfConformanceLevel.Pdf_A2U) 'Add a page @@ -815,6 +804,10 @@ You can create a PDF/A-3u document by specifying the conformance level as ``Pdf_ {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/PDF%20Conformance/Creating-the-new-PDFA3U-document/.NET/Creating-the-new-PDFA3U-document/Program.cs" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; +using Syncfusion.Pdf.Interactive; + //Create a new document with PDF/A-3u standard PdfDocument document = new PdfDocument(PdfConformanceLevel.Pdf_A3U); //Add a page to the document @@ -838,25 +831,18 @@ PdfFont font = new PdfTrueTypeFont(fontStream, 14); //Draw the text graphics.DrawString("Hello World!!!", font, PdfBrushes.Black, new Syncfusion.Drawing.PointF(0, 0)); -//Creating the stream object -MemoryStream stream = new MemoryStream(); -//Save the document into memory stream -document.Save(stream); -//If the position is not set to '0', then the PDF will be empty -stream.Position = 0; -//Close the document +//Save and close the document. +document.Save("Output.pdf"); document.Close(true); -//Defining the content type for PDF file -string contentType = "application/pdf"; -//Define the file name -string fileName = "Output.pdf"; -//Creates a FileContentResult object by using the file contents, content type, and file name -return File(stream, contentType, fileName); {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; +using Syncfusion.Pdf.Interactive; + //Create a new document with PDF/A-3u standard PdfDocument document = new PdfDocument(PdfConformanceLevel.Pdf_A3U); //Add a page @@ -890,6 +876,10 @@ document.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Graphics +Imports Syncfusion.Pdf.Interactive + 'Create a new document with PDF/A-3u standard Dim document As New PdfDocument(PdfConformanceLevel.Pdf_A3U) 'Add a page @@ -935,6 +925,9 @@ Create a PDF/A-4 document by specifying the conformance level as ``Pdf_A4`` thro {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/PDF%20Conformance/Creating-the-new-PDFA4-document/.NET/Creating-the-new-PDFA4-document/Program.cs" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; + //Create a new document with the PDF/A-4 standard. PdfDocument document = new PdfDocument(PdfConformanceLevel.Pdf_A4); //Add a page to the document. @@ -948,25 +941,17 @@ PdfFont font = new PdfTrueTypeFont(fontStream, 14); //Draw the text. graphics.DrawString("Hello World!!!", font, PdfBrushes.Black, new Syncfusion.Drawing.PointF(0, 0)); -//Create the stream object. -MemoryStream stream = new MemoryStream(); -//Save the document into the memory stream. -document.Save(stream); -//If the position is not set to '0,' a PDF will be empty. -stream.Position = 0; -//Close the document. -document.Close(true); -//Define the content type for a PDF file. -string contentType = "application/pdf"; -//Define the file name. -string fileName = "Output.pdf"; -//Create the FileContentResult object by using the file contents, content type, and file name. -return File(stream, contentType, fileName); +//Save and close the document. +document.Save("Output.pdf"); +document.Close(true); {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; + //Create a new document with the PDF/A-4 standard. PdfDocument document = new PdfDocument(PdfConformanceLevel.Pdf_A4); //Add a page. @@ -990,6 +975,9 @@ document.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Graphics + 'Create a new document with the PDF/A-4 standard. Dim document As New PdfDocument(PdfConformanceLevel.Pdf_A4) 'Add a page. @@ -1025,6 +1013,9 @@ Create a PDF/A-4E document by specifying the conformance level as ``Pdf_A4E`` th {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/PDF%20Conformance/Creating-the-new-PDFA4E-document/.NET/Creating-the-new-PDFA4E-document/Program.cs" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; + //Create a new document with the PDF/A-4 standard. PdfDocument document = new PdfDocument(PdfConformanceLevel.Pdf_A4); //Creates a new page. @@ -1040,22 +1031,16 @@ activation.ShowToolbar = true; pdf3dAnnotation.Activation = activation; //Add the annotation to the page. page.Annotations.Add(pdf3dAnnotation); -//Save the document into the stream. -MemoryStream stream = new MemoryStream(); -document.Save(stream); stream.Position = 0; -//Close the document. -document.Close(true); -//Define the ContentType for a pdf file. -string contentType = "application/pdf"; -//Define the file name. -string fileName = "3DAnnotation.pdf"; -//Create the FileContentResult object by using the file contents, content type, and file name. -return File(stream, contentType, fileName); - +//Save and close the document. +document.Save("Output.pdf"); +document.Close(true); {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; + //Create a new document with the PDF/A-4E standard. PdfDocument document = new PdfDocument(PdfConformanceLevel.Pdf_A4E); //Create a new page. @@ -1079,6 +1064,9 @@ document.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Graphics + 'Create a new document with the PDF/A-4 standard. Dim document As New PdfDocument(PdfConformanceLevel.Pdf_A4E) 'Creates a new page. @@ -1115,6 +1103,9 @@ Create a PDF/A-4f document by specifying the conformance level as ``Pdf_A4F`` th {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/PDF%20Conformance/Creating-a-new-PDFA4F-document/.NET/Creating-a-new-PDFA4F-document/Program.cs" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; + //Create a new document with the PDF/A-4F standard. PdfDocument document = new PdfDocument(PdfConformanceLevel.Pdf_A4F); //Add a page to the document. @@ -1140,18 +1131,17 @@ PdfFont font = new PdfTrueTypeFont(fontStream, 14); //Draw the text. graphics.DrawString("Hello World!!!", font, PdfBrushes.Black, new PointF(0, 0)); -//Save the document into the memory stream. -MemoryStream stream = new MemoryStream(); -await document.SaveAsync(stream); -//Close the document. -document.Close(true); -//Save the stream as a PDF document file in the local machine. Refer to the PDF/UWP section for respective code samples. -Save(stream, "Output.pdf"); +//Save and close the document. +document.Save("Output.pdf"); +document.Close(true); {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; + //Create a new document with the PDF/A-3b standard. PdfDocument document = new PdfDocument(PdfConformanceLevel.Pdf_A4F); //Add a page. @@ -1184,6 +1174,9 @@ document.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Graphics + 'Create a new document with the PDF/A-3b standard. Dim document As New PdfDocument(PdfConformanceLevel.Pdf_A4F) 'Add a page. @@ -1233,6 +1226,9 @@ You can create a PDF/X-1a document by specifying the conformance level as ```Pdf {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; + //Create a new document with PDF/x standard. PdfDocument document = new PdfDocument(PdfConformanceLevel.Pdf_X1A2001); //Add a page. @@ -1258,6 +1254,9 @@ document.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Graphics + 'Create a new document with PDF/x standard. Dim document As New PdfDocument(PdfConformanceLevel.Pdf_X1A2001) 'Add a page. @@ -1307,32 +1306,32 @@ Refer to the following code sample to implement this conversion. {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/PDF%20Conformance/Convert-PDF-to-PDFA-conformance-document/.NET/Convert-PDF-to-PDFA-conformance-document/Program.cs" %} -//Load an existing PDF document -FileStream docStream = new FileStream(@"Input.pdf", FileMode.Open, FileAccess.Read); -PdfLoadedDocument loadedDocument = new PdfLoadedDocument(docStream); +using SkiaSharp; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; +using Syncfusion.Pdf.Parsing; + +//Load the PDF document. +PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Input.pdf"); //Sample level font event handling loadedDocument.SubstituteFont += LoadedDocument_SubstituteFont ; //Convert the loaded document to PDF/A document loadedDocument.ConvertToPDFA(PdfConformanceLevel.Pdf_A1B); -//Save the document -MemoryStream stream = new MemoryStream(); -loadedDocument.Save(stream); -stream.Position = 0; -//Close the document -loadedDocument.Close(true); -//Defining the content type for PDF file -string contentType = "application/pdf"; -//Define the file name -string fileName = "output.pdf"; -//Creates a FileContentResult object by using the file contents, content type, and file name -return File(stream, contentType, fileName); +//Save and close the document. +loadedDocument.Save("Output.pdf"); +loadedDocument.Close(true) {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using SkiaSharp; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; +using Syncfusion.Pdf.Parsing; + //Load an existing PDF document. PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Input.pdf"); @@ -1347,6 +1346,11 @@ loadedDocument.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf.Parsing +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Graphics +Imports SkiaSharp + 'Load an existing PDF document. Dim document As New PdfLoadedDocument("Input.pdf") @@ -1429,9 +1433,15 @@ N> To convert an existing PDF to a PDF/A-compliant document in .NET Core, ensure {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/PDF%20Conformance/Font_Subsetting_in_PDFA_conversion/.NET/Font_Subsetting_in_PDFA_conversion/Program.cs" %} +using Syncfusion.Pdf.Parsing; +using Syncfusion.Pdf; +using System.Reflection.Metadata; +using Syncfusion.Drawing; +using Syncfusion.Pdf.Graphics; +using SkiaSharp; + //Load an existing PDF document -FileStream docStream = new FileStream(@"Input.pdf", FileMode.Open, FileAccess.Read); -PdfLoadedDocument loadedDocument = new PdfLoadedDocument(docStream); +PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Input.pdf"); //Sample level font event handling loadedDocument.SubstituteFont += LoadedDocument_SubstituteFont; @@ -1447,17 +1457,21 @@ options.SubsetFonts = true; // Convert to PDF/A conformance loadedDocument.ConvertToPDFA(options); -//Save the document into stream -MemoryStream stream = new MemoryStream(); -loadedDocument.Save(stream); -stream.Position = 0; -//Closes the document +//Save and close the document. +loadedDocument.Save("Output.pdf"); loadedDocument.Close(true); {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf.Parsing; +using Syncfusion.Pdf; +using System.Reflection.Metadata; +using System.Drawing; +using Syncfusion.Pdf.Graphics; +using SkiaSharp; + //Load an existing PDF document PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Input.pdf"); @@ -1478,6 +1492,13 @@ loadedDocument.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf.Parsing +Imports Syncfusion.Pdf +Imports System.Reflection.Metadata +Imports System.Drawing +Imports Syncfusion.Pdf.Graphics +Imports SkiaSharp + ' Load an existing PDF document. Dim document As New PdfLoadedDocument("Input.pdf") @@ -1562,9 +1583,11 @@ You can find the conformance level of the existing PDF document using the [Confo {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/PDF%20Conformance/Get-the-conformance-level-of-the-existing-PDF-document/.NET/Program.cs" %} -//Load an existing PDF document -FileStream docStream = new FileStream(@"Input.pdf", FileMode.Open, FileAccess.Read); -PdfLoadedDocument loadedDocument = new PdfLoadedDocument(docStream); +using Syncfusion.Pdf; +using Syncfusion.Pdf.Parsing; + +//Load the PDF document. +PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Input.pdf"); //Get the conformance level of the loaded document. PdfConformanceLevel conformance = loadedDocument.Conformance; @@ -1576,6 +1599,9 @@ loadedDocument.Close(true); {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Parsing; + //Load an existing PDF document. PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Input.pdf"); @@ -1589,6 +1615,9 @@ loadedDocument.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf.Parsing +Imports Syncfusion.Pdf + 'Load an existing PDF. Dim document As New PdfLoadedDocument("Input.pdf") @@ -1613,24 +1642,20 @@ The following code sample shows the delegate for handling PDF to PDF/A conversio {% tabs %} {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/PDF%20Conformance/Get-PDF-to-PDFA-conversion-progress/.NET/Get-PDF-to-PDFA-conversion-progress/Program.cs" %} - - -//Get stream from an existing PDF document. -FileStream docStream = new FileStream(Path.GetFullPath(@"Data/Input.pdf"), FileMode.Open, FileAccess.Read); +using Syncfusion.Pdf; +using Syncfusion.Pdf.Parsing; + //Load an existing PDF document. -PdfLoadedDocument loadedDocument = new PdfLoadedDocument(docStream); +PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Input.pdf"); //Subscribe to the PdfAConversionProgress event to track the PDF to PDF/A conversion process loadedDocument.PdfAConversionProgress += new PdfLoadedDocument.PdfAConversionProgressEventHandler(pdfAConversion_TrackProgress); loadedDocument.ConvertToPDFA(PdfConformanceLevel.Pdf_A1B); -//Save the document -FileStream outputStream = new FileStream(Path.GetFullPath(@"Output.pdf"), FileMode.Create, FileAccess.Write); -loadedDocument.Save(outputStream); - -//Close the document +//Save and close the document. +loadedDocument.Save("Output.pdf"); loadedDocument.Close(true); @@ -1645,6 +1670,9 @@ void pdfAConversion_TrackProgress(object sender, PdfAConversionProgressEventArgs {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Parsing; + //Load a PDF document PdfLoadedDocument loadedDocument = new PdfLoadedDocument("input.pdf"); @@ -1668,6 +1696,9 @@ Console.WriteLine(String.Format("PDF to PDF/A conversion Process " + arguments. {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf.Parsing +Imports Syncfusion.Pdf + 'Load a PDF document. Dim loadedDocument As PdfLoadedDocument = New PdfLoadedDocument("input.pdf") @@ -1699,30 +1730,25 @@ An existing PDF/A conformance document can be converted to a PDF document using {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/PDF%20Conformance/Convert-PDFA-to-PDF-document/.NET/Convert-PDFA-to-PDF-document/Program.cs" %} +using Syncfusion.Pdf.Parsing; + //Load a PDF document. -FileStream docStream = new FileStream("Input.pdf", FileMode.Open, FileAccess.Read); -PdfLoadedDocument document = new PdfLoadedDocument(docStream); +PdfLoadedDocument document = new PdfLoadedDocument("Input.pdf"); //Remove PDF/A conformance. document.RemoveConformance(); //Save the document. -MemoryStream stream = new MemoryStream(); -document.Save(stream); +document.Save("Output.pdf"); //Close the document. document.Close(true); -//Defining the content type for PDF file. -string contentType = "application/pdf"; -//Define the file name. -string fileName = "output.pdf"; - -//Creates a FileContentResult object by using the file contents, content type, and file name. -return File(stream, contentType, fileName); {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf.Parsing; + //Load an existing document. PdfLoadedDocument document = new PdfLoadedDocument("input.pdf"); @@ -1738,6 +1764,8 @@ document.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf.Parsing + 'Load an existing document. Dim document As PdfLoadedDocument = New PdfLoadedDocument("input.pdf") diff --git a/Document-Processing/PDF/PDF-Library/NET/Working-with-PDF-Templates.md b/Document-Processing/PDF/PDF-Library/NET/Working-with-PDF-Templates.md index d925cfe00..4fc50279b 100644 --- a/Document-Processing/PDF/PDF-Library/NET/Working-with-PDF-Templates.md +++ b/Document-Processing/PDF/PDF-Library/NET/Working-with-PDF-Templates.md @@ -19,6 +19,10 @@ The below code snippet illustrates how to add contents to the [PdfTemplate](http {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/PDF%20Templates/Add-the-contents-to-template-and-render-into-PDF-page/.NET/Add-the-contents-to-template-and-render-into-PDF-page/Program.cs" %} +using Syncfusion.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; + //Create a new PDF document. PdfDocument pdfDocument = new PdfDocument(); //Add a page to the PDF document. @@ -37,9 +41,8 @@ template.Graphics.DrawString("Hello World", font, brush, 5, 5); //Draw the template on the page graphics of the document. pdfPage.Graphics.DrawPdfTemplate(template, PointF.Empty); -//Save the document into stream. -MemoryStream stream = new MemoryStream(); -pdfDocument.Save(stream); +//Save the document. +pdfDocument.Save("Output.pdf"); //Close the document. pdfDocument.Close(true); @@ -47,6 +50,10 @@ pdfDocument.Close(true); {% highlight c# tabtitle="C# [Windows-specific]" %} +using System.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; + //Create a new PDF document. PdfDocument pdfDocument = new PdfDocument(); //Add a page to the PDF document. @@ -74,6 +81,10 @@ pdfDocument.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Graphics +Imports System.Drawing + 'Create a new PDF document. Dim pdfDocument As New PdfDocument() 'Add a page to the PDF document. @@ -109,9 +120,12 @@ The below code snippet illustrates how to render the [PdfTemplate](https://help. {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/PDF%20Templates/Render-the-template-in-an-existing-PDF-document/.NET/Render-the-template-in-an-existing-PDF-document/Program.cs" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; +using Syncfusion.Pdf.Parsing; + //Load the PDF document. -FileStream docStream = new FileStream(fileName, FileMode.Open, FileAccess.Read); -PdfLoadedDocument loadedDocument = new PdfLoadedDocument(docStream); +PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Input.pdf"); //Load the page into Pdf document. PdfLoadedPage LoadedPage = loadedDocument.Pages[0] as PdfLoadedPage; @@ -128,9 +142,8 @@ template.Graphics.DrawString("Hello World", font, brush, 5, 5); //Draw the template on the page graphics of the document. LoadedPage.Graphics.DrawPdfTemplate(template, Syncfusion.Drawing.PointF.Empty); -//Save the document into stream. -MemoryStream stream = new MemoryStream(); -loadedDocument.Save(stream); +//Save the document. +loadedDocument.Save("Output.pdf"); //Close the document. loadedDocument.Close(true); @@ -138,8 +151,12 @@ loadedDocument.Close(true); {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; +using Syncfusion.Pdf.Parsing; + //Load the existing PDF document. -PdfLoadedDocument loadedDocument = new PdfLoadedDocument(fileName); +PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Input.pdf"); //Load the page into Pdf document. PdfLoadedPage LoadedPage = loadedDocument.Pages[0] as PdfLoadedPage; @@ -165,8 +182,12 @@ loadedDocument.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Graphics +Imports System.Drawing + 'Load the existing PDF document. -Dim loadedDocument As New PdfLoadedDocument(fileName) +Dim loadedDocument As New PdfLoadedDocument("Input.pdf") 'Load the page into Pdf document. Dim LoadedPage As PdfLoadedPage = TryCast(loadedDocument.Pages(0), PdfLoadedPage) @@ -204,9 +225,12 @@ The below code illustrates how to create the template from an existing page and {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/PDF%20Templates/Create-template-from-an-existing-PDF-document/.NET/Create-template-from-an-existing-PDF-document/Program.cs" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; +using Syncfusion.Pdf.Parsing; + //Load the PDF document. -FileStream docStream = new FileStream(fileName, FileMode.Open, FileAccess.Read); -PdfLoadedDocument loadedDocument = new PdfLoadedDocument(docStream); +PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Input.pdf"); //Load the page. PdfLoadedPage loadedPage = loadedDocument.Pages[0] as PdfLoadedPage; //Create the template from the page. @@ -221,19 +245,21 @@ PdfGraphics graphics = page.Graphics; //Draw the template. graphics.DrawPdfTemplate(template, Syncfusion.Drawing.PointF.Empty, new Syncfusion.Drawing.SizeF(page.Size.Width / 2, page.Size.Height)); -//Save the document into stream. -MemoryStream stream = new MemoryStream(); -document.Save(stream); +//Save the document. +loadedDocument.Save("Output.pdf"); //Close the document. -document.Close(true); loadedDocument.Close(true); {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; +using Syncfusion.Pdf.Parsing; + //Load the existing PDF document. -PdfLoadedDocument loadedDocument = new PdfLoadedDocument(fileName); +PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Input.pdf"); //Load the page. PdfLoadedPage loadedPage = loadedDocument.Pages[0] as PdfLoadedPage; //Create the template from the page. @@ -258,8 +284,12 @@ document.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Graphics +Imports System.Drawing + 'Load the existing PDF document -Dim loadedDocument As New PdfLoadedDocument(fileName) +Dim loadedDocument As New PdfLoadedDocument("Input.pdf") 'Load the page Dim loadedPage As PdfLoadedPage = TryCast(loadedDocument.Pages(0), PdfLoadedPage) 'Create the template from the page @@ -296,6 +326,10 @@ The below code illustrates how to add the page template elements in a PDF docume {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/PDF%20Templates/Add-the-page-template-elements-in-a-PDF-document/.NET/Add-the-page-template-elements-in-a-PDF-document/Program.cs" %} +using Syncfusion.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; + //Create a new PDF document. PdfDocument pdfDocument = new PdfDocument(); //Add a page to the PDF document. @@ -329,9 +363,8 @@ compositeField.Draw(footer.Graphics, new Syncfusion.Drawing.PointF(470, 40)); //Add the footer template at the bottom. pdfDocument.Template.Bottom = footer; -//Save the document into stream. -MemoryStream stream = new MemoryStream(); -pdfDocument.Save(stream); +//Save the document. +pdfDocument.Save("Output.pdf"); //Close the document. pdfDocument.Close(true); @@ -339,6 +372,10 @@ pdfDocument.Close(true); {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; + //Create a new PDF document. PdfDocument pdfDocument = new PdfDocument(); //Add a page to the PDF document. @@ -379,6 +416,10 @@ pdfDocument.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Graphics +Imports System.Drawing + 'Create a new PDF document. Dim pdfDocument As New PdfDocument() 'Add a page to the PDF document. @@ -429,12 +470,15 @@ Multiple templates can be drawn over a PDF page, to create a document-overlay us {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/PDF%20Templates/Creating-the-document-overlays/.NET/Creating-the-document-overlays/Program.cs" %} +using Syncfusion.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; +using Syncfusion.Pdf.Parsing; + //Load the PDF document. -FileStream docStream1 = new FileStream(fileName1, FileMode.Open, FileAccess.Read); -PdfLoadedDocument loadedDocument1 = new PdfLoadedDocument(docStream1); +PdfLoadedDocument loadedDocument1 = new PdfLoadedDocument("Input1.pdf"); //Load the PDF document. -FileStream docStream2 = new FileStream(fileName2, FileMode.Open, FileAccess.Read); -PdfLoadedDocument loadedDocument2 = new PdfLoadedDocument(docStream2); +PdfLoadedDocument loadedDocument2 = new PdfLoadedDocument("Input2.pdf"); //Create the new document. PdfDocument document = new PdfDocument(); //Add a page to the document. @@ -451,23 +495,25 @@ template = loadedPage.CreateTemplate(); //Draw the loaded template into new document. page.Graphics.DrawPdfTemplate(template, new PointF(10, 10), new SizeF(400, 500)); -//Save the document into stream. -MemoryStream stream = new MemoryStream(); -document.Save(stream); -//Set the position as '0'. -stream.Position = 0; +//Save the new document. +document.Save("Output.pdf"); //Closes the documents. -document.Close(true); loadedDocument1.Close(true); loadedDocument2.Close(true); +document.Close(true); {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using System.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; +using Syncfusion.Pdf.Parsing; + //Load the existing documents. -PdfLoadedDocument loadedDocument1 = new PdfLoadedDocument(fileName1); -PdfLoadedDocument loadedDocument2 = new PdfLoadedDocument(fileName2); +PdfLoadedDocument loadedDocument1 = new PdfLoadedDocument("Input1.pdf"); +PdfLoadedDocument loadedDocument2 = new PdfLoadedDocument("Input2.pdf"); //Create the new document. PdfDocument document = new PdfDocument(); //Add a page to the document. @@ -495,9 +541,14 @@ document.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Interactive +Imports Syncfusion.Pdf.Parsing +Imports System.Drawing + 'Load the existing documents. -Dim loadedDocument1 As New PdfLoadedDocument(fileName1) -Dim loadedDocument2 As New PdfLoadedDocument(fileName2) +Dim loadedDocument1 As New PdfLoadedDocument("Input1.pdf") +Dim loadedDocument2 As New PdfLoadedDocument("Input2.pdf") 'Create the new document. Dim document As New PdfDocument() 'Add a page to the document. @@ -535,9 +586,12 @@ The following code sample shows how to add a [PdfPageTemplate](https://help.sync {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/PDF%20Templates/Add-a-template-from-an-existing-PDF-document/.NET/Add-a-template-from-an-existing-PDF-document/Program.cs" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Interactive; +using Syncfusion.Pdf.Parsing; + //Loads an existing PDF document. -FileStream docStream = new FileStream("Input.pdf", FileMode.Open, FileAccess.Read); -PdfLoadedDocument loadedDocument = new PdfLoadedDocument(docStream); +PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Input.pdf"); //Get the first page of the document. PdfPageBase page = loadedDocument.Pages[0]; @@ -550,17 +604,19 @@ pageTemplate.IsVisible = true; //Adds the page template. loadedDocument.PdfPageTemplates.Add(pageTemplate); -//Creating the stream object. -MemoryStream stream = new MemoryStream(); -//Save the document into stream. -loadedDocument.Save(stream); -//Close the document. +//Save the PDF document. +loadedDocument.Save("output.pdf"); +//Close the PDF document. loadedDocument.Close(true); {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Interactive; +using Syncfusion.Pdf.Parsing; + //Loads an existing PDF document. PdfLoadedDocument loadedDocument = new PdfLoadedDocument("input.pdf"); //Get the first page of the document. @@ -584,6 +640,10 @@ loadedDocument.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Interactive +Imports Syncfusion.Pdf.Parsing + 'Loads an existing PDF document. Dim loadedDocument As PdfLoadedDocument = New PdfLoadedDocument("input.pdf") 'Get the first page of the documsent. diff --git a/Document-Processing/PDF/PDF-Library/NET/Working-with-Pages.md b/Document-Processing/PDF/PDF-Library/NET/Working-with-Pages.md index 2841de9bb..7f719a83a 100644 --- a/Document-Processing/PDF/PDF-Library/NET/Working-with-Pages.md +++ b/Document-Processing/PDF/PDF-Library/NET/Working-with-Pages.md @@ -15,6 +15,9 @@ The following code sample explains you on how to add a [PdfPage](https://help.sy {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Pages/Add-a-new-page-to-the-PDF-document/.NET/Add-a-new-page-to-the-PDF-document/Program.cs" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; + //Create a new PDF document. PdfDocument document = new PdfDocument(); //Add a page. @@ -29,17 +32,17 @@ PdfFont font = new PdfStandardFont(PdfFontFamily.Helvetica, 14); //Draw the text. graphics.DrawString("Hello world!", font, brush, new Syncfusion.Drawing.PointF(20, 20)); -//Creating the stream object. -MemoryStream stream = new MemoryStream(); -//Save the document as stream. -document.Save(stream); -//Close the document. +//Save and close the document. +document.Save("Output.pdf"); document.Close(true); {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; + //Create a new PDF document. PdfDocument document = new PdfDocument(); //Add a page. @@ -62,6 +65,9 @@ document.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Graphics + 'Create a new PDF document. Dim document As New PdfDocument() 'Add a page. @@ -94,23 +100,23 @@ You can insert an empty page at any location in the existing PDF document using {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Pages/Insert-pages-in-a-PDF-document/.NET/Insert-pages-in-a-PDF-document/Program.cs" %} +using Syncfusion.Pdf.Parsing; + //Load the PDF document. -FileStream docStream = new FileStream("Input.pdf", FileMode.Open, FileAccess.Read); -PdfLoadedDocument loadedDocument = new PdfLoadedDocument(docStream); +PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Input.pdf"); //Insert a new page in the beginning of the document. loadedDocument.Pages.Insert(0); -//Creating the stream object. -MemoryStream stream = new MemoryStream(); -//Save the document as stream. -loadedDocument.Save(stream); -//Close the document. +//Save and close the document. +loadedDocument.Save("Output.pdf"); loadedDocument.Close(true); {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf.Parsing; + //Load the PDF document. PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Input.pdf"); //Insert a new page in the beginning of the document. @@ -123,6 +129,8 @@ loadedDocument.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf.Parsing + 'Load the PDF document. Dim loadedDocument As New PdfLoadedDocument("Input.pdf") 'Insert a new page in the beginning of the document. @@ -145,6 +153,9 @@ You can add margin to all the PDF pages of the PDF document using the [PageSetti {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Pages/Add-margin-to-the-PDF-pages/.NET/Add-margin-to-the-PDF-pages/Program.cs" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; + //Create a new PDF document. PdfDocument document = new PdfDocument(); //Set margin for all the pages. @@ -161,17 +172,17 @@ PdfFont font = new PdfStandardFont(PdfFontFamily.Helvetica, 14); //Draw the text. graphics.DrawString("Hello world!", font, brush, new Syncfusion.Drawing.PointF(20, 20)); -//Creating the stream object. -MemoryStream stream = new MemoryStream(); -//Save the document as stream. -document.Save(stream); -//Close the document. +//Save and close the document. +document.Save("Output.pdf"); document.Close(true); {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; + //Create a new PDF document. PdfDocument document = new PdfDocument(); //Set margin for all the pages @@ -196,6 +207,9 @@ document.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Graphics + 'Create a new PDF document. Dim document As New PdfDocument() 'Set margin for all the pages. @@ -234,6 +248,9 @@ The following code snippet explains how to add more sections to a PDF document w {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Pages/Adding-sections-with-different-page-settings/.NET/Adding-sections-with-different-page-settings/Program.cs" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; + //Create a new PDF document PdfDocument document = new PdfDocument(); //Create a solid brush and standard font @@ -293,17 +310,18 @@ graphics = page.Graphics; //Draw simple text on the page graphics.DrawString("Rotated by 270 degrees", font, brush, new PointF(20, 20)); -//Saving the PDF to the MemoryStream -MemoryStream stream = new MemoryStream(); -document.Save(stream); - -//Close the document. +//Save and close the document. +document.Save("Output.pdf"); document.Close(true); + {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; + //Create a new PDF document PdfDocument document = new PdfDocument(); //Create a solid brush and standard font @@ -372,6 +390,9 @@ document.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Graphics + 'Create a new PDF document Dim document As PdfDocument = New PdfDocument 'Create a solid brush and standard font @@ -451,6 +472,9 @@ For example, to use lowercase Roman numerals (i, ii, iii, ...), assign `PdfNumbe {% highlight c# tabtitle="C# [Cross-platform]" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; + //Create a new document. PdfDocument document = new PdfDocument(); //Add a section to the document. @@ -484,21 +508,17 @@ for (int i = 0; i < 3; i++) page.Graphics.DrawString("This is the main content of a page with a footer.", font, PdfBrushes.Black, new PointF(10, 10)); } -//Create file stream. -using (FileStream outputFileStream = new FileStream("Output.pdf", FileMode.Create, FileAccess.ReadWrite)) -{ - //Save the PDF document to file stream. - document.Save(outputFileStream); -} - -//Close the document. +//Save and close the document. +document.Save("Output.pdf"); document.Close(true); - {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; + //Create a new document. PdfDocument document = new PdfDocument(); //Add a section to the document. @@ -541,6 +561,9 @@ document.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Graphics + 'Create a new document. Dim document As New PdfDocument() 'Add a section to the document. @@ -592,9 +615,10 @@ You can get page count from the existing PDF document as shown in the following {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Pages/Get-number-of-pages-from-PDF-document/.NET/Get-number-of-pages-from-PDF-document/Program.cs" %} +using Syncfusion.Pdf.Parsing; + //Load the PDF document. -FileStream docStream = new FileStream("Input.pdf", FileMode.Open, FileAccess.Read); -PdfLoadedDocument loadedDocument = new PdfLoadedDocument(docStream); +PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Input.pdf"); //Get the page count. int pageCount = loadedDocument.Pages.Count; //Close the document. @@ -604,6 +628,8 @@ loadedDocument.Close(true); {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf.Parsing; + //Load the PDF document. PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Input.pdf"); //Get the page count. @@ -615,6 +641,8 @@ loadedDocument.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf.Parsing + 'Load the PDF document. Dim loadedDocument As PdfLoadedDocument = New PdfLoadedDocument("Input.pdf") 'Get the page count. @@ -637,10 +665,11 @@ Essential® PDF allows you to import a page or import a range of p {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Pages/Importing-pages-from-one-PDF-to-another-PDF/.NET/Importing-pages-from-one-PDF-to-another-PDF/Program.cs" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Parsing; + //Load the PDF document. -FileStream docStream = new FileStream("Input.pdf", FileMode.Open, FileAccess.Read); -//Load the PDF document. -PdfLoadedDocument loadedDocument = new PdfLoadedDocument(docStream); +PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Input.pdf"); //Create a new PDF document. PdfDocument document = new PdfDocument(); int startIndex = 0; @@ -648,18 +677,17 @@ int endIndex = loadedDocument.Pages.Count - 1; //Import all the pages to the new PDF document. document.ImportPageRange(loadedDocument, startIndex, endIndex); -//Creating the stream object. -MemoryStream stream = new MemoryStream(); -//Save the document as stream. -document.Save(stream); -//Close the document instances. -document.Close(true); +//Save and close the document. +loadedDocument.Save("Output.pdf"); loadedDocument.Close(true); {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Parsing; + //Load the PDF document. PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Input.pdf"); //Create a new PDF document. @@ -679,6 +707,9 @@ document.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Parsing + 'Load the PDF document. Dim loadedDocument As New PdfLoadedDocument("Input.pdf") 'Create a new PDF document. @@ -710,10 +741,11 @@ N> Performance will be effective only in the large PDF document. {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Pages/Import-pages-from-PDF-without-bookmarks/.NET/Import-pages-from-PDF-without-bookmarks/Program.cs" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Parsing; + //Load the PDF document -FileStream docStream = new FileStream("Input.pdf", FileMode.Open, FileAccess.Read); -//Load the PDF document -PdfLoadedDocument loadedDocument = new PdfLoadedDocument(docStream); +PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Input.pdf"); //Create the new PDF document PdfDocument document = new PdfDocument(); int startIndex = 0; @@ -721,18 +753,17 @@ int endIndex = loadedDocument.Pages.Count - 1; //Import all the pages to the new PDF document document.ImportPageRange(loadedDocument, startIndex, endIndex, false); -//Creating the stream object -MemoryStream stream = new MemoryStream(); -//Save the document as stream -document.Save(stream); -//Close the document instances -document.Close(true); +//Save and close the document. +loadedDocument.Save("Output.pdf"); loadedDocument.Close(true); {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Parsing; + //Load the PDF document PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Input.pdf"); @@ -754,6 +785,9 @@ System.Diagnostics.Process.Start("Output.pdf"); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Parsing + 'Load the PDF document Dim loadedDocument As PdfLoadedDocument = New PdfLoadedDocument("Input.pdf") 'Create the new PDF document @@ -783,22 +817,25 @@ You can rearrange the pages in an existing PDF document using [ReArrange](https: {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Pages/Rearrange-pages-in-an-existing-PDF-document/.NET/Rearrange-pages-in-an-existing-PDF-document/Program.cs" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Parsing; + //Load the PDF document -FileStream docStream = new FileStream("Input.pdf", FileMode.Open, FileAccess.Read); -PdfLoadedDocument loadedDocument = new PdfLoadedDocument(docStream); +PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Input.pdf"); //Rearrange the page by index -loadedDocument.Pages.ReArrange(new int[] { 1, 0 });//Creating the stream object -MemoryStream stream = new MemoryStream(); +loadedDocument.Pages.ReArrange(new int[] { 1, 0 }); -//Save the document as stream -loadedDocument.Save(stream); -//Close the document +//Save and close the document. +loadedDocument.Save("Output.pdf"); loadedDocument.Close(true); {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Parsing; + //Load the PDF document PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Input.pdf"); //Rearrange the page by index @@ -811,6 +848,9 @@ loadedDocument.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Parsing + 'Load the PDF document Dim loadedDocument As New PdfLoadedDocument("Input.pdf") 'Rearrange the page by index @@ -834,10 +874,11 @@ You can alter the page label for the existing PDF document using [PdfPageLabel]( {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Pages/Changing-page-numbers-in-a-PDF-document/.NET/Changing-page-numbers-in-a-PDF-document/Program.cs" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Parsing; + //Load the PDF document -FileStream docStream = new FileStream("Input.pdf", FileMode.Open, FileAccess.Read); -//Load the PDF document -PdfLoadedDocument loadedDocument = new PdfLoadedDocument(docStream); +PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Input.pdf"); // Create a page label PdfPageLabel pageLabel = new PdfPageLabel(); //Set the number style with upper case roman letters @@ -846,17 +887,16 @@ pageLabel.NumberStyle = PdfNumberStyle.UpperRoman; pageLabel.StartNumber = 1; loadedDocument.LoadedPageLabel = pageLabel; -//Creating the stream object -MemoryStream stream = new MemoryStream(); -//Save the document as stream -loadedDocument.Save(stream); -//Close the document +//Save and close the document. +loadedDocument.Save("Output.pdf"); loadedDocument.Close(true); - {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Parsing; + //Load the PDF document PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Input.pdf"); //Create a page label @@ -876,6 +916,9 @@ loadedDocument.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Parsing + 'Load the PDF document Dim loadedDocument As New PdfLoadedDocument("Input.pdf") 'Create a page label @@ -905,23 +948,24 @@ You can remove the pages from the existing PDF document using [RemoveAt](https:/ {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Pages/Remove-pages-from-the-existing-PDF-document/.NET/Remove-pages-from-the-existing-PDF-document/Program.cs" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Parsing; + //Load the PDF document. -FileStream docStream = new FileStream("Input.pdf", FileMode.Open, FileAccess.Read); -//Load the PDF document. -PdfLoadedDocument loadedDocument = new PdfLoadedDocument(docStream); +PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Input.pdf"); //Remove the first page in the PDF document loadedDocument.Pages.RemoveAt(0); -//Creating the stream object -MemoryStream stream = new MemoryStream(); -//Save the document as stream -loadedDocument.Save(stream); -//Close the document. +//Save and close the document. +loadedDocument.Save("Output.pdf"); loadedDocument.Close(true); {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Parsing; + //Load the PDF document. PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Input.pdf"); //Remove the first page in the PDF document @@ -935,6 +979,9 @@ loadedDocument.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Parsing + 'Load the PDF document. Dim loadedDocument As New PdfLoadedDocument("Input.pdf") 'Remove the first page in the PDF document @@ -958,6 +1005,10 @@ You can rotate a particular PDF page in the PDF document using [PdfPageRotateAng {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Pages/Rotating-a-PDF-page/.NET/Rotating-a-PDF-page/Program.cs" %} +using Syncfusion.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; + //Create a new PDF document. PdfDocument document = new PdfDocument(); //Add a section. @@ -975,17 +1026,18 @@ PdfFont font = new PdfStandardFont(PdfFontFamily.Helvetica, 14); //Draws the text. graphics.DrawString("Rotated by 90 degree", font, brush, new Syncfusion.Drawing.PointF(20, 20)); -//Creating the stream object -MemoryStream stream = new MemoryStream(); -//Save the document as stream -document.Save(stream); -//Close the document. +//Save and close the document. +document.Save("Output.pdf"); document.Close(true); {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using System.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; + //Create a new PDF document. PdfDocument document = new PdfDocument(); //Add a section. @@ -1012,6 +1064,10 @@ document.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports System.Drawing +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Graphics + 'Create a new PDF document. Dim document As New PdfDocument() 'Add a section. @@ -1048,24 +1104,27 @@ You can also rotate a PDF page in the existing PDF document using [PdfPageRotate {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Pages/Rotate-an-existing-PDF-page/.NET/Rotate-an-existing-PDF-page/Program.cs" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Parsing; + //Load the PDF document -FileStream docStream = new FileStream("Input.pdf", FileMode.Open, FileAccess.Read); -PdfLoadedDocument loadedDocument = new PdfLoadedDocument(docStream); +PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Input.pdf"); //Gets the page PdfPageBase loadedPage = loadedDocument.Pages[0] as PdfPageBase; //Set the rotation for loaded page loadedPage.Rotation = PdfPageRotateAngle.RotateAngle90; -//Save the document into stream -MemoryStream stream = new MemoryStream(); -loadedDocument.Save(stream); -//Close the document +//Save and close the document. +loadedDocument.Save("Output.pdf"); loadedDocument.Close(true); {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Parsing; + //Load the PDF document. PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Input.pdf"); //Gets the page. @@ -1082,6 +1141,9 @@ loadedDocument.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Parsing + 'Load the PDF document. Dim loadedDocument As New PdfLoadedDocument("Input.pdf") 'Gets the page. @@ -1108,24 +1170,27 @@ You can find the empty pages from the PDF document using the [IsBlank](https://h {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Pages/Detect-empty-pages-from-PDF/.NET/Detect-empty-pages-from-PDF/Program.cs" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Parsing; + //Load the PDF document. -FileStream docStream = new FileStream("input.pdf", FileMode.Open, FileAccess.Read); -PdfLoadedDocument loadedDocument = new PdfLoadedDocument(docStream); +PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Input.pdf"); //Gets the page. PdfPageBase loadedPage = loadedDocument.Pages[0] as PdfPageBase; //get the page is blank or not. bool isEmpty = loadedPage.IsBlank; -//Save the document into a stream. -MemoryStream stream = new MemoryStream(); -loadedDocument.Save(stream); -//Close the document. +//Save and close the document. +loadedDocument.Save("Output.pdf"); loadedDocument.Close(true); {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf; +using Syncfusion.Pdf.Parsing; + //Load the PDF document. PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Input.pdf"); //Gets the page. @@ -1142,6 +1207,9 @@ loadedDocument.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Parsing + 'Load the PDF document. Dim loadedDocument As New PdfLoadedDocument("input.pdf") 'Gets the page. @@ -1170,28 +1238,30 @@ Essential® PDF allows to split the pages of an existing PDF docum //Due to platform limitations, Essential® PDF supports splitting a PDF file into individual pages only in Windows Forms, WPF, ASP.NET, and ASP.NET MVC platforms. However this can be achieved by using the following code snippet. +using Syncfusion.Pdf; +using Syncfusion.Pdf.Parsing; + //Load the PDF document -FileStream docStream = new FileStream("Input.pdf", FileMode.Open, FileAccess.Read); -PdfLoadedDocument loadedDocument = new PdfLoadedDocument(docStream); -for (int i=0;i® PDF provides support for extracting the files from {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Portfolio/Extracting-the-files-from-PDF-portfolio/.NET/Extracting-the-files-from-PDF-portfolio/Program.cs" %} +using Syncfusion.Pdf.Interactive; +using Syncfusion.Pdf.Parsing; + //Load an existing PDF document -FileStream docStream = new FileStream("Sample.pdf", FileMode.Open, FileAccess.Read); -PdfLoadedDocument document = new PdfLoadedDocument(docStream); +PdfLoadedDocument document = new PdfLoadedDocument("Input.pdf"); //Iterate the attachments foreach (PdfAttachment attachment in document.Attachments) @@ -125,23 +127,17 @@ foreach (PdfAttachment attachment in document.Attachments) s.Dispose(); } -//Save the document into stream -MemoryStream stream = new MemoryStream(); -document.Save(stream); -stream.Position = 0; -//Close the document +//Save and close the document. +document.Save("Sample.pdf"); document.Close(true); -//Defining the content type for PDF file -string contentType = "application/pdf"; -//Define the file name -string fileName = "Output.pdf"; -//Creates a FileContentResult object by using the file contents, content type, and file name -return File(stream, contentType, fileName); {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf.Interactive; +using Syncfusion.Pdf.Parsing; + //Load an existing PDF document PdfLoadedDocument document = new PdfLoadedDocument("Sample.pdf"); @@ -162,6 +158,9 @@ document.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf.Interactive +Imports Syncfusion.Pdf.Parsing + 'Load the PDF document Dim document As New PdfLoadedDocument("Sample.pdf") @@ -191,30 +190,24 @@ The following code example illustrates how to remove files from an existing PDF {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Portfolio/Remove-the-files-from-PDF-portfolio/.NET/Remove-the-files-from-PDF-portfolio/Program.cs" %} +using Syncfusion.Pdf.Parsing; + //Load the PDF document -FileStream docStream = new FileStream("Sample.pdf", FileMode.Open, FileAccess.Read); -PdfLoadedDocument document = new PdfLoadedDocument(docStream); +PdfLoadedDocument document = new PdfLoadedDocument("Input.pdf"); //Remove the file from the Portfolio document.Attachments.RemoveAt(0); -//Save and close the document -MemoryStream stream = new MemoryStream(); -document.Save(stream); -stream.Position = 0; -//Close the document +//Save and close the document. +document.Save("Sample.pdf"); document.Close(true); -//Defining the content type for PDF file -string contentType = "application/pdf"; -//Define the file name -string fileName = "Output.pdf"; -//Creates a FileContentResult object by using the file contents, content type, and file name -return File(stream, contentType, fileName); {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf.Parsing; + //Load the PDF document PdfLoadedDocument document = new PdfLoadedDocument("Sample.pdf"); @@ -229,6 +222,8 @@ document.Close(); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf.Parsing + 'Load the PDF document Dim document As New PdfLoadedDocument("Sample.pdf") diff --git a/Document-Processing/PDF/PDF-Library/NET/Working-with-Redaction.md b/Document-Processing/PDF/PDF-Library/NET/Working-with-Redaction.md index 616c54d60..c9ccb547a 100644 --- a/Document-Processing/PDF/PDF-Library/NET/Working-with-Redaction.md +++ b/Document-Processing/PDF/PDF-Library/NET/Working-with-Redaction.md @@ -24,9 +24,13 @@ The following code example demonstrates the redaction of PDF documents from the {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Redaction/Removing-sensitive-content-from-the-PDF-document/.NET/Removing-sensitive-content-from-the-PDF-document/Program.cs" %} +using Syncfusion.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Parsing; +using Syncfusion.Pdf.Redaction; + //Load the existing PDF document -FileStream docStream = new FileStream(@"Input.pdf", FileMode.Open, FileAccess.Read); -PdfLoadedDocument document = new PdfLoadedDocument(docStream); +PdfLoadedDocument document = new PdfLoadedDocument("Input.pdf"); //Get the first page from the document PdfLoadedPage page = document.Pages[0] as PdfLoadedPage; @@ -37,17 +41,19 @@ page.AddRedaction(redaction); //Redact the contents from the PDF document document.Redact(); -//Creating the stream object -MemoryStream stream = new MemoryStream(); -//Save the document -document.Save(stream); -//Close the document +//Save and close the PDF document +document.Save("Output.pdf"); document.Close(true); {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using System.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Parsing; +using Syncfusion.Pdf.Redaction; + //Load a PDF document PdfLoadedDocument document = new PdfLoadedDocument("Input.pdf"); //Get first page from the document @@ -66,6 +72,11 @@ document.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports System.Drawing +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Parsing +Imports Syncfusion.Pdf.Redaction + 'Load a PDF document Dim document As PdfLoadedDocument = New PdfLoadedDocument("Input.pdf") 'Get first page from the document @@ -96,9 +107,14 @@ The following code example explains how to add overlay text in the redacted area {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Redaction/Display-text-on-the-redacted-area/.NET/Display-text-on-the-redacted-area/Program.cs" %} +using Syncfusion.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; +using Syncfusion.Pdf.Parsing; +using Syncfusion.Pdf.Redaction; + //Load the existing PDF document -FileStream docStream = new FileStream(@"Input.pdf", FileMode.Open, FileAccess.Read); -PdfLoadedDocument document = new PdfLoadedDocument(docStream); +PdfLoadedDocument document = new PdfLoadedDocument("Input.pdf"); //Get the first page from the document PdfLoadedPage page = document.Pages[0] as PdfLoadedPage; @@ -113,17 +129,20 @@ page.AddRedaction(redaction); //Redact the contents from the PDF document document.Redact(); -//Creating the stream object -MemoryStream stream = new MemoryStream(); -//Save the document -document.Save(stream); -//Close the document +//Save and close the PDF document +document.Save("Output.pdf"); document.Close(true); {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using System.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; +using Syncfusion.Pdf.Parsing; +using Syncfusion.Pdf.Redaction; + //Load a PDF document PdfLoadedDocument document = new PdfLoadedDocument("Input.pdf"); //Get first page from the document @@ -146,6 +165,12 @@ document.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports System.Drawing +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Graphics +Imports Syncfusion.Pdf.Parsing +Imports Syncfusion.Pdf.Redaction + 'Load a PDF document Dim document As PdfLoadedDocument = New PdfLoadedDocument("Input.pdf") 'Get first page from the document @@ -180,9 +205,14 @@ The following code example explains how to redact the information from a page by {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Redaction/Draw-image-on-the-redacted-area-in-PDF-document/.NET/Draw-image-on-the-redacted-area-in-PDF-document/Program.cs" %} +using Syncfusion.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; +using Syncfusion.Pdf.Parsing; +using Syncfusion.Pdf.Redaction; + //Load the existing PDF document -FileStream docStream = new FileStream(@"Input.pdf", FileMode.Open, FileAccess.Read); -PdfLoadedDocument document = new PdfLoadedDocument(docStream); +PdfLoadedDocument document = new PdfLoadedDocument("Input.pdf"); //Get the first page from the document PdfLoadedPage page = document.Pages[0] as PdfLoadedPage; @@ -196,17 +226,20 @@ page.AddRedaction(redaction); //Redact the contents from the PDF document document.Redact(); -//Creating the stream object -MemoryStream stream = new MemoryStream(); -//Save the document -document.Save(stream); -//Close the document +//Save and close the PDF document +document.Save("Output.pdf"); document.Close(true); {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using System.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; +using Syncfusion.Pdf.Parsing; +using Syncfusion.Pdf.Redaction; + //Load a PDF document PdfLoadedDocument document = new PdfLoadedDocument("Input.pdf"); //Get first page from the document @@ -228,6 +261,12 @@ document.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports System.Drawing +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Graphics +Imports Syncfusion.Pdf.Parsing +Imports Syncfusion.Pdf.Redaction + 'Load a PDF document Dim document As PdfLoadedDocument = New PdfLoadedDocument("Input.pdf") 'Get first page from the document @@ -261,9 +300,14 @@ The following code example explains how to redact the information from a page by {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Redaction/Draw-pattern-on-the-redacted-area-in-PDF-document/.NET/Draw-pattern-on-the-redacted-area-in-PDF-document/Program.cs" %} +using Syncfusion.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; +using Syncfusion.Pdf.Parsing; +using Syncfusion.Pdf.Redaction; + //Load the existing PDF document -FileStream docStream = new FileStream(@"Input.pdf", FileMode.Open, FileAccess.Read); -PdfLoadedDocument document = new PdfLoadedDocument(docStream); +PdfLoadedDocument document = new PdfLoadedDocument("Input.pdf"); //Get the first page from the document PdfLoadedPage page = document.Pages[0] as PdfLoadedPage; @@ -299,17 +343,19 @@ page.AddRedaction(redaction); //Redact the contents from the PDF document document.Redact(); -//Creating the stream object -MemoryStream stream = new MemoryStream(); -//Save the documents -document.Save(stream); -//Close the documents +//Save and close the PDF document +document.Save("Output.pdf"); document.Close(true); - {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using System.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; +using Syncfusion.Pdf.Parsing; +using Syncfusion.Pdf.Redaction; + //Load a PDF document PdfLoadedDocument document = new PdfLoadedDocument("Input.pdf"); //Get first page from the document @@ -354,6 +400,12 @@ document.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports System.Drawing +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Graphics +Imports Syncfusion.Pdf.Parsing +Imports Syncfusion.Pdf.Redaction + 'Load a PDF document Dim document As PdfLoadedDocument = New PdfLoadedDocument("Input.pdf") 'Get first page from the document @@ -410,9 +462,13 @@ The following code example explains how to redact the information from a page wi {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Redaction/Fill-color-on-the-redacted-area-in-a-PDF/.NET/Fill-color-on-the-redacted-area-in-a-PDF/Program.cs" %} +using Syncfusion.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Parsing; +using Syncfusion.Pdf.Redaction; + //Load the existing PDF document -FileStream docStream = new FileStream(@"Input.pdf", FileMode.Open, FileAccess.Read); -PdfLoadedDocument document = new PdfLoadedDocument(docStream); +PdfLoadedDocument document = new PdfLoadedDocument("Input.pdf"); //Get the first page from the document PdfLoadedPage page = document.Pages[0] as PdfLoadedPage; @@ -425,17 +481,19 @@ page.AddRedaction(redaction); //Redact the contents from the PDF document document.Redact(); -//Creating the stream object -MemoryStream stream = new MemoryStream(); -//Save the document -document.Save(stream); -//Close the document +//Save and close the PDF document +document.Save("Output.pdf"); document.Close(true); {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using System.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Parsing; +using Syncfusion.Pdf.Redaction; + //Load a PDF document PdfLoadedDocument document = new PdfLoadedDocument("Input.pdf"); //Get first page from the document @@ -456,6 +514,12 @@ document.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports System.Drawing +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Graphics +Imports Syncfusion.Pdf.Parsing +Imports Syncfusion.Pdf.Redaction + 'Load a PDF document Dim document As PdfLoadedDocument = New PdfLoadedDocument("Input.pdf") 'Get first page from the document @@ -488,9 +552,13 @@ The following code snippet explains how to redact the information from a page wi {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Redaction/Redaction-without-fill-color-and-appearance/.NET/Redaction-without-fill-color-and-appearance/Program.cs" %} +using Syncfusion.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Parsing; +using Syncfusion.Pdf.Redaction; + //Load the existing PDF document -FileStream docStream = new FileStream(@"Input.pdf", FileMode.Open, FileAccess.Read); -PdfLoadedDocument document = new PdfLoadedDocument(docStream); +PdfLoadedDocument document = new PdfLoadedDocument("Input.pdf"); //Get the first page from the document PdfLoadedPage page = document.Pages[0] as PdfLoadedPage; @@ -502,17 +570,19 @@ page.AddRedaction(redaction); //Redact the contents from the PDF document document.Redact(); -//Creating the stream object -MemoryStream stream = new MemoryStream(); -//Save the document -document.Save(stream); -//Close the document +//Save and close the PDF document +document.Save("Output.pdf"); document.Close(true); {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Parsing; +using Syncfusion.Pdf.Redaction; + //Load a PDF document PdfLoadedDocument document = new PdfLoadedDocument("Input.pdf"); //Get first page from the document @@ -531,6 +601,11 @@ document.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports System.Drawing +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Parsing +Imports Syncfusion.Pdf.Redaction + 'Load a PDF document Dim document As PdfLoadedDocument = New PdfLoadedDocument("Input.pdf") 'Get first page from the document @@ -561,6 +636,11 @@ The following code example demonstrates how to apply a appearance fill color to {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Redaction/Redaction-fill-color-customization/.NET/Redaction-fill-color-customization/Program.cs" %} +using Syncfusion.Pdf.Graphics; +using Syncfusion.Pdf.Interactive; +using Syncfusion.Pdf; +using Syncfusion.Drawing; + //Create a new PDF document. PdfDocument document = new PdfDocument(); //Add a page to the document. @@ -593,16 +673,19 @@ annot.SetAppearance(true); //Add the annotation to the page page.Annotations.Add(annot); -//Save the document into stream. -MemoryStream stream = new MemoryStream(); -document.Save(stream); -//Close the document. +//Save and close the PDF document +document.Save("Output.pdf"); document.Close(true); {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Pdf.Graphics; +using Syncfusion.Pdf.Interactive; +using Syncfusion.Pdf; +using Syncfusion.Drawing; + //Create a new PDF document. PdfDocument document = new PdfDocument(); //Add a page to the document. @@ -644,6 +727,11 @@ document.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports Syncfusion.Pdf.Graphics +Imports Syncfusion.Pdf.Interactive +Imports Syncfusion.Pdf +Imports System.Drawing + ' Create a new PDF document Dim document As PdfDocument = New PdfDocument() ' Create a new page @@ -696,9 +784,13 @@ The code snippet to illustrate the same is given below. {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Redaction/Get-the-redaction-progress-from-PDF-document/.NET/Get-the-redaction-progress-from-PDF-document/Program.cs" %} +using Syncfusion.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Parsing; +using Syncfusion.Pdf.Redaction; + //Load an existing PDF document -FileStream docStream = new FileStream(fileName, FileMode.Open, FileAccess.Read); -PdfLoadedDocument loadedDocument = new PdfLoadedDocument(docStream); +PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Input.pdf"); //Load the first page PdfLoadedPage page = loadedDocument.Pages[0] as PdfLoadedPage; @@ -708,11 +800,8 @@ PdfRedaction redaction = new PdfRedaction(new RectangleF(37, 94, 50, 10), System page.AddRedaction(redaction); loadedDocument.RedactionProgress += redaction_TrackProgress; -//Create the stream object -MemoryStream stream = new MemoryStream(); -//Save the document into stream -loadedDocument.Save(stream); -//Close the document +//Save and close the PDF document +loadedDocument.Save("Output.pdf"); loadedDocument.Close(true); //Event handler for Track redaction process @@ -725,6 +814,11 @@ void redaction_TrackProgress(object sender, RedactionProgressEventArgs arguments {% highlight c# tabtitle="C# [Windows-specific]" %} +using Syncfusion.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Parsing; +using Syncfusion.Pdf.Redaction; + //Load a PDF document PdfLoadedDocument loadedDocument = new PdfLoadedDocument("input.pdf"); //Load the first page @@ -751,6 +845,11 @@ MessageBox.Show(String.Format("Redaction Process " + arguments.Progress + " % co {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports System.Drawing +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Parsing +Imports Syncfusion.Pdf.Redaction + 'Load an existing PDF document Dim loadedDocument As PdfLoadedDocument = New PdfLoadedDocument("input.pdf") 'Load the first page @@ -763,8 +862,7 @@ page.Redactions.Add(redaction) loadedDocument.RedactionProgress += redaction_TrackProgress 'Save the document -Dim stream As New MemoryStream() -loadedDocument.Save(stream) +loadedDocument.Save("Output.pdf") 'Close the document loadedDocument.Close(True) @@ -786,9 +884,13 @@ Using [PdfRedactionResult](https://help.syncfusion.com/cr/document-processing/Sy {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Redaction/Get-the-result-of-redaction-with-other-information/.NET/Get-the-result-of-redaction-with-other-information/Program.cs" %} +using Syncfusion.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Parsing; +using Syncfusion.Pdf.Redaction; + //Load an existing PDF document. -FileStream docStream = new FileStream(fileName, FileMode.Open, FileAccess.Read); -PdfLoadedDocument loadedDocument = new PdfLoadedDocument(docStream); +PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Input.pdf"); //Load the first page. PdfLoadedPage page = loadedDocument.Pages[0]; @@ -807,17 +909,19 @@ else Console.WriteLine("Content not redacted properly..."); } -//Create the stream object -MemoryStream stream = new MemoryStream(); -//Save the document into stream -loadedDocument.Save(stream); -//Close the document +//Save and close the PDF document +loadedDocument.Save("Output.pdf"); loadedDocument.Close(true); {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using System.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Parsing; +using Syncfusion.Pdf.Redaction; + //Load an existing PDF document PdfLoadedDocument lDoc = new PdfLoadedDocument("input.pdf"); //Load the first page @@ -847,6 +951,11 @@ lDoc.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports System.Drawing +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Parsing +Imports Syncfusion.Pdf.Redaction + 'Load an existing PDF Dim loadedDocument As PdfLoadedDocument = New PdfLoadedDocument("input.pdf") 'Load the first page @@ -868,8 +977,7 @@ End If Next 'Save the document -Dim stream As New MemoryStream() -loadedDocument.Save(stream) +loadedDocument.Save("Output.pdf") 'Close the document loadedDocument.Close(True) @@ -889,9 +997,13 @@ The code snippet to illustrate the same is given below. {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Redaction/Redact-text-content-alone-on-the-redated-area/.NET/Program.cs" %} +using Syncfusion.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Parsing; +using Syncfusion.Pdf.Redaction; + //Load an existing PDF document -FileStream docStream = new FileStream(fileName, FileMode.Open, FileAccess.Read); -PdfLoadedDocument loadedDocument = new PdfLoadedDocument(docStream); +PdfLoadedDocument loadedDocument = new PdfLoadedDocument("Input.pdf"); PdfRedaction redaction = new PdfRedaction(new RectangleF(150, 150, 60, 24), Color.Transparent); //Only the text within the redaction bounds should be redacted. redaction.TextOnly = true; @@ -900,17 +1012,18 @@ foreach (PdfLoadedPage loadedPage in document.Pages) loadedPage.AddRedaction(redaction); } document.Redact(); -//Create the stream object -MemoryStream stream = new MemoryStream(); -//Save the document into stream -loadedDocument.Save(stream); -//Close the document +//Save and close the PDF document +loadedDocument.Save("Output.pdf"); loadedDocument.Close(true); - {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} +using System.Drawing; +using Syncfusion.Pdf; +using Syncfusion.Pdf.Parsing; +using Syncfusion.Pdf.Redaction; + //Load a PDF document PdfLoadedDocument loadedDocument = new PdfLoadedDocument("input.pdf"); PdfRedaction redaction = new PdfRedaction(new RectangleF(150, 150, 60, 24), Color.Transparent); @@ -930,6 +1043,11 @@ loadedDocument.Close(true); {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} +Imports System.Drawing +Imports Syncfusion.Pdf +Imports Syncfusion.Pdf.Parsing +Imports Syncfusion.Pdf.Redaction + 'Load an existing PDF document Dim loadedDocument As PdfLoadedDocument = New PdfLoadedDocument("input.pdf") 'Create PDF redaction for the page @@ -940,8 +1058,7 @@ For Each loadedPage As PdfLoadedPage In document.Pages Next document.Redact() 'Save the document -Dim stream As New MemoryStream() -loadedDocument.Save(stream) +loadedDocument.Save("Output.pdf") 'Close the document loadedDocument.Close(True) @@ -962,11 +1079,13 @@ The following code snippet explains how to find text by regular expression patte {% highlight c# tabtitle="C# [Cross-platform]" playgroundButtonLink="https://raw.githubusercontent.com/SyncfusionExamples/PDF-Examples/master/Redaction/Find-text-by-regular-expression-pattern-and-redact-it-from-PDF-document/.NET/Find_text_by_regular_expression/Program.cs" %} - //Create stream from an existing PDF document. - FileStream docStream = new FileStream(Path.GetFullPath("Input.pdf"), FileMode.Open, FileAccess.Read); + using Syncfusion.Pdf.Parsing; + using Syncfusion.Pdf.Redaction; + using Syncfusion.Pdf; + using System.Text.RegularExpressions; //Load the existing PDF document. - PdfLoadedDocument document = new PdfLoadedDocument(docStream); + PdfLoadedDocument document = new PdfLoadedDocument("Input.pdf"); //Get the first page from the document. PdfLoadedPage page = document.Pages[0] as PdfLoadedPage; @@ -1001,17 +1120,19 @@ The following code snippet explains how to find text by regular expression patte //Redact the contents from the PDF document. document.Redact(); - //Creating the stream object - MemoryStream stream = new MemoryStream(); - //Save the document - document.Save(stream); - //Close the document + //Save and close the PDF document + document.Save("Output.pdf"); document.Close(true); {% endhighlight %} {% highlight c# tabtitle="C# [Windows-specific]" %} + using Syncfusion.Pdf.Parsing; + using Syncfusion.Pdf.Redaction; + using Syncfusion.Pdf; + using System.Text.RegularExpressions; + //Load a PDF document PdfLoadedDocument document = new PdfLoadedDocument("Input.pdf"); @@ -1052,11 +1173,13 @@ The following code snippet explains how to find text by regular expression patte {% highlight vb.net tabtitle="VB.NET [Windows-specific]" %} -'Create stream from an existing PDF document. - Dim docStream As New FileStream(Path.GetFullPath("Input.pdf"), FileMode.Open, FileAccess.Read) + Imports Syncfusion.Pdf.Parsing + Imports Syncfusion.Pdf.Redaction + Imports Syncfusion.Pdf + Imports System.Text.RegularExpressions 'Load the existing PDF document. - Dim document As New PdfLoadedDocument(docStream) + Dim document As New PdfLoadedDocument("Input.pdf") 'Get the first page from the document. Dim page As PdfLoadedPage = TryCast(document.Pages(0), PdfLoadedPage) @@ -1087,10 +1210,8 @@ The following code snippet explains how to find text by regular expression patte 'Redact the contents from the PDF document. document.Redact() - 'Creating the stream object - Dim stream As New MemoryStream() 'Save the document - document.Save(stream) + document.Save("Output.pdf") 'Close the document document.Close(True) From c4cc78be8784d8d36a161bdcb73395dc4c425faa Mon Sep 17 00:00:00 2001 From: Irfana Jaffer Sadhik Date: Thu, 9 Oct 2025 18:16:13 +0530 Subject: [PATCH 010/163] resolved errors --- ...rt-HTML-to-PDF-in-Azure-Functions-Linux.md | 2 +- .../htmlconversion_images/ShellCommand.png | Bin 129507 -> 37311 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/Document-Processing/PDF/Conversions/HTML-To-PDF/NET/Convert-HTML-to-PDF-in-Azure-Functions-Linux.md b/Document-Processing/PDF/Conversions/HTML-To-PDF/NET/Convert-HTML-to-PDF-in-Azure-Functions-Linux.md index b899c8208..09ef3247f 100644 --- a/Document-Processing/PDF/Conversions/HTML-To-PDF/NET/Convert-HTML-to-PDF-in-Azure-Functions-Linux.md +++ b/Document-Processing/PDF/Conversions/HTML-To-PDF/NET/Convert-HTML-to-PDF-in-Azure-Functions-Linux.md @@ -77,7 +77,7 @@ echo "Dependencies installation script completed." Step 6: Set Copy to Output Directory as “Copy if newer” to the dependenciesInstall.sh file. -![Convert HTMLToPDF Azure Functions Step6](htmlconversion_images\CopyToNewwer.png) +![Convert HTMLToPDF Azure Functions Step6](htmlconversion_images\CopyToNewer.png) Step 7: Include the following namespaces in Function1.cs file. diff --git a/Document-Processing/PDF/Conversions/HTML-To-PDF/NET/htmlconversion_images/ShellCommand.png b/Document-Processing/PDF/Conversions/HTML-To-PDF/NET/htmlconversion_images/ShellCommand.png index 40cd59ddad4a8c78f9602e90bcd4667b7e4092dc..459eedd6ed69ee61e15c1791ef21a9ea4f216668 100644 GIT binary patch literal 37311 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 literal 129507 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∾mA`}j!HmPEVBVcf1OwZq0!UFKnkb|Gze{1M&seoCvf-8d%mDN{B z%gHa6>w#`iFZ|9poJw=K2 z8zeVlpf96+Jy{R`DrfjP$m}+f*(P(s*bc8Kk0LBIl$4x4A^eRgoRR?+ld_+7BTi`) z;Z{q?8H0pRgU;4FapFc*UFXNhWN_-+kt=v74=YQyjM%icDDi4p!#uxFi?FDqHa=A$ z%J=B%)6?-VZ3)DX2Yg|w`8lW$7;a0C+{1*qmo&`>dW<%b!B88)K^L<;_$bSuI$J>X z1&^)``MBm|C@*SC#>+2^eeDqsa10_zBN_%8fHi2Sb!Acc+8Z#p`^>) z@j-kR6H`fk4$xkoq4$R-M?wKreEh-`SD^=0GN3Up;ptc=3My$-lO8^-(T_=UK@}`e zO3MJPn{G|Nx{_JO@@uSG%HbX!8OFS3s00Djb_iQo`J}w8c`$TQYbgQdjUn}!=-3Mh z*L#t!JSrMGg~@j6Vkn5?`H_W!zQH&9L;6E(QLleyoMJpi5!=;SoAjIV?^acLQ?S8D}0% zWgQ(EbsvtN87CBH7dG(xFuSCo6OkDel^VAT2R~ciPd6G9r)ggrKyF6{$bSgv`Nblc zD8Hmst{P?9K|@1BOm}1UE`bxLc2LWXpl-T4hu?KXrtA=Ry;QQ7QRo&c97swe%LU9! zll75RJ%&t9b`RbVzJ^1x^}18GnE5?}m#mVbE~6#rhlgnymQdbsn_f&xWLUY!PhO4pU`Is z*IeLp_Ca!Ho3bsVEpps){R}+lZU>9S1&N$sA2x#m9OEAp~GwI2gf8k zaScCv9#6Ow>D=<{S@W29+WKZR3ZCVfhH`*O842ImKQP)yRVw2gw~ObgS1&GkC^PCn z{)O(gVx6?%XXDGsZ-9!qW_X>5BmYF}ezYH5&B`->BV@bYsVX4}k$ZXQUrY)JZYN~D zG3xL~%d%|RI>l*naP%5LZ`MM;>8|RD9m?-oA~da$Wkrj)4x}xTQ2xqWgE$e=hu= mzau6N;eS70C~F-1{(d1|7P% Date: Mon, 13 Oct 2025 11:08:22 +0530 Subject: [PATCH 011/163] 986214-ug: Added hyperlink clickable issue in the html to pdf trouble shooting section --- .../HTML-To-PDF/NET/troubleshooting.md | 30 +++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/Document-Processing/PDF/Conversions/HTML-To-PDF/NET/troubleshooting.md b/Document-Processing/PDF/Conversions/HTML-To-PDF/NET/troubleshooting.md index 5599d4a2f..f2a54795e 100644 --- a/Document-Processing/PDF/Conversions/HTML-To-PDF/NET/troubleshooting.md +++ b/Document-Processing/PDF/Conversions/HTML-To-PDF/NET/troubleshooting.md @@ -628,7 +628,6 @@ blinkConverterSettings.CommandLineArguments.Add("--disable-setuid-sandbox"); - ## Converting the HTML to PDF fails in x32 bit windows system environment @@ -652,6 +651,33 @@ blinkConverterSettings.CommandLineArguments.Add("--disable-setuid-sandbox");
+## Hyperlinks appearances do not navigate to their referenced URLs when using `CreateTemplate` and `DrawPdfTemplate` methods + + + + + + + + + + + + + + +
Issue +Hyperlinks appearances do not navigate to their referenced URLs when using `CreateTemplate` and `DrawPdfTemplate` methods +
Reason +The CreateTemplate and DrawPdfTemplate methods generally do not import annotation details, including hyperlink information, from the original PDF document. This means that while the visual appearance of a hyperlink (blue, underlined text) might be preserved, the underlying functionality of navigating to the URL is not transferred. +
Solution +A workaround involves manually extracting and re-applying hyperlink annotations. This can be achieved by following these steps:
+1.Extract Annotations: Before creating and drawing the PDF template, extract all annotations, specifically hyperlink annotations, from the original PDF document.
+2.Draw PDF Template: Use the CreateTemplate and DrawPdfTemplate methods to draw the PDF content into a new document.
+3.Incorporate Annotations: After the template has been drawn, programmatically add the extracted hyperlink annotations to the corresponding positions in the new document. This will restore the interactive functionality of the hyperlinks.
+Please refer to the sample project: HTML-to-PDF-Hyperlink +
+ ## ERROR:The specified module could not be found in windows server 2012 R2 @@ -1381,7 +1407,7 @@ This issue may occur due to one of the following reasons:
Solution -To resolve the issue and ensure successful HTML to PDF conversion in Azure App Service (Linux), follow these steps: +To resolve the issue and ensure successful HTML to PDF conversion in Azure App Service (Linux), follow these steps:
1: Grant File Access Permissions
From 9da7e2de1b2ccf8b63d6a75674cf7fbe1df68912 Mon Sep 17 00:00:00 2001 From: ManoMurugan Date: Tue, 14 Oct 2025 10:39:48 +0530 Subject: [PATCH 012/163] 986588:Details provided for 'next' in styles document Editor --- Document-Processing/Word/Word-Processor/angular/styles.md | 2 +- .../Word/Word-Processor/asp-net-core/styles.md | 4 ++-- Document-Processing/Word/Word-Processor/asp-net-mvc/styles.md | 4 ++-- Document-Processing/Word/Word-Processor/blazor/styles.md | 2 +- .../Word/Word-Processor/javascript-es5/styles.md | 4 ++-- .../Word/Word-Processor/javascript-es6/styles.md | 4 ++-- Document-Processing/Word/Word-Processor/react/styles.md | 2 +- Document-Processing/Word/Word-Processor/vue/styles.md | 4 ++-- 8 files changed, 13 insertions(+), 13 deletions(-) diff --git a/Document-Processing/Word/Word-Processor/angular/styles.md b/Document-Processing/Word/Word-Processor/angular/styles.md index 40795a2e9..040334bdb 100644 --- a/Document-Processing/Word/Word-Processor/angular/styles.md +++ b/Document-Processing/Word/Word-Processor/angular/styles.md @@ -18,7 +18,7 @@ A Style in document editor should have the following properties: * **name**: Name of the style. All styles in a document have a unique name, which is used as an identifier when applying the style. * **type**: Specifies the document elements that the style will target. For example, paragraph or character. -* **next**: Specifies that the current style inherits the style set to this property. This is how hierarchical styles are defined. +* **next**: Specifies the style that should be automatically applied to a new paragraph created after the current one. * **link**: Provides a relation between the paragraph and character style. * **characterFormat**: Specifies the properties of paragraph and character style. * **paragraphFormat**: Specifies the properties of paragraph style. diff --git a/Document-Processing/Word/Word-Processor/asp-net-core/styles.md b/Document-Processing/Word/Word-Processor/asp-net-core/styles.md index 27bd641e5..b7754f394 100644 --- a/Document-Processing/Word/Word-Processor/asp-net-core/styles.md +++ b/Document-Processing/Word/Word-Processor/asp-net-core/styles.md @@ -8,7 +8,7 @@ documentation: ug --- -# Styles +# Styles in Document Editor Control Styles are useful for applying a set of formatting consistently throughout the document. In document editor, styles are created and added to a document programmatically or via the built-in Styles dialog. @@ -18,7 +18,7 @@ A Style in document editor should have the following properties: * **name**: Name of the style. All styles in a document have a unique name, which is used as an identifier when applying the style. * **type**: Specifies the document elements that the style will target. For example, paragraph or character. -* **next**: Specifies that the current style inherits the style set to this property. This is how hierarchical styles are defined. +* **next**: Specifies the style that should be automatically applied to a new paragraph created after the current one. * **link**: Provides a relation between the paragraph and character style. * **characterFormat**: Specifies the properties of paragraph and character style. * **paragraphFormat**: Specifies the properties of paragraph style. diff --git a/Document-Processing/Word/Word-Processor/asp-net-mvc/styles.md b/Document-Processing/Word/Word-Processor/asp-net-mvc/styles.md index f87df2f8c..db13eb620 100644 --- a/Document-Processing/Word/Word-Processor/asp-net-mvc/styles.md +++ b/Document-Processing/Word/Word-Processor/asp-net-mvc/styles.md @@ -8,7 +8,7 @@ documentation: ug --- -# Styles +# Styles in Document Editor Control Styles are useful for applying a set of formatting consistently throughout the document. In document editor, styles are created and added to a document programmatically or via the built-in Styles dialog. @@ -18,7 +18,7 @@ A Style in document editor should have the following properties: * **name**: Name of the style. All styles in a document have a unique name, which is used as an identifier when applying the style. * **type**: Specifies the document elements that the style will target. For example, paragraph or character. -* **next**: Specifies that the current style inherits the style set to this property. This is how hierarchical styles are defined. +* **next**: Specifies the style that should be automatically applied to a new paragraph created after the current one. * **link**: Provides a relation between the paragraph and character style. * **characterFormat**: Specifies the properties of paragraph and character style. * **paragraphFormat**: Specifies the properties of paragraph style. diff --git a/Document-Processing/Word/Word-Processor/blazor/styles.md b/Document-Processing/Word/Word-Processor/blazor/styles.md index a8088c46e..e6d317ce6 100644 --- a/Document-Processing/Word/Word-Processor/blazor/styles.md +++ b/Document-Processing/Word/Word-Processor/blazor/styles.md @@ -17,7 +17,7 @@ A Style in document editor should have the following properties: * **name**: Name of the style. All styles in a document have a unique name, which is used as an identifier when applying the style. * **type**: Specifies the document elements that the style will target. For example, paragraph or character. -* **next**: Specifies that the current style inherits the style set to this property. This is how hierarchical styles are defined. +* **next**: Specifies the style that should be automatically applied to a new paragraph created after the current one. * **link**: Provides a relation between the paragraph and character style. * **characterFormat**: Specifies the properties of paragraph and character style. * **paragraphFormat**: Specifies the properties of paragraph style. diff --git a/Document-Processing/Word/Word-Processor/javascript-es5/styles.md b/Document-Processing/Word/Word-Processor/javascript-es5/styles.md index 8956f91f5..56527a2d6 100644 --- a/Document-Processing/Word/Word-Processor/javascript-es5/styles.md +++ b/Document-Processing/Word/Word-Processor/javascript-es5/styles.md @@ -18,7 +18,7 @@ A Style in Document Editor should have the following properties: * **name**: Name of the style. All styles in a document have a unique name, which is used as an identifier when applying the style. * **type**: Specifies the document elements that the style will target. For example, paragraph or character. -* **next**: Specifies that the current style inherits the style set to this property. This is how hierarchical styles are defined. +* **next**: Specifies the style that should be automatically applied to a new paragraph created after the current one. * **link**: Provides a relation between the paragraph and character style. * **characterFormat**: Specifies the properties of paragraph and character style. * **paragraphFormat**: Specifies the properties of paragraph style. @@ -206,7 +206,7 @@ let paragraphStyles = documentEditor.getStyles('Character'); ## Modify an existing style -You can modify a existing style with the specified style properties using [`createStyle`](https://ej2.syncfusion.com/javascript/documentation/api/document-editor/editor#createStyle) method. If modifyExistingStyle parameter is set to `true` the style properties is updated to the existing style. +You can modify a existing style with the specified style properties using [`createStyle`](https://ej2.syncfusion.com/javascript/documentation/api/document-editor/editor/#createStyle) method. If modifyExistingStyle parameter is set to `true` the style properties is updated to the existing style. The following illustrate to modify an existing style. diff --git a/Document-Processing/Word/Word-Processor/javascript-es6/styles.md b/Document-Processing/Word/Word-Processor/javascript-es6/styles.md index ed1627bef..18a11c916 100644 --- a/Document-Processing/Word/Word-Processor/javascript-es6/styles.md +++ b/Document-Processing/Word/Word-Processor/javascript-es6/styles.md @@ -18,7 +18,7 @@ A Style in Document Editor should have the following properties: * **name**: Name of the style. All styles in a document have a unique name, which is used as an identifier when applying the style. * **type**: Specifies the document elements that the style will target. For example, paragraph or character. -* **next**: Specifies that the current style inherits the style set to this property. This is how hierarchical styles are defined. +* **next**: Specifies the style that should be automatically applied to a new paragraph created after the current one. * **link**: Provides a relation between the paragraph and character style. * **characterFormat**: Specifies the properties of paragraph and character style. * **paragraphFormat**: Specifies the properties of paragraph style. @@ -187,7 +187,7 @@ let paragraphStyles = documentEditor.getStyles('Character'); ## Modify an existing style -You can modify a existing style with the specified style properties using [`createStyle`](https://ej2.syncfusion.com/documentation/api/document-editor/editor#createStyle) method. If modifyExistingStyle parameter is set to `true` the style properties is updated to the existing style. +You can modify a existing style with the specified style properties using [`createStyle`](https://ej2.syncfusion.com/documentation/api/document-editor/editor/#createStyle) method. If modifyExistingStyle parameter is set to `true` the style properties is updated to the existing style. The following illustrate to modify an existing style. diff --git a/Document-Processing/Word/Word-Processor/react/styles.md b/Document-Processing/Word/Word-Processor/react/styles.md index 65e3db229..8c6b2ffd5 100644 --- a/Document-Processing/Word/Word-Processor/react/styles.md +++ b/Document-Processing/Word/Word-Processor/react/styles.md @@ -18,7 +18,7 @@ A Style in document editor should have the following properties: * **name**: Name of the style. All styles in a document have a unique name, which is used as an identifier when applying the style. * **type**: Specifies the document elements that the style will target. For example, paragraph or character. -* **next**: Specifies that the current style inherits the style set to this property. This is how hierarchical styles are defined. +* **next**: Specifies the style that should be automatically applied to a new paragraph created after the current one. * **link**: Provides a relation between the paragraph and character style. * **characterFormat**: Specifies the properties of paragraph and character style. * **paragraphFormat**: Specifies the properties of paragraph style. diff --git a/Document-Processing/Word/Word-Processor/vue/styles.md b/Document-Processing/Word/Word-Processor/vue/styles.md index c73d404d4..b2d80cb26 100644 --- a/Document-Processing/Word/Word-Processor/vue/styles.md +++ b/Document-Processing/Word/Word-Processor/vue/styles.md @@ -18,7 +18,7 @@ A Style in document editor should have the following properties: * **name**: Name of the style. All styles in a document have a unique name, which is used as an identifier when applying the style. * **type**: Specifies the document elements that the style will target. For example, paragraph or character. -* **next**: Specifies that the current style inherits the style set to this property. This is how hierarchical styles are defined. +* **next**: Specifies the style that should be automatically applied to a new paragraph created after the current one. * **link**: Provides a relation between the paragraph and character style. * **characterFormat**: Specifies the properties of paragraph and character style. * **paragraphFormat**: Specifies the properties of paragraph style. @@ -185,7 +185,7 @@ let paragraphStyles = this.$refs.documenteditor.ej2Instances.documentEditor.getS ## Modify an existing style -You can modify a existing style with the specified style properties using [`createStyle`](https://ej2.syncfusion.com/vue/documentation/api/document-editor/editor#createStyle) method. If modifyExistingStyle parameter is set to `true` the style properties is updated to the existing style. +You can modify a existing style with the specified style properties using [`createStyle`](https://ej2.syncfusion.com/vue/documentation/api/document-editor/editor/#createStyle) method. If modifyExistingStyle parameter is set to `true` the style properties is updated to the existing style. The following illustrate to modify an existing style. From 718b63cfbf1370f03cebfd2bd426757328ab9c40 Mon Sep 17 00:00:00 2001 From: Deepak Raj Sundar Date: Wed, 15 Oct 2025 14:12:39 +0530 Subject: [PATCH 013/163] IN-209245 Added the release notes v31.2.2 node entry in the TOC.html file --- Document-Processing-toc.html | 1 + 1 file changed, 1 insertion(+) diff --git a/Document-Processing-toc.html b/Document-Processing-toc.html index 337ed8cc3..efc13a2cc 100644 --- a/Document-Processing-toc.html +++ b/Document-Processing-toc.html @@ -6751,6 +6751,7 @@

  • v31.1.18
  • +
  • v31.2.2 Service Pack Release
  • v31.1.17 Main Release
  • From cc52d5d49f7a4c5563d0208be3c63aef3754f0e7 Mon Sep 17 00:00:00 2001 From: Deepak Raj Sundar Date: Wed, 15 Oct 2025 14:31:20 +0530 Subject: [PATCH 014/163] IN-203970 Added the release notes MD file for v31.2.2 and corresponding node entry in the TOC.html file --- Document-Processing-toc.html | 1 + Document-Processing/Release-Notes/v31.2.2.md | 36 ++++++++++++++++++++ 2 files changed, 37 insertions(+) create mode 100644 Document-Processing/Release-Notes/v31.2.2.md diff --git a/Document-Processing-toc.html b/Document-Processing-toc.html index 337ed8cc3..efc13a2cc 100644 --- a/Document-Processing-toc.html +++ b/Document-Processing-toc.html @@ -6751,6 +6751,7 @@
  • v31.1.18
  • +
  • v31.2.2 Service Pack Release
  • v31.1.17 Main Release
  • diff --git a/Document-Processing/Release-Notes/v31.2.2.md b/Document-Processing/Release-Notes/v31.2.2.md new file mode 100644 index 000000000..3db0ec38f --- /dev/null +++ b/Document-Processing/Release-Notes/v31.2.2.md @@ -0,0 +1,36 @@ +--- +title : Essential Studio® for Document Processing Release Notes - v31.2.22 +description : Learn here about the controls in the Essential Studio® for Document Processing 2025 Volume 3 SP Release - Release Notes - v31.2.22 +platform : document-processing +documentation: ug +--- + +# Essential Studio® for Document Processing - v31.2.2 Release Notes + +{% include release-info.html date="October 15, 2025" version="v31.2.2" passed="238427" failed="0" %} + +{% directory path: _includes/release-notes/v31.2.22 %} + +{% include {{file.url}} %} + +{% enddirectory %} + +## Test Results + +| Component Name | Platform | Test Cases | Remarks | +|:----------------------------:|:--------------------------------------------------------:|:----------:|:----------:| +| Pdf Library (Pdf) | .NET | 14724 | All Passed | +| Word Library(DocIO) | .NET | 56583 | All Passed | +| Word Library(DocIO) | Java | 4079 | All Passed | +| Excel Library(XlsIO) | .NET | 37778 | All Passed | +| PowerPoint Library | .NET | 54391 | All Passed | +| Metafilerenderer | .NET | 863 | All Passed | +| SfPdfViewer2 | Blazor | 12906 | All Passed | +| Pdf Viewer | Web(Javascript, Angular, React, Vue, ASP.NET Core & MVC) | 19130 | All Passed | +| SfPdfViewer | MAUI | 14684 | All Passed | +| Pdf Viewer | WPF | 2998 | All Passed | +| PdfViewer | WinForms | 207 | All Passed | +| DOCX Editor(Document Editor) | Web(Javascript, Angular, React, Vue, ASP.NET Core & MVC) | 5031 | All Passed | +| DOCX Editor(Document Editor) | Blazor | 1936 | All Passed | +| Spreadsheet | Web(Javascript, Angular, React, Vue, ASP.NET Core & MVC) | 10407 | All Passed | +| Spreadsheet | WPF | 2710 | All Passed | \ No newline at end of file From 34ef5f7449420d649f6ef1ce012fa7e9eb7162fc Mon Sep 17 00:00:00 2001 From: Deepak Raj Sundar Date: Wed, 15 Oct 2025 14:43:01 +0530 Subject: [PATCH 015/163] IN-209245 Updated the release notes MD file v31.2.2 --- Document-Processing/Release-Notes/v31.2.2.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Document-Processing/Release-Notes/v31.2.2.md b/Document-Processing/Release-Notes/v31.2.2.md index 3db0ec38f..15ad9dfb3 100644 --- a/Document-Processing/Release-Notes/v31.2.2.md +++ b/Document-Processing/Release-Notes/v31.2.2.md @@ -9,7 +9,7 @@ documentation: ug {% include release-info.html date="October 15, 2025" version="v31.2.2" passed="238427" failed="0" %} -{% directory path: _includes/release-notes/v31.2.22 %} +{% directory path: _includes/release-notes/v31.2.2 %} {% include {{file.url}} %} From 8384cc73319aaadf195b656231151f73dfdeb19e Mon Sep 17 00:00:00 2001 From: Tamilselvan-Durairaj <153176971+Tamilselvan-Durairaj@users.noreply.github.com> Date: Wed, 15 Oct 2025 23:37:55 +0530 Subject: [PATCH 016/163] 986755: Update the development changes to the hotfix --- ...o-extract-particular-text-and-highlight.md | 2 +- ...refer-SfPdfViewer-script-in-application.md | 2 +- .../PDF-Viewer/blazor/form-designer/events.md | 6 +- .../getting-started/winforms-blazor-app.md | 2 +- .../PDF/PDF-Viewer/blazor/overview.md | 10 +- .../blazor/redaction/mobile-view.md | 2 +- .../toolbar-customization/mobile-toolbar.md | 3 +- .../blazor/getting-started/maui-blazor-app.md | 2 +- .../blazor/getting-started/web-app.md | 4 +- .../User-Token-with-Custom-AI-service.md | 556 ------------------ ...-SfSmartPdfViewer-script-in-application.md | 23 - 11 files changed, 17 insertions(+), 595 deletions(-) delete mode 100644 Document-Processing/PDF/Smart-PDF-Viewer/blazor/how-to/User-Token-with-Custom-AI-service.md delete mode 100644 Document-Processing/PDF/Smart-PDF-Viewer/blazor/how-to/refer-SfSmartPdfViewer-script-in-application.md diff --git a/Document-Processing/PDF/PDF-Viewer/blazor/faqs/how-to-extract-particular-text-and-highlight.md b/Document-Processing/PDF/PDF-Viewer/blazor/faqs/how-to-extract-particular-text-and-highlight.md index 20f2f2a1b..22eea852d 100644 --- a/Document-Processing/PDF/PDF-Viewer/blazor/faqs/how-to-extract-particular-text-and-highlight.md +++ b/Document-Processing/PDF/PDF-Viewer/blazor/faqs/how-to-extract-particular-text-and-highlight.md @@ -3,7 +3,7 @@ layout: post title: Extract and Highlight Text in Blazor PDF Viewer | Syncfusion description: Learn here all about how to extract specific text and highlight it in the Syncfusion Blazor PDF Viewer component. platform: document-processing -control: PDF Viewer +control: SfPdfViewer documentation: ug --- diff --git a/Document-Processing/PDF/PDF-Viewer/blazor/faqs/how-to-refer-SfPdfViewer-script-in-application.md b/Document-Processing/PDF/PDF-Viewer/blazor/faqs/how-to-refer-SfPdfViewer-script-in-application.md index 9302c50cd..40b25bc47 100644 --- a/Document-Processing/PDF/PDF-Viewer/blazor/faqs/how-to-refer-SfPdfViewer-script-in-application.md +++ b/Document-Processing/PDF/PDF-Viewer/blazor/faqs/how-to-refer-SfPdfViewer-script-in-application.md @@ -1,5 +1,5 @@ --- -layout: pos +layout: post title: Reference SfPdfViewer scripts in a Blazor application | Syncfusion description: Learn how to reference Syncfusion Blazor SfPdfViewer scripts using a CDN, static web assets, or custom resources, including deploying pdfium files. platform: document-processing diff --git a/Document-Processing/PDF/PDF-Viewer/blazor/form-designer/events.md b/Document-Processing/PDF/PDF-Viewer/blazor/form-designer/events.md index c715c152d..4c9be1b9f 100644 --- a/Document-Processing/PDF/PDF-Viewer/blazor/form-designer/events.md +++ b/Document-Processing/PDF/PDF-Viewer/blazor/form-designer/events.md @@ -1,9 +1,9 @@ --- layout: post title: Form Designer events in Blazor PDF Viewer | Syncfusion -description: Learn about Form Designer events in the Syncfusion Blazor PDF Viewer (SfPdfViewer2), including add, delete, select, resize, validate, import, and export. -platform: blazor -control: PdfViewer +description: Learn about Form Designer events in the Syncfusion Blazor SfPdfViewer, including add, delete, select, resize, validate, import, and export. +platform: document-processing +control: SfPdfViewer documentation: ug --- diff --git a/Document-Processing/PDF/PDF-Viewer/blazor/getting-started/winforms-blazor-app.md b/Document-Processing/PDF/PDF-Viewer/blazor/getting-started/winforms-blazor-app.md index db64edf9b..5467edba9 100644 --- a/Document-Processing/PDF/PDF-Viewer/blazor/getting-started/winforms-blazor-app.md +++ b/Document-Processing/PDF/PDF-Viewer/blazor/getting-started/winforms-blazor-app.md @@ -145,7 +145,7 @@ N> Ensure that the PDF Viewer static assets (themes and scripts) are loaded prop Register Syncfusion Blazor services and BlazorWebView in **~/Form1.cs** so that the WinForms window can host Blazor components. {% tabs %} -{% highlight c# tabtitle="Form1.cs (WinForms host)" hl_lines="2 3 4 5 8 9 10 11 12 13 14 15 16 17 18 20" %} +{% highlight c# tabtitle="Form1.cs (WinForms host)" hl_lines="2 3 4 5 9 10 11 12 13 14 15 16 17 18 19 21" %} namespace WinFormsBlazorHybridApp; using Microsoft.AspNetCore.Components.WebView.WindowsForms; diff --git a/Document-Processing/PDF/PDF-Viewer/blazor/overview.md b/Document-Processing/PDF/PDF-Viewer/blazor/overview.md index a4c7bdcae..d0304a566 100644 --- a/Document-Processing/PDF/PDF-Viewer/blazor/overview.md +++ b/Document-Processing/PDF/PDF-Viewer/blazor/overview.md @@ -33,10 +33,10 @@ In the classic viewer, many C# service calls were required to retrieve informati * Accurate, reliable rendering of PDF pages. * Easy page navigation with: - * [Thumbnail page view](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/blazor/navigation#page-thumbnail-navigation) - * [Bookmark panel](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/blazor/navigation#bookmark-navigation) - * [Hyperlink navigation](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/blazor/navigation#hyperlink-navigation) - * [Table of contents navigation](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/blazor/navigation#table-of-content-navigation) + * [Thumbnail page view](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/blazor/interactive-pdf-navigation/page-thumbnail) + * [Bookmark panel](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/blazor/interactive-pdf-navigation/bookmark) + * [Hyperlink navigation](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/blazor/interactive-pdf-navigation/hyperlink) + * [Table of contents navigation](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/blazor/interactive-pdf-navigation/table-of-content) * Core interactions: * [Zooming](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/blazor/magnification) and [panning](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/blazor/interaction#panning-mode) * [Text searching](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/blazor/text-search) @@ -48,7 +48,7 @@ In the classic viewer, many C# service calls were required to retrieve informati * [Stamp annotations](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/blazor/annotation/stamp-annotation): built-in and custom stamps * [Measurement annotations](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/blazor/annotation/measurement-annotation) * [Free text annotations](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/blazor/annotation/free-text-annotation) - * [Redaction annotations](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/blazor/annotation/redaction-annotation) + * [Redaction annotations](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/blazor/redaction/overview) * [Comments](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/blazor/annotation/comments) and [sticky notes](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/blazor/annotation/sticky-notes-annotation) for all annotation types * [Form filling](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/blazor/form-filling) * [Form designer](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/blazor/form-designer) diff --git a/Document-Processing/PDF/PDF-Viewer/blazor/redaction/mobile-view.md b/Document-Processing/PDF/PDF-Viewer/blazor/redaction/mobile-view.md index d765e011e..4dd87255f 100644 --- a/Document-Processing/PDF/PDF-Viewer/blazor/redaction/mobile-view.md +++ b/Document-Processing/PDF/PDF-Viewer/blazor/redaction/mobile-view.md @@ -3,7 +3,7 @@ layout: post title: Redaction in mobile view in Blazor PDF Viewer | Syncfusion description: Learn how to add, customize, and apply redactions in mobile view using the Syncfusion Blazor PDF Viewer with a complete toolbar setup and redaction workflow. platform: document-processing -control: SfPdfViewer2 +control: SfPdfViewer documentation: ug --- diff --git a/Document-Processing/PDF/PDF-Viewer/blazor/toolbar-customization/mobile-toolbar.md b/Document-Processing/PDF/PDF-Viewer/blazor/toolbar-customization/mobile-toolbar.md index d35716bd6..1229b044f 100644 --- a/Document-Processing/PDF/PDF-Viewer/blazor/toolbar-customization/mobile-toolbar.md +++ b/Document-Processing/PDF/PDF-Viewer/blazor/toolbar-customization/mobile-toolbar.md @@ -168,4 +168,5 @@ The Print option is not available in mobile mode by default. To use printing on ## See also - [Annotations in mobile view](../annotation/annotations-in-mobile-view) -- [Form designer in mobile view](../form-designer/form-designer-in-mobile-view) \ No newline at end of file +- [Form designer in mobile view](../form-designer/form-designer-in-mobile-view) +- [Redaction in mobile view](../redaction/mobile-view) \ No newline at end of file diff --git a/Document-Processing/PDF/Smart-PDF-Viewer/blazor/getting-started/maui-blazor-app.md b/Document-Processing/PDF/Smart-PDF-Viewer/blazor/getting-started/maui-blazor-app.md index 5ccf29282..52796178c 100644 --- a/Document-Processing/PDF/Smart-PDF-Viewer/blazor/getting-started/maui-blazor-app.md +++ b/Document-Processing/PDF/Smart-PDF-Viewer/blazor/getting-started/maui-blazor-app.md @@ -159,7 +159,7 @@ For **Azure OpenAI**, first [deploy an Azure OpenAI Service resource and model]( Add the following stylesheet and script to the head section of the **~/wwwroot/index.html** file. {% tabs %} -{% highlight html hl_lines="3 7" %} +{% highlight html hl_lines="4 9" %} .... diff --git a/Document-Processing/PDF/Smart-PDF-Viewer/blazor/getting-started/web-app.md b/Document-Processing/PDF/Smart-PDF-Viewer/blazor/getting-started/web-app.md index 415132c75..a3c26a66b 100644 --- a/Document-Processing/PDF/Smart-PDF-Viewer/blazor/getting-started/web-app.md +++ b/Document-Processing/PDF/Smart-PDF-Viewer/blazor/getting-started/web-app.md @@ -79,7 +79,7 @@ When using the `Server` render mode in a Blazor Web App, install the Syncfusion< * Press Ctrl+` to open the integrated terminal in Visual Studio Code. * Ensure the current directory contains the project `.csproj` file. -* Run the following commands to install `Syncfusion.Blazor.SfSmartPdfViewer` and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/), then restore the solution. +* Run the following commands to install [Syncfusion.Blazor.SfSmartPdfViewer](https://www.nuget.org/packages/Syncfusion.Blazor.SfSmartPdfViewer) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/), then restore the solution. {% tabs %} {% highlight c# tabtitle="Package Manager" %} @@ -286,7 +286,7 @@ The theme stylesheet and script can be accessed from NuGet through [Static Web A {% tabs %} -{% highlight html hl_lines="3 7" %} +{% highlight html hl_lines="4 9" %} .... diff --git a/Document-Processing/PDF/Smart-PDF-Viewer/blazor/how-to/User-Token-with-Custom-AI-service.md b/Document-Processing/PDF/Smart-PDF-Viewer/blazor/how-to/User-Token-with-Custom-AI-service.md deleted file mode 100644 index d75ef97a1..000000000 --- a/Document-Processing/PDF/Smart-PDF-Viewer/blazor/how-to/User-Token-with-Custom-AI-service.md +++ /dev/null @@ -1,556 +0,0 @@ ---- -layout: post -title: UserToken with Azure AI Service in Smart PDF Viewer| Syncfusion -description: Learn how to implement a User Token with Custom Azure AI Service in Syncfusion Smart PDF Viewer in a Blazor App. -platform: document-processing -control: SfSmartPdfViewer -documentation: ug ---- -# Getting Started Smart PDF Viewer using UserToken with Azure Service - -This guide provides step-by-step instructions for integrating and using Syncfusion's Smart PDF Viewer with User Token and Custom Azure AI service in your Blazor App. - -## Prerequisites - -Before you begin, ensure you have: - -* [System requirements for Blazor components](https://blazor.syncfusion.com/documentation/system-requirements) -* [Azure OpenAI Account](https://learn.microsoft.com/en-us/azure/ai-services/openai/how-to/create-resource) - -## Getting Started for User Token with Custom Azure AI service in Smart PDF Viewer - -After completing this setup, you can: - -1. [Add Smart PDF Viewer to your Blazor pages](../getting-started/web-app) - ---- -## Step 1: Create User Token Service -The `UserTokenService` is responsible for generating secure tokens for users. These tokens can be used to authenticate requests to your Custom Azure AI Service. - -### Implementation Steps -1. Create a new class file named `UserTokenService.cs` in your project -2. Add the following implementation: - -{% tabs %} -{% highlight c# tabtitle="~/UserTokenService.cs" %} - -// This class handles user token management including generation, tracking, and resetting. -public class UserTokenService -{ - private readonly IJSRuntime _jsRuntime; - private const string TokenFilePath = "user_tokens.json"; // Path to the token storage file - private static readonly TimeZoneInfo IndianStandardTime = TimeZoneInfo.FindSystemTimeZoneById("India Standard Time"); - - // Constructor to initialize JavaScript runtime for browser interactions - public UserTokenService(IJSRuntime jsRuntime) - { - _jsRuntime = jsRuntime; - } - - // Retrieves a unique fingerprint for the user using JavaScript - public async Task GetUserFingerprintAsync() - { - return await _jsRuntime.InvokeAsync("fingerPrint"); - } - - // Gets the remaining tokens for a user, resetting if needed - public async Task GetRemainingTokensAsync(string userCode) - { - Dictionary tokens = await CheckAndResetTokensAsync(userCode); - return tokens.ContainsKey(userCode) ? tokens[userCode].RemainingTokens : 15000 ; - } - - // Updates the token count for a user and saves it to the file - public async Task UpdateTokensAsync(string userCode, int tokens) - { - Dictionary tokenData = await ReadTokensFromFileAsync(); - if (tokenData.ContainsKey(userCode)) - { - tokenData[userCode].RemainingTokens = tokens; - } - else - { - tokenData[userCode] = new UserTokenInfo - { - UserId = userCode, - DateOfLogin = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, IndianStandardTime), - RemainingTokens = tokens - }; - } - await WriteTokensToFileAsync(tokenData); - } - - // Checks if 24 hours have passed since last login and resets tokens if needed - public async Task> CheckAndResetTokensAsync(string userCode) - { - Dictionary tokenData = await ReadTokensFromFileAsync(); - if (tokenData.ContainsKey(userCode)) - { - UserTokenInfo userTokenInfo = tokenData[userCode]; - DateTime currentTime = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, IndianStandardTime); - TimeSpan timeDifference = currentTime - userTokenInfo.DateOfLogin; - - if (timeDifference.TotalHours > 24) - { - userTokenInfo.RemainingTokens = 15000; // Reset tokens - userTokenInfo.DateOfLogin = currentTime; // Update login time - await WriteTokensToFileAsync(tokenData); - } - } - return tokenData; - } - - // Reads token data from the JSON file - private async Task> ReadTokensFromFileAsync() - { - if (!File.Exists(TokenFilePath)) - { - Dictionary initialData = new Dictionary(); - await WriteTokensToFileAsync(initialData); - return initialData; - } - string json = await File.ReadAllTextAsync(TokenFilePath); - Dictionary? tokenData = JsonSerializer.Deserialize>(json); - return tokenData ?? new Dictionary(); - } - - // Reads token data from the JSON file - private async Task WriteTokensToFileAsync(Dictionary tokenData) - { - string json = JsonSerializer.Serialize(tokenData, new JsonSerializerOptions { WriteIndented = true }); - await File.WriteAllTextAsync(TokenFilePath, json); - } - // Displays an alert banner in the browser with token reset info - public async Task ShowAlert(string userCode) - { - string message = await ReturnAlertMessage(userCode); - await _jsRuntime.InvokeVoidAsync("showBanner", message.ToString()); - } - - // Generates the alert message with token reset time and GitHub link - public async Task ReturnAlertMessage(string userCode) - { - Dictionary tokenData = await ReadTokensFromFileAsync(); - if (tokenData.ContainsKey(userCode)) - { - UserTokenInfo userTokenInfo = tokenData[userCode]; - string resetTime = userTokenInfo.DateOfLogin.AddHours(24).ToString("f"); - string message = $"You have reached your token limit. Your tokens will reset on {resetTime}. Download our Syncfusion Smart AI Samples from GitHub to explore this sample locally with your own API key."; - return message; - } - return ""; - } - -} -// Model class to store user token information -public class UserTokenInfo -{ - public string UserId { get; set; } - public DateTime DateOfLogin { get; set; } - public int RemainingTokens { get; set; } -} - -{% endhighlight %} -{% endtabs %} - -## Step 2: Implement User Token API Controller -The `UserTokensController` class serves as the API layer for interacting with the user token system.This controller is essential for enabling secure and dynamic token tracking for users interacting with your Custom Azure AI Service. - -1. Create a new class file named `UserTokensController.cs` in your project -2. Add the following implementation: - -{% tabs %} -{% highlight c# tabtitle="~/UserTokensController.cs" %} -// Defines the route for the API controller and marks it as an API controller -[Route("api/[controller]")] -[ApiController] -public class UserTokensController : ControllerBase -{ - private readonly IWebHostEnvironment _env; // Provides access to web hosting environment properties - private UserTokenService userToken { get; set; } // Service to manage user tokens - - // Constructor to inject dependencies: hosting environment and token service - public UserTokensController(IWebHostEnvironment env, UserTokenService user) - { - _env = env; - userToken = user; - } - - // API endpoint to get remaining tokens for a user - // Route: GET api/usertokens/get_remaining_tokens/{userId} - [HttpGet("get_remaining_tokens/{userId}")] - public async Task GetRemainingTokens(string userId) - { - // Construct the full path to the token file - string filePath = Path.Combine(_env.ContentRootPath, "user_tokens.json"); - - // Get the current remaining tokens for the user - int remainingTokens = await userToken.GetRemainingTokensAsync(userId); - - // Get the alert message if the user is near or at the token limit - string alertMessage = await userToken.ReturnAlertMessage(userId); - - // If tokens are low (≤ 300), return the current token count and alert message - if (remainingTokens <= 300) - { - return Ok(new { remainingTokens, alertMessage }); - } - - // Otherwise, deduct 550 tokens and update the token count - await userToken.UpdateTokensAsync(userId, (int)(remainingTokens - 550)); - - // Return the updated token count and alert message - return Ok(new { remainingTokens, alertMessage }); - } -} - -{% endhighlight %} -{% endtabs %} - -## Step 3: Create a Custom Azure AI Service - -The Syncfusion Smart PDF Viewer are designed to work with different AI backends through the `IChatInferenceService` interface. This section shows you how to create a custom implementation that connects the Smart PDF Viewer to the Azure AI service. - -### Understanding the Interface - -The `IChatInferenceService` interface is the bridge between Syncfusion Smart PDF Viewer and AI services: - -1. Create a new file named `AzureAIService.cs` -2. Add the following implementation: - -{% tabs %} -{% highlight c# tabtitle="~/AzureAIService.cs" %} - -// AzureAIService integrates with Azure OpenAI to generate chat completions and manage token usage. -public class AzureAIService : IChatInferenceService -{ - private readonly UserTokenService _userTokenService; - private ChatParameters chatParameters_history = new ChatParameters(); - private IChatClient _chatClient; - - public AzureAIService(UserTokenService userTokenService, IChatClient client) - { - _userTokenService = userTokenService; - this._chatClient = client ?? throw new ArgumentNullException(nameof(client)); - } - - - /// - /// Gets a text completion from the Azure OpenAI service. - /// - /// The user prompt to send to the AI service. - /// Indicates whether the response should be returned in JSON format. Defaults to true - /// Indicates whether to append previous responses to the conversation history. Defaults to false - /// Specifies the systemRole that is sent to AI Clients. Defaults to null - /// The AI-generated completion as a string. - public async Task GetCompletionAsync(string prompt, bool returnAsJson = true, bool appendPreviousResponse = false, string systemRole = null, int outputTokens = 2000) - { - string systemMessage = returnAsJson ? "You are a helpful assistant that only returns and replies with valid, iterable RFC8259 compliant JSON in your responses unless I ask for any other format. Do not provide introductory words such as 'Here is your result' or 'json', etc. in the response" : !string.IsNullOrEmpty(systemRole) ? systemRole : "You are a helpful assistant"; - try - { - ChatParameters chatParameters = appendPreviousResponse ? chatParameters_history : new ChatParameters(); - if (appendPreviousResponse) - { - if (chatParameters.Messages == null) - { - chatParameters.Messages = new List() { - new ChatMessage(ChatRole.System,systemMessage), - }; - } - chatParameters.Messages.Add(new ChatMessage(ChatRole.User, prompt)); - } - else - { - chatParameters.Messages = new List(2) { - new ChatMessage (ChatRole.System, systemMessage), - new ChatMessage(ChatRole.User,prompt), - }; - } - chatParameters.MaxTokens = outputTokens; - string completion = await GenerateResponseAsync(chatParameters); - if (appendPreviousResponse) - { - chatParameters_history?.Messages?.Add(new ChatMessage(ChatRole.Assistant, completion)); - } - return completion; - } - catch (Exception ex) - { - Console.WriteLine($"An exception has occurred: {ex.Message}"); - return ""; - } - } - - /// - /// Sends the chat parameters to the AI client and returns the response. - /// Also checks and updates token usage. - /// - /// Chat parameters including messages and settings. - /// AI-generated response text. GenerateResponseAsync(ChatParameters options) - { - string userCode = await _userTokenService.GetUserFingerprintAsync(); - int remainingTokens = await _userTokenService.GetRemainingTokensAsync(userCode); - int inputTokens = options.Messages.Sum(message => message.Text.Length / 4); - - if (remainingTokens <= inputTokens) - { - await _userTokenService.ShowAlert(userCode); - return null; - } - // Create a completion request with the provided parameters - ChatOptions completionRequest = new ChatOptions - { - Temperature = options.Temperature ?? 0.5f, - TopP = options.TopP ?? 1.0f, - MaxOutputTokens = options.MaxTokens ?? 2000, - FrequencyPenalty = options.FrequencyPenalty ?? 0.0f, - PresencePenalty = options.PresencePenalty ?? 0.0f, - StopSequences = options.StopSequences - }; - try - { - ChatResponse completion = await _chatClient.GetResponseAsync(options.Messages, completionRequest); - await _userTokenService.UpdateTokensAsync(userCode, (int)(remainingTokens - completion.Usage.TotalTokenCount)); - return completion.Text.ToString(); - } - catch (Exception ex) - { - throw; - } - } -} - -{% endhighlight %} -{% endtabs %} - -## Step 4: Add a script file to your application and refer it to the head tag. - -```cshtml - - - - - -``` -## Step 5: Add the following code to render the JS component in the blazor to the newly added JS file. - -```javascript - -// Generates a unique fingerprint for the user based on canvas rendering and SHA-256 hashing -async function fingerPrint() { - try { - // Create a hidden canvas element - var canvas = document.body.appendChild(document.createElement('canvas')); - canvas.width = 600; - canvas.height = 300; - canvas.style.display = "none"; - - // Drawing parameters - const ctx = canvas.getContext("2d"); - const size = 24; - const diamondSize = 28; - const gap = 4; - const startX = 30; - const startY = 30; - const blue = "#1A3276"; - const orange = "#F28C00"; - - // Pattern map for drawing squares and diamonds - const colorMap = [ - ["blue", "blue", "diamond"], - ["blue", "orange", "blue"], - ["blue", "blue", "blue"] - ]; - - // Draw a square at specified coordinates - function drawSquare(x, y, color) { - ctx.fillStyle = color; - ctx.fillRect(x, y, size, size); - } - - // Draw a diamond shape at specified coordinates - function drawDiamond(centerX, centerY, size, color) { - ctx.fillStyle = color; - ctx.beginPath(); - ctx.moveTo(centerX, centerY - size / 2); - ctx.lineTo(centerX + size / 2, centerY); - ctx.lineTo(centerX, centerY + size / 2); - ctx.lineTo(centerX - size / 2, centerY); - ctx.closePath(); - ctx.fill(); - } - - // Render the pattern on canvas - for (let row = 0; row < 3; row++) { - for (let col = 0; col < 3; col++) { - const type = colorMap[row][col]; - const x = startX + col * (size + gap); - const y = startY + row * (size + gap); - if (type === "blue") drawSquare(x, y, blue); - else if (type === "orange") drawSquare(x, y, orange); - else if (type === "diamond") drawDiamond(x + size / 2, y + size / 2, diamondSize, orange); - } - } - - // Add text and shapes to increase fingerprint uniqueness - ctx.font = "20px Arial"; - ctx.fillStyle = blue; - ctx.textBaseline = "middle"; - ctx.fillText("Syncfusion", startX + 3 * (size + gap) + 20, startY + size + gap); - - // Add overlapping circles with blend mode - ctx.globalCompositeOperation = "multiply"; - ctx.fillStyle = "rgb(255,0,255)"; - ctx.beginPath(); ctx.arc(50, 200, 50, 0, Math.PI * 2); ctx.fill(); - ctx.fillStyle = "rgb(0,255,255)"; - ctx.beginPath(); ctx.arc(100, 200, 50, 0, Math.PI * 2); ctx.fill(); - ctx.fillStyle = "rgb(255,255,0)"; - ctx.beginPath(); ctx.arc(75, 250, 50, 0, Math.PI * 2); ctx.fill(); - ctx.fillStyle = "rgb(255,0,255)"; - ctx.beginPath(); - ctx.arc(200, 200, 75, 0, Math.PI * 2, true); - ctx.arc(200, 200, 25, 0, Math.PI * 2, true); - ctx.fill("evenodd"); - - // Hash the canvas data to generate a unique ID - const sha256 = async function (str) { - const encoder = new TextEncoder(); - const data = encoder.encode(str); - const hashBuffer = await crypto.subtle.digest('SHA-256', data); - const hashArray = Array.from(new Uint8Array(hashBuffer)); - return hashArray.map(b => b.toString(16).padStart(2, '0')).join(''); - }; - - const visitorID = sha256(canvas.toDataURL()); - return visitorID; - } - catch (error) { - console.error(error); - return null; - } -} - -// Displays a banner message on the page -function showBanner(messageText) { - // Check if the banner already exists - if (document.getElementById("custom-banner")) { - hideSpinner(); - return; - } - - // Create the banner container - let banner = document.createElement("div"); - banner.id = "custom-banner"; - banner.className = "e-banner"; - - // Banner content - let message = document.createElement("p"); - message.innerHTML = messageText; - message.className = "banner-message"; - - // Create the close button - let closeButton = document.createElement("span"); - closeButton.innerHTML = "×"; // HTML entity for '×' symbol - closeButton.className = "close-button"; - closeButton.onclick = closeBanner; - - // Append elements - banner.appendChild(message); - banner.appendChild(closeButton); - document.body.insertBefore(banner, document.body.firstChild); - hideSpinner(); -} - -// Fetches remaining tokens for a user from the backend API -async function getRemainingTokens(userId) { - try { - const baseElement = document.querySelector('base'); - const baseUrl = baseElement ? baseElement.href : window.location.origin; - const response = await fetch(`${baseUrl}api/UserTokens/get_remaining_tokens/${userId}`); - if (response.ok) { - return await response.json(); - } - } catch (error) { - console.error("Error fetching remaining tokens:", error); - } - return 0; -} -function closeBanner() { - let banner = document.getElementById("custom-banner"); - if (banner) { - document.body.removeChild(banner); - } -} - -function hideSpinner() { - var spinnerElement = document.querySelector('.e-spinner-pane.e-spin-show'); - if (spinnerElement) { - spinnerElement.classList.remove('e-spin-show'); - spinnerElement.classList.add('e-spin-hide'); - } -} -``` - -## Step 6: Configure the Blazor App - -Configure your Blazor application to use the User Token with Azure AI service with Syncfusion Smart PDF Viewer. This involves registering necessary services and setting up the dependency injection container. - -{% tabs %} -{% highlight c# tabtitle="~/Program.cs" %} - -using Azure.AI.OpenAI; -using System.ClientModel; -using Microsoft.Extensions.AI; -using Syncfusion.Blazor.AI; - -... -var builder = WebApplication.CreateBuilder(args); - -.... - -builder.Services.AddSyncfusionBlazor(); - -// Define your Azure OpenAI credentials and model -string azureOpenAIKey = "Your API Key"; // Replace with your actual Azure OpenAI API key -string azureOpenAIEndpoint = "Your Endpoint"; // Replace with your Azure OpenAI endpoint URL -string azureOpenAIModel = "Your model name"; // Replace with your deployed model name - -// Create an AzureOpenAIClient instance using the endpoint and API key -AzureOpenAIClient azureOpenAIClient = new AzureOpenAIClient( - new Uri(azureOpenAIEndpoint), - new ApiKeyCredential(azureOpenAIKey) -); - -// Get a chat client from the AzureOpenAIClient and cast it to IChatClient -IChatClient azureOpenAIChatClient = azureOpenAIClient.GetChatClient(azureOpenAIModel).AsIChatClient(); -builder.Services.AddChatClient(azureOpenAIChatClient); -builder.Services.AddScoped(); - -// Register AzureAIService as the implementation of IChatInferenceService -builder.Services.AddScoped(sp => -{ - UserTokenService userTokenService = sp.GetRequiredService(); - return new AzureAIService(userTokenService, azureOpenAIChatClient); -}); - -var app = builder.Build(); -.... - -{% endhighlight %} -{% endtabs %} - -Here, - -* **apiKey**: "Azure OpenAI API Key"; -* **deploymentName**: "Azure OpenAI deployment name"; -* **endpoint**: "Azure OpenAI deployment end point URL"; - -For **Azure OpenAI**, first [deploy an Azure OpenAI Service resource and model](https://learn.microsoft.com/en-us/azure/ai-services/openai/how-to/create-resource), then values for `apiKey`, `deploymentName` and `endpoint` will all be provided to you. - -N> [View sample in GitHub](https://github.com/SyncfusionExamples/blazor-smart-pdf-viewer-examples/tree/master/Custom%20Services/AzureAI%20service%20with%20User%20token) - -## See also - -* [Getting Started with Blazor Smart PDF Viewer in Web App Server](../getting-started/web-app) -* [Custom AI Service Integration in Blazor Smart PDF Viewer](../custom-ai-service) \ No newline at end of file diff --git a/Document-Processing/PDF/Smart-PDF-Viewer/blazor/how-to/refer-SfSmartPdfViewer-script-in-application.md b/Document-Processing/PDF/Smart-PDF-Viewer/blazor/how-to/refer-SfSmartPdfViewer-script-in-application.md deleted file mode 100644 index a3bbc381e..000000000 --- a/Document-Processing/PDF/Smart-PDF-Viewer/blazor/how-to/refer-SfSmartPdfViewer-script-in-application.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -layout: post -title: Refer the SfSmartPdfViewer script file in application | Syncfusion -description: Learn here all about refer the SfSmartPdfViewer script file in the application in Syncfusion Blazor SfSmartPdfViewer component and more. -platform: document-processing -control: SfSmartPdfViewer -documentation: ug ---- - -# Refer the SfSmartPdfViewer script file in Blazor application - -* You can include the script in your application by adding a CDN link. This provides a quick and efficient way to integrate the required functionality without needing to reference the script locally. For more details, please refer to the [CDN Reference](https://blazor.syncfusion.com/documentation/common/adding-script-references#cdn-reference) - -* You can also reference the script directly from the NuGet package included in your application. For more details, please refer to the [Refer script from static web assets](https://blazor.syncfusion.com/documentation/common/adding-script-references#static-web-assets) - -* If you wish to add custom scripts to your application, please refer to the [Custom Resource Generator](https://blazor.syncfusion.com/documentation/common/custom-resource-generator) for generating the necessary resources. You need to include the [pdfium.js](https://github.com/SyncfusionExamples/blazor-pdf-viewer-examples/blob/master/Common/Pdfium%20files/pdfium.js) and [pdfium.wasm](https://github.com/SyncfusionExamples/blazor-pdf-viewer-examples/blob/master/Common/Pdfium%20files/pdfium.wasm) files in your application when referencing scripts externally. - -To refer the script and pdfium files in your application, please refer the below image. -![Scripts in Blazor SfSmartPdfViewer](../images/pdfium.png) - -## See also - -* [Getting Started with Blazor Smart PDF Viewer in Web App Server](../getting-started/web-app) From f11c8a75fb965c1cd21e827839504f0043cb3ada Mon Sep 17 00:00:00 2001 From: Karan-SF4772 Date: Thu, 16 Oct 2025 14:45:48 +0530 Subject: [PATCH 017/163] Updated Blazor md files in Presentation --- .../Convert-PowerPoint-to-Image-in-Blazor.md | 415 +++++++------ .../Blazor-WASM-Standalone-app-template.png | Bin 0 -> 11690 bytes .../Blazor-Web-app-template.png | Bin 0 -> 15007 bytes .../Blazor_WASM_Standalone.png | Bin 0 -> 96244 bytes ...mage_Server_Web_Additional_Information.png | Bin 0 -> 39258 bytes .../Blazor_image_Web_App.png | Bin 0 -> 74493 bytes .../Blazor_image_Web_ProjectName.png | Bin 0 -> 30159 bytes .../Convert-PowerPoint-to-PDF-in-Blazor.md | 391 +++++++------ .../Blazor-WASM-Standalone-app-template.png | Bin 0 -> 11690 bytes .../Blazor-Web-app-template.png | Bin 0 -> 15007 bytes .../Blazor_WASM_Standalone.png | Bin 0 -> 96244 bytes ...mage_Server_Web_Additional_Information.png | Bin 0 -> 39258 bytes .../Blazor_image_Web_App.png | Bin 0 -> 74493 bytes .../Blazor_image_Web_ProjectName.png | Bin 0 -> 30159 bytes ...-Save-PowerPoint-Presentation-in-Blazor.md | 206 +++++-- .../Blazor-WASM-Standalone-app-template.png | Bin 0 -> 11690 bytes .../Blazor-Web-app-template.png | Bin 0 -> 15007 bytes .../Blazor_WASM_Standalone.png | Bin 0 -> 96244 bytes ...mage_Server_Web_Additional_Information.png | Bin 0 -> 39258 bytes .../Blazor_image_Web_App.png | Bin 0 -> 74493 bytes .../Blazor_image_Web_ProjectName.png | Bin 0 -> 30159 bytes ...te-read-edit-powerpoint-files-in-blazor.md | 545 ++++++++++-------- 22 files changed, 926 insertions(+), 631 deletions(-) create mode 100644 Document-Processing/PowerPoint/Conversions/PowerPoint-To-Image/NET/Workingwith-Blazor/Blazor-WASM-Standalone-app-template.png create mode 100644 Document-Processing/PowerPoint/Conversions/PowerPoint-To-Image/NET/Workingwith-Blazor/Blazor-Web-app-template.png create mode 100644 Document-Processing/PowerPoint/Conversions/PowerPoint-To-Image/NET/Workingwith-Blazor/Blazor_WASM_Standalone.png create mode 100644 Document-Processing/PowerPoint/Conversions/PowerPoint-To-Image/NET/Workingwith-Blazor/Blazor_image_Server_Web_Additional_Information.png create mode 100644 Document-Processing/PowerPoint/Conversions/PowerPoint-To-Image/NET/Workingwith-Blazor/Blazor_image_Web_App.png create mode 100644 Document-Processing/PowerPoint/Conversions/PowerPoint-To-Image/NET/Workingwith-Blazor/Blazor_image_Web_ProjectName.png create mode 100644 Document-Processing/PowerPoint/Conversions/PowerPoint-To-PDF/NET/Workingwith-Blazor/Blazor-WASM-Standalone-app-template.png create mode 100644 Document-Processing/PowerPoint/Conversions/PowerPoint-To-PDF/NET/Workingwith-Blazor/Blazor-Web-app-template.png create mode 100644 Document-Processing/PowerPoint/Conversions/PowerPoint-To-PDF/NET/Workingwith-Blazor/Blazor_WASM_Standalone.png create mode 100644 Document-Processing/PowerPoint/Conversions/PowerPoint-To-PDF/NET/Workingwith-Blazor/Blazor_image_Server_Web_Additional_Information.png create mode 100644 Document-Processing/PowerPoint/Conversions/PowerPoint-To-PDF/NET/Workingwith-Blazor/Blazor_image_Web_App.png create mode 100644 Document-Processing/PowerPoint/Conversions/PowerPoint-To-PDF/NET/Workingwith-Blazor/Blazor_image_Web_ProjectName.png create mode 100644 Document-Processing/PowerPoint/PowerPoint-Library/NET/Workingwith-Blazor/Blazor-WASM-Standalone-app-template.png create mode 100644 Document-Processing/PowerPoint/PowerPoint-Library/NET/Workingwith-Blazor/Blazor-Web-app-template.png create mode 100644 Document-Processing/PowerPoint/PowerPoint-Library/NET/Workingwith-Blazor/Blazor_WASM_Standalone.png create mode 100644 Document-Processing/PowerPoint/PowerPoint-Library/NET/Workingwith-Blazor/Blazor_image_Server_Web_Additional_Information.png create mode 100644 Document-Processing/PowerPoint/PowerPoint-Library/NET/Workingwith-Blazor/Blazor_image_Web_App.png create mode 100644 Document-Processing/PowerPoint/PowerPoint-Library/NET/Workingwith-Blazor/Blazor_image_Web_ProjectName.png diff --git a/Document-Processing/PowerPoint/Conversions/PowerPoint-To-Image/NET/Convert-PowerPoint-to-Image-in-Blazor.md b/Document-Processing/PowerPoint/Conversions/PowerPoint-To-Image/NET/Convert-PowerPoint-to-Image-in-Blazor.md index f35930464..ba766e6f5 100644 --- a/Document-Processing/PowerPoint/Conversions/PowerPoint-To-Image/NET/Convert-PowerPoint-to-Image-in-Blazor.md +++ b/Document-Processing/PowerPoint/Conversions/PowerPoint-To-Image/NET/Convert-PowerPoint-to-Image-in-Blazor.md @@ -8,9 +8,9 @@ documentation: UG # Convert PowerPoint to Image in Blazor -Syncfusion® PowerPoint is a [.NET Core PowerPoint library](https://www.syncfusion.com/document-processing/powerpoint-framework/net-core) used to create, read, edit and convert PowerPoint presentation programmatically without **Microsoft PowerPoint** or interop dependencies. Using this library, you can **convert a PowerPoint to image in Blazor**. +Syncfusion® PowerPoint is a [.NET Core PowerPoint library](https://www.syncfusion.com/document-processing/powerpoint-framework/net-core) used to create, read, edit and convert PowerPoint presentation programmatically without **Microsoft PowerPoint** or interop dependencies. Using this library, a **convert a PowerPoint to image in Blazor**. -## Server app +## Blazor Web App Server Application {% tabcontents %} @@ -18,47 +18,61 @@ Syncfusion® PowerPoint is a [.NET Core PowerPoint library](https: **Prerequisites:** -* Visual Studio 2022. -* Install [.NET 8 SDK](https://dotnet.microsoft.com/en-us/download/dotnet/8.0) or later. +* Visual Studio 2022. +* Install [.NET 8 SDK](https://dotnet.microsoft.com/en-us/download/dotnet/8.0) or later. + +Step 1: Create a new C# Blazor Web app project. +* Select "Blazor Web App" from the template and click **Next**. + +![Create Blazor Web App application in Visual Studio](Workingwith-Blazor/Blazor_image_Web_App.png) -Step 1: Create a new C# Blazor Server app project. Select Blazor Server App from the template and click the Next button. +* Name the project and click **Next**. -![Create Blazor Server application in Visual Studio for Blazor PowerPoint presentation ](Workingwith-Blazor/Create_project.png) +![Name the Blazor Web App in Visual Studio](Workingwith-Blazor/Blazor_image_Web_ProjectName.png) -Step 2: Install the [Syncfusion.PresentationRenderer.Net.Core](https://www.nuget.org/packages/Syncfusion.PresentationRenderer.Net.Core) NuGet package as reference to your project from [NuGet.org](https://www.nuget.org/). +* Select the framework and click **Create** button. + +![Select the framework in Blazor Web App Server in Visual Studio](Workingwith-Blazor/Blazor_image_Server_Web_Additional_Information.png) + +Step 2: Install the `Syncfusion.PresentationRenderer.Net.Core` NuGet package. +To convert a **PowerPoint presentation to Image in a Web App Server**, Install the [Syncfusion.PresentationRenderer.Net.Core](https://www.nuget.org/packages/Syncfusion.PresentationRenderer.Net.Core) NuGet package as reference to the project from [NuGet.org](https://www.nuget.org/). ![Install Syncfusion.PresentationRenderer.Net.Core Nuget Package](Azure-Images/App-Service-Linux/Nuget_Package_PowerPoint_Presentation_to_PDF.png) -N> 1. If you're deploying the application in a Linux environment, refer to the [documentation](https://help.syncfusion.com/document-processing/powerpoint/conversions/powerpoint-to-image/net/nuget-packages-required-for-pptxtoimage-conversion#additional-nuget-packages-required-for-linux) for the required additional NuGet packages. -N> 2. Starting with v16.2.0.x, if you reference Syncfusion® assemblies from trial setup or from the NuGet feed, you also have to add "Syncfusion.Licensing" assembly reference and include a license key in your projects. Please refer to this [link](https://help.syncfusion.com/common/essential-studio/licensing/overview) to know about registering Syncfusion® license key in your application to use our components. +N> 1. If deploying the application in a Linux environment, refer to the [documentation](https://help.syncfusion.com/document-processing/powerpoint/conversions/powerpoint-to-image/net/nuget-packages-required-for-pptxtoimage-conversion#additional-nuget-packages-required-for-linux) for the required additional NuGet packages. +N> 2. Starting with v16.2.0.x, if Syncfusion® assemblies are referenced from trial setup or from the NuGet feed, the "Syncfusion.Licensing" assembly reference must also be added and a license key included in projects. Please refer to this [link](https://help.syncfusion.com/common/essential-studio/licensing/overview) to know about registering Syncfusion® license key in an application to use Syncfusion components. -Step 3: Create a razor file with name as **Presentation** under **Pages** folder and include the following namespaces in the file. +Step 3: Create a Razor file named `Presentation.razor` in the `Pages` folder, which is located inside the `Components` folder. +Add the following namespaces in the file. {% tabs %} {% highlight c# tabtitle="C#" %} -@page "/presentation" +@rendermode InteractiveServer +@page "/Presentation" @using System.IO; @using Convert_PowerPoint_Presentation_to_Image; -@inject Convert_PowerPoint_Presentation_to_Image.Data.PresentationService service +@inject Convert_PowerPoint_Presentation_to_Image.Data.PowerPointService service @inject Microsoft.JSInterop.IJSRuntime JS {% endhighlight %} {% endtabs %} -Step 4: Add the following code to create a new button. +Step 4: Add a button to `Presentation.razor`. +Include the following code to create a new button that triggers the PowerPoint to Image conversion: {% tabs %} {% highlight CSHTML %} -

    Syncfusion PowerPoint (Presentation) library

    -

    Syncfusion PowerPoint (Presentation) library is used to create, read, edit, and convert PowerPoint files in your applications without Microsoft Office dependencies.

    +

    Syncfusion PowerPoint (Presentation) Library

    +

    The Syncfusion PowerPoint (Presentation) library is used to create, read, edit, and convert PowerPoint files in applications without Microsoft Office dependencies.

    {% endhighlight %} {% endtabs %} -Step 5: Add the following code in **Presentation.razor** file to **convert PowerPoint to image** and download the **image file**. +Step 5: Implement the method in `Presentation.razor`. +Add the following code to **convert PowerPoint to Image** and download the **image file**. {% tabs %} {% highlight c# tabtitle="C#" %} @@ -78,7 +92,8 @@ Step 5: Add the following code in **Presentation.razor** file to **convert Power {% endhighlight %} {% endtabs %} -Step 6: Create a new cs file with name as **PowerPointService** under Data folder and include the following namespaces in the file. +Step 6: Create a new cs file `PowerPointService` in the `Data` folder. +Include the following namespaces in the file. {% tabs %} {% highlight c# tabtitle="C#" %} @@ -89,27 +104,28 @@ using Syncfusion.PresentationRenderer; {% endhighlight %} {% endtabs %} -Step 7: Create a new MemoryStream method with name as **ConvertPPTXToImage** in **PowerPointService** class and include the following code snippet to **convert a PowerPoint to image in Blazor Server app**. +Step 7: Implement the method in `PowerPointService.cs`. +Create a new `MemoryStream` method in the `PowerPointService` and include the following code snippet to **convert a PowerPoint to Image in Blazor Web App Server**. {% tabs %} {% highlight c# tabtitle="C#" %} -//Open the file as Stream. +// Open the file as Stream. using (FileStream sourceStreamPath = new FileStream(@"wwwroot/Input.pptx", FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { - //Open the existing PowerPoint presentation with loaded stream. + // Open the existing PowerPoint presentation with loaded stream. using (IPresentation pptxDoc = Presentation.Open(sourceStreamPath)) { - //Initialize the PresentationRenderer to perform image conversion. + // Initialize the PresentationRenderer to perform image conversion. pptxDoc.PresentationRenderer = new PresentationRenderer(); - //Convert PowerPoint slide to image as stream. + // Convert PowerPoint slide to image as stream. using (Stream stream = pptxDoc.Slides[0].ConvertToImage(ExportImageFormat.Jpeg)) { - //Save the converted image file to MemoryStream. + // Save the converted image file to MemoryStream. MemoryStream Stream = new MemoryStream(); stream.CopyTo(Stream); Stream.Position = 0; - //Download image file in the browser. + // Download image file in the browser. return Stream; } } @@ -118,17 +134,19 @@ using (FileStream sourceStreamPath = new FileStream(@"wwwroot/Input.pptx", FileM {% endhighlight %} {% endtabs %} -Step 8: Add the following line to the Program.cs file to register the PresentationService as a scoped service in your Blazor application. +Step 8: Add the service in `Program.cs`. +Add the following line to the `Program.cs` file to register `PowerPointService` as a scoped service in the Blazor application. {% tabs %} {% highlight c# tabtitle="C#" %} -builder.Services.AddSingleton(); +builder.Services.AddScoped(); {% endhighlight %} {% endtabs %} -Step 9: Create a new class file in the project, with name as FileUtils and add the following code to invoke the JavaScript action to download the file in the browser. +Step 9: Create `FileUtils.cs` for JavaScript interoperability. +Create a new class file named `FileUtils` in the project and add the following code to invoke the JavaScript action for file download in the browser. {% tabs %} {% highlight c# tabtitle="C#" %} @@ -145,7 +163,8 @@ public static class FileUtils {% endhighlight %} {% endtabs %} -Step 10: Add the following JavaScript function in the **_Host.cshtml** in the Pages folder. +Step 10: Add the following JavaScript function to `App.razor`. +Add this function in the `App.razor` file located in the `Pages` folder. {% tabs %} {% highlight HTML %} @@ -155,7 +174,7 @@ Step 10: Add the following JavaScript function in the **_Host.cshtml** in the Pa { if (navigator.msSaveBlob) { - //Download document in Edge browser + // Download document in Edge browser var data = window.atob(bytesBase64); var bytes = new Uint8Array(data.length); for (var i = 0; i < data.length; i++) { @@ -179,17 +198,18 @@ Step 10: Add the following JavaScript function in the **_Host.cshtml** in the Pa {% endhighlight %} {% endtabs %} -Step 11: Add the following code snippet in the razor file of Navigation menu in the Shared folder. +Step 11: Add the navigation link. +Add the following code snippet to the Navigation menu's Razor file in the `Layout` folder. {% tabs %} {% highlight HTML %} - + {% endhighlight %} @@ -197,17 +217,17 @@ Step 11: Add the following code snippet in the razor file of Navigation menu in Step 12: Build the project. -Click on Build → Build Solution or press Ctrl+Shift+B to build the project. +Click on **Build** → **Build Solution** or press Ctrl+Shift+B to build the project. Step 13: Run the project. Click the Start button (green arrow) or press F5 to run the app. -You can download a complete working sample from [GitHub](https://github.com/SyncfusionExamples/PowerPoint-Examples/tree/master/PPTX-to-Image-conversion/Convert-PowerPoint-presentation-to-Image/Blazor/Server-app). +A complete working sample is available on [GitHub](https://github.com/SyncfusionExamples/PowerPoint-Examples/tree/master/PPTX-to-Image-conversion/Convert-PowerPoint-presentation-to-Image/Blazor/Web-Server-App). -By executing the program, you will get the **image** as follows. +Upon executing the program, the **Image** will be generated as follows. -![PowerPoint to Image in Blazor server app](PPTXtoPDF_images/Output_PowerPoint_Presentation_to-Image.png) +![PowerPoint to Image in Blazor Web App Server](PPTXtoPDF_images/Output_PowerPoint_Presentation_to-Image.png) {% endtabcontent %} @@ -219,52 +239,56 @@ By executing the program, you will get the **image** as follows. * Install [.NET 8 SDK](https://dotnet.microsoft.com/en-us/download/dotnet/8.0) or later. * Open Visual Studio Code and install the [C# for Visual Studio Code extension](https://marketplace.visualstudio.com/items?itemName=ms-dotnettools.csharp) from the Extensions Marketplace. -Step 1: Create a new C# Blazor Server app project. +Step 1: Create a new C# Blazor Web app project. * Open the command palette by pressing Ctrl+Shift+P and type **.NET:New Project** and enter. -* Choose the **Blazor Server App** template. +* Choose the **Blazor Web App** template. -![Choose Blazor Server app from template](Workingwith-Blazor/Blazor-server-app-template.png) +![Choose Blazor Server app from template](Workingwith-Blazor/Blazor-Web-app-template.png) * Select the project location, type the project name and press enter. * Then choose **Create project**. -Step 2: To **convert a PowerPoint to image in server app**, install [Syncfusion.PresentationRenderer.Net.Core](https://www.nuget.org/packages/Syncfusion.PresentationRenderer.Net.Core) to the Blazor project. +Step 2: To **convert a PowerPoint to image in Web App server**, install [Syncfusion.PresentationRenderer.Net.Core](https://www.nuget.org/packages/Syncfusion.PresentationRenderer.Net.Core) to the Blazor project. * Press Ctrl + ` (backtick) to open the integrated terminal in Visual Studio Code. * Ensure you're in the project root directory where your .csproj file is located. * Run the command `dotnet add package Syncfusion.PresentationRenderer.Net.Core` to install the NuGet package. ![Add Syncfusion.PresentationRenderer.Net.Core NuGet package](Workingwith-Blazor/Command-to-add-NuGet-package-for-Server.png) -N> 1. If you're deploying the application in a Linux environment, refer to the [documentation](https://help.syncfusion.com/document-processing/powerpoint/conversions/powerpoint-to-image/net/nuget-packages-required-for-pptxtoimage-conversion#additional-nuget-packages-required-for-linux) for the required additional NuGet packages. -N> 2. Starting with v16.2.0.x, if you reference Syncfusion® assemblies from trial setup or from the NuGet feed, you also have to add "Syncfusion.Licensing" assembly reference and include a license key in your projects. Please refer to this [link](https://help.syncfusion.com/common/essential-studio/licensing/overview) to know about registering Syncfusion® license key in your application to use our components. +N> 1. If deploying the application in a Linux environment, refer to the [documentation](https://help.syncfusion.com/document-processing/powerpoint/conversions/powerpoint-to-image/net/nuget-packages-required-for-pptxtoimage-conversion#additional-nuget-packages-required-for-linux) for the required additional NuGet packages. +N> 2. Starting with v16.2.0.x, if Syncfusion® assemblies are referenced from trial setup or from the NuGet feed, the "Syncfusion.Licensing" assembly reference must also be added and a license key included in projects. Please refer to this [link](https://help.syncfusion.com/common/essential-studio/licensing/overview) to know about registering Syncfusion® license key in an application to use Syncfusion components. -Step 3: Create a razor file with name as **Presentation** under **Pages** folder and include the following namespaces in the file. +Step 3: Create a Razor file named `Presentation.razor` in the `Pages` folder, which is located inside the `Components` folder. +Add the following namespaces in the file. {% tabs %} {% highlight c# tabtitle="C#" %} -@page "/presentation" +@rendermode InteractiveServer +@page "/Presentation" @using System.IO; @using Convert_PowerPoint_Presentation_to_Image; -@inject Convert_PowerPoint_Presentation_to_Image.Data.PresentationService service +@inject Convert_PowerPoint_Presentation_to_Image.Data.PowerPointService service @inject Microsoft.JSInterop.IJSRuntime JS {% endhighlight %} {% endtabs %} -Step 4: Add the following code to create a new button. +Step 4: Add a button to `Presentation.razor`. +Include the following code to create a new button that triggers the PowerPoint to Image conversion: {% tabs %} {% highlight CSHTML %} -

    Syncfusion PowerPoint (Presentation) library

    -

    Syncfusion PowerPoint (Presentation) library is used to create, read, edit, and convert PowerPoint files in your applications without Microsoft Office dependencies.

    +

    Syncfusion PowerPoint (Presentation) Library

    +

    The Syncfusion PowerPoint (Presentation) library is used to create, read, edit, and convert PowerPoint files in applications without Microsoft Office dependencies.

    {% endhighlight %} {% endtabs %} -Step 5: Add the following code in **Presentation.razor** file to **convert PowerPoint to image** and download the **image file**. +Step 5: Implement the method in `Presentation.razor`. +Add the following code to **convert PowerPoint to Image** and download the **image file**. {% tabs %} {% highlight c# tabtitle="C#" %} @@ -284,7 +308,8 @@ Step 5: Add the following code in **Presentation.razor** file to **convert Power {% endhighlight %} {% endtabs %} -Step 6: Create a new cs file with name as **PowerPointService** under Data folder and include the following namespaces in the file. +Step 6: Create a new cs file `PowerPointService` in the `Data` folder. +Include the following namespaces in the file. {% tabs %} {% highlight c# tabtitle="C#" %} @@ -295,27 +320,28 @@ using Syncfusion.PresentationRenderer; {% endhighlight %} {% endtabs %} -Step 7: Create a new MemoryStream method with name as **ConvertPPTXToImage** in **PowerPointService** class and include the following code snippet to **convert a PowerPoint to image in Blazor Server app**. +Step 7: Implement the method in `PowerPointService.cs`. +Create a new `MemoryStream` method in the `PowerPointService` and include the following code snippet to **convert a PowerPoint to Image in Blazor Web App Server**. {% tabs %} {% highlight c# tabtitle="C#" %} -//Open the file as Stream. +// Open the file as Stream. using (FileStream sourceStreamPath = new FileStream(@"wwwroot/Input.pptx", FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { - //Open the existing PowerPoint presentation with loaded stream. + // Open the existing PowerPoint presentation with loaded stream. using (IPresentation pptxDoc = Presentation.Open(sourceStreamPath)) { - //Initialize the PresentationRenderer to perform image conversion. + // Initialize the PresentationRenderer to perform image conversion. pptxDoc.PresentationRenderer = new PresentationRenderer(); - //Convert PowerPoint slide to image as stream. + // Convert PowerPoint slide to image as stream. using (Stream stream = pptxDoc.Slides[0].ConvertToImage(ExportImageFormat.Jpeg)) { - //Save the converted image file to MemoryStream. + // Save the converted image file to MemoryStream. MemoryStream Stream = new MemoryStream(); stream.CopyTo(Stream); Stream.Position = 0; - //Download image file in the browser. + // Download image file in the browser. return Stream; } } @@ -324,17 +350,19 @@ using (FileStream sourceStreamPath = new FileStream(@"wwwroot/Input.pptx", FileM {% endhighlight %} {% endtabs %} -Step 8: Add the following line to the Program.cs file to register the PresentationService as a scoped service in your Blazor application. +Step 8: Add the service in `Program.cs`. +Add the following line to the `Program.cs` file to register `PowerPointService` as a scoped service in the Blazor application. {% tabs %} {% highlight c# tabtitle="C#" %} -builder.Services.AddSingleton(); +builder.Services.AddScoped(); {% endhighlight %} {% endtabs %} -Step 9: Create a new class file in the project, with name as FileUtils and add the following code to invoke the JavaScript action to download the file in the browser. +Step 9: Create `FileUtils.cs` for JavaScript interoperability. +Create a new class file named `FileUtils` in the project and add the following code to invoke the JavaScript action for file download in the browser. {% tabs %} {% highlight c# tabtitle="C#" %} @@ -351,7 +379,8 @@ public static class FileUtils {% endhighlight %} {% endtabs %} -Step 10: Add the following JavaScript function in the **_Host.cshtml** in the Pages folder. +Step 10: Add the following JavaScript function to `App.razor`. +Add this function in the `App.razor` file located in the `Pages` folder. {% tabs %} {% highlight HTML %} @@ -361,7 +390,7 @@ Step 10: Add the following JavaScript function in the **_Host.cshtml** in the Pa { if (navigator.msSaveBlob) { - //Download document in Edge browser + // Download document in Edge browser var data = window.atob(bytesBase64); var bytes = new Uint8Array(data.length); for (var i = 0; i < data.length; i++) { @@ -385,17 +414,18 @@ Step 10: Add the following JavaScript function in the **_Host.cshtml** in the Pa {% endhighlight %} {% endtabs %} -Step 11: Add the following code snippet in the razor file of Navigation menu in the Shared folder. +Step 11: Add the navigation link. +Add the following code snippet to the Navigation menu's Razor file in the `Layout` folder. {% tabs %} {% highlight HTML %} - + {% endhighlight %} @@ -417,11 +447,11 @@ Run the following command in terminal to run the project. dotnet run ``` -You can download a complete working sample from [GitHub](https://github.com/SyncfusionExamples/PowerPoint-Examples/tree/master/PPTX-to-Image-conversion/Convert-PowerPoint-presentation-to-Image/Blazor/Server-app). +A complete working sample is available on [GitHub](https://github.com/SyncfusionExamples/PowerPoint-Examples/tree/master/PPTX-to-Image-conversion/Convert-PowerPoint-presentation-to-Image/Blazor/Web-Server-App). -By executing the program, you will get the **image** as follows. +Upon executing the program, the **Image** will be generated as follows. -![PowerPoint to Image in Blazor server app](PPTXtoPDF_images/Output_PowerPoint_Presentation_to-Image.png) +![PowerPoint to Image in Blazor Web App Server](PPTXtoPDF_images/Output_PowerPoint_Presentation_to-Image.png) {% endtabcontent %} @@ -432,7 +462,7 @@ By executing the program, you will get the **image** as follows. * JetBrains Rider. * Install .NET 8 SDK or later. -Step 1. Open JetBrains Rider and create a new Blazor Server app project. +Step 1. Open JetBrains Rider and create a new Blazor Web app project. * Launch JetBrains Rider. * Click new solution on the welcome screen. @@ -458,36 +488,40 @@ Step 2: Install the NuGet package from [NuGet.org](https://www.nuget.org/). ![Install the Syncfusion.PresentationRenderer.Net.Core NuGet package](Workingwith-Blazor/Install-Syncfusion.PresentationRenderer.Net.Core-NuGet.png) -N> 1. If you're deploying the application in a Linux environment, refer to the [documentation](https://help.syncfusion.com/document-processing/powerpoint/conversions/powerpoint-to-image/net/nuget-packages-required-for-pptxtoimage-conversion#additional-nuget-packages-required-for-linux) for the required additional NuGet packages. -N> 2. Starting with v16.2.0.x, if you reference Syncfusion assemblies from trial setup or from the NuGet feed, you also have to add "Syncfusion.Licensing" assembly reference and include a license key in your projects. Please refer to this [link](https://help.syncfusion.com/common/essential-studio/licensing/overview) to know about registering Syncfusion license key in your application to use our components. +N> 1. If deploying the application in a Linux environment, refer to the [documentation](https://help.syncfusion.com/document-processing/powerpoint/conversions/powerpoint-to-image/net/nuget-packages-required-for-pptxtoimage-conversion#additional-nuget-packages-required-for-linux) for the required additional NuGet packages. +N> 2. Starting with v16.2.0.x, if Syncfusion® assemblies are referenced from trial setup or from the NuGet feed, the "Syncfusion.Licensing" assembly reference must also be added and a license key included in projects. Please refer to this [link](https://help.syncfusion.com/common/essential-studio/licensing/overview) to know about registering Syncfusion® license key in an application to use Syncfusion components. -Step 3: Create a razor file with name as **Presentation** under **Pages** folder and include the following namespaces in the file. +Step 3: Create a Razor file named `Presentation.razor` in the `Pages` folder, which is located inside the `Components` folder. +Add the following namespaces in the file. {% tabs %} {% highlight c# tabtitle="C#" %} -@page "/presentation" +@rendermode InteractiveServer +@page "/Presentation" @using System.IO; @using Convert_PowerPoint_Presentation_to_Image; -@inject Convert_PowerPoint_Presentation_to_Image.Data.PresentationService service +@inject Convert_PowerPoint_Presentation_to_Image.Data.PowerPointService service @inject Microsoft.JSInterop.IJSRuntime JS {% endhighlight %} {% endtabs %} -Step 4: Add the following code to create a new button. +Step 4: Add a button to `Presentation.razor`. +Include the following code to create a new button that triggers the PowerPoint to Image conversion: {% tabs %} {% highlight CSHTML %} -

    Syncfusion PowerPoint (Presentation) library

    -

    Syncfusion PowerPoint (Presentation) library is used to create, read, edit, and convert PowerPoint files in your applications without Microsoft Office dependencies.

    +

    Syncfusion PowerPoint (Presentation) Library

    +

    The Syncfusion PowerPoint (Presentation) library is used to create, read, edit, and convert PowerPoint files in applications without Microsoft Office dependencies.

    {% endhighlight %} {% endtabs %} -Step 5: Add the following code in **Presentation.razor** file to **convert PowerPoint to image** and download the **image file**. +Step 5: Implement the method in `Presentation.razor`. +Add the following code to **convert PowerPoint to Image** and download the **image file**. {% tabs %} {% highlight c# tabtitle="C#" %} @@ -507,7 +541,8 @@ Step 5: Add the following code in **Presentation.razor** file to **convert Power {% endhighlight %} {% endtabs %} -Step 6: Create a new cs file with name as **PowerPointService** under Data folder and include the following namespaces in the file. +Step 6: Create a new cs file `PowerPointService` in the `Data` folder. +Include the following namespaces in the file. {% tabs %} {% highlight c# tabtitle="C#" %} @@ -518,27 +553,28 @@ using Syncfusion.PresentationRenderer; {% endhighlight %} {% endtabs %} -Step 7: Create a new MemoryStream method with name as **ConvertPPTXToImage** in **PowerPointService** class and include the following code snippet to **convert a PowerPoint to image in Blazor Server app**. +Step 7: Implement the method in `PowerPointService.cs`. +Create a new `MemoryStream` method in the `PowerPointService` and include the following code snippet to **convert a PowerPoint to Image in Blazor Web App Server**. {% tabs %} {% highlight c# tabtitle="C#" %} -//Open the file as Stream. +// Open the file as Stream. using (FileStream sourceStreamPath = new FileStream(@"wwwroot/Input.pptx", FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { - //Open the existing PowerPoint presentation with loaded stream. + // Open the existing PowerPoint presentation with loaded stream. using (IPresentation pptxDoc = Presentation.Open(sourceStreamPath)) { - //Initialize the PresentationRenderer to perform image conversion. + // Initialize the PresentationRenderer to perform image conversion. pptxDoc.PresentationRenderer = new PresentationRenderer(); - //Convert PowerPoint slide to image as stream. + // Convert PowerPoint slide to image as stream. using (Stream stream = pptxDoc.Slides[0].ConvertToImage(ExportImageFormat.Jpeg)) { - //Save the converted image file to MemoryStream. + // Save the converted image file to MemoryStream. MemoryStream Stream = new MemoryStream(); stream.CopyTo(Stream); Stream.Position = 0; - //Download image file in the browser. + // Download image file in the browser. return Stream; } } @@ -547,17 +583,19 @@ using (FileStream sourceStreamPath = new FileStream(@"wwwroot/Input.pptx", FileM {% endhighlight %} {% endtabs %} -Step 8: Add the following line to the Program.cs file to register the PresentationService as a scoped service in your Blazor application. +Step 8: Add the service in `Program.cs`. +Add the following line to the `Program.cs` file to register `PowerPointService` as a scoped service in the Blazor application. {% tabs %} {% highlight c# tabtitle="C#" %} -builder.Services.AddSingleton(); +builder.Services.AddScoped(); {% endhighlight %} {% endtabs %} -Step 9: Create a new class file in the project, with name as FileUtils and add the following code to invoke the JavaScript action to download the file in the browser. +Step 9: Create `FileUtils.cs` for JavaScript interoperability. +Create a new class file named `FileUtils` in the project and add the following code to invoke the JavaScript action for file download in the browser. {% tabs %} {% highlight c# tabtitle="C#" %} @@ -574,7 +612,8 @@ public static class FileUtils {% endhighlight %} {% endtabs %} -Step 10: Add the following JavaScript function in the **_Host.cshtml** in the Pages folder. +Step 10: Add the following JavaScript function to `App.razor`. +Add this function in the `App.razor` file located in the `Pages` folder. {% tabs %} {% highlight HTML %} @@ -584,7 +623,7 @@ Step 10: Add the following JavaScript function in the **_Host.cshtml** in the Pa { if (navigator.msSaveBlob) { - //Download document in Edge browser + // Download document in Edge browser var data = window.atob(bytesBase64); var bytes = new Uint8Array(data.length); for (var i = 0; i < data.length; i++) { @@ -608,17 +647,18 @@ Step 10: Add the following JavaScript function in the **_Host.cshtml** in the Pa {% endhighlight %} {% endtabs %} -Step 11: Add the following code snippet in the razor file of Navigation menu in the Shared folder. +Step 11: Add the navigation link. +Add the following code snippet to the Navigation menu's Razor file in the `Layout` folder. {% tabs %} {% highlight HTML %} - + {% endhighlight %} @@ -632,11 +672,13 @@ Step 13: Run the project. Click the **Run** button (green arrow) in the toolbar or press F5 to run the app. -You can download a complete working sample from [GitHub](https://github.com/SyncfusionExamples/PowerPoint-Examples/tree/master/PPTX-to-Image-conversion/Convert-PowerPoint-presentation-to-Image/Blazor/Server-app). +Click the Start button (green arrow) or press F5 to run the app. + +A complete working sample is available on [GitHub](https://github.com/SyncfusionExamples/PowerPoint-Examples/tree/master/PPTX-to-Image-conversion/Convert-PowerPoint-presentation-to-Image/Blazor/Web-Server-App). -By executing the program, you will get the **image** as follows. +Upon executing the program, the **Image** will be generated as follows. -![PowerPoint to Image in Blazor server app](PPTXtoPDF_images/Output_PowerPoint_Presentation_to-Image.png) +![PowerPoint to Image in Blazor Web App Server](PPTXtoPDF_images/Output_PowerPoint_Presentation_to-Image.png) {% endtabcontent %} @@ -644,9 +686,9 @@ By executing the program, you will get the **image** as follows. Click [here](https://www.syncfusion.com/document-processing/powerpoint-framework/blazor) to explore the rich set of Syncfusion® PowerPoint Library (Presentation) features. -An online sample link to [convert PowerPoint Presentation to image](https://document.syncfusion.com/demos/powerpoint/pptxtoimage#/tailwind) in ASP.NET Core. +An online sample link to [convert PowerPoint Presentation to image](https://document.syncfusion.com/demos/powerpoint/pptxtoimage#/tailwind) in ASP.NET Core. -## WASM app +## WASM Standalone Application {% tabcontents %} @@ -654,27 +696,33 @@ An online sample link to [convert PowerPoint Presentation to image](https://docu **Prerequisites:** -* Visual Studio 2022. -* Install [.NET 8 SDK](https://dotnet.microsoft.com/en-us/download/dotnet/8.0) or later. +* Visual Studio 2022. +* Install [.NET 8 SDK](https://dotnet.microsoft.com/en-us/download/dotnet/8.0) or later. -Step 1: Create a new C# Blazor WASM app project. Select Blazor WebAssembly App from the template and click the Next button. +Step 1: Create a new C# Blazor WASM Standalone app project. +Select "Blazor WebAssembly Standalone App" from the template and click the Next button. -![Create Blazor WebAssembly application in Visual Studio for Blazor PowerPoint presentation](Workingwith-Blazor/Blazor_WASM.png) +![Create Blazor WebAssembly application in Visual Studio for Blazor PowerPoint presentation](Workingwith-Blazor/Blazor_WASM_Standalone.png) -Step 2: Install the following **Nuget packages** in your application from [Nuget.org](https://www.nuget.org/). +Step 2: Install the following **Nuget packages** in the application from [Nuget.org](https://www.nuget.org/). -* [Syncfusion.PresentationRenderer.Net.Core](https://www.nuget.org/packages/Syncfusion.PresentationRenderer.Net.Core) -* [SkiaSharp.Views.Blazor v3.116.1](https://www.nuget.org/packages/SkiaSharp.Views.Blazor/3.116.1) +* [Syncfusion.PresentationRenderer.Net.Core](https://www.nuget.org/packages/Syncfusion.PresentationRenderer.Net.Core) +* [SkiaSharp.Views.Blazor v3.116.1](https://www.nuget.org/packages/SkiaSharp.Views.Blazor/3.116.1) ![Install Syncfusion.PresentationRenderer.Net.Core Nuget Package](Azure-Images/App-Service-Linux/Nuget_Package_PowerPoint_Presentation_to_PDF.png) ![Install SkiaSharp.Views.Blazor v3.116.1 Nuget Package](Workingwith-Blazor/NuGet_package_PPTXtoPDF.png) -N> 1. If you're deploying the application in a Linux environment, refer to the [documentation](https://help.syncfusion.com/document-processing/powerpoint/conversions/powerpoint-to-image/net/nuget-packages-required-for-pptxtoimage-conversion#additional-nuget-packages-required-for-linux) for the required additional NuGet packages. -N> 2. Starting with v16.2.0.x, if you reference Syncfusion® assemblies from trial setup or from the NuGet feed, you also have to add "Syncfusion.Licensing" assembly reference and include a license key in your projects. Please refer to this [link](https://help.syncfusion.com/common/essential-studio/licensing/overview) to know about registering Syncfusion® license key in your application to use our components. -N> 3. Install this wasm-tools and wasm-tools-net6 by using the "dotnet workload install wasm-tools" and "dotnet workload install wasm-tools-net6" commands in your command prompt respectively if you are facing issues related to Skiasharp during runtime. After installing wasm tools using the above commands, please restart your machine. +N> 1. If deploying the application in a Linux environment, refer to the [documentation](https://help.syncfusion.com/document-processing/powerpoint/conversions/powerpoint-to-image/net/nuget-packages-required-for-pptxtoimage-conversion#additional-nuget-packages-required-for-linux) for the required additional NuGet packages. +N> 2. Starting with v16.2.0.x, if Syncfusion® assemblies are referenced from trial setup or from the NuGet feed, the "Syncfusion.Licensing" assembly reference must also be added and a license key included in projects. Please refer to this [link](https://help.syncfusion.com/common/essential-studio/licensing/overview) to know about registering Syncfusion® license key in an application to use Syncfusion components. +N> 3. If you face issues related to SkiaSharp during runtime, install the necessary WebAssembly tools by running the following commands in the terminal: +N> ``` +N> dotnet workload install wasm-tools +N> ``` +N> After completing the installation, restart Visual Studio Code to ensure proper integration of the tools. -Step 3: Create a razor file with name as ``Presentation`` under ``Pages`` folder and add the following namespaces in the file. +Step 3: Create a Razor file named `Presentation.razor` in the `Pages` folder. +Add the following namespaces in the file. {% tabs %} {% highlight c# tabtitle="C#" %} @@ -689,19 +737,21 @@ Step 3: Create a razor file with name as ``Presentation`` under ``Pages`` folder {% endhighlight %} {% endtabs %} -Step 4: Add the following code to create a new button. +Step 4: Add a button to `Presentation.razor`. +Include the following code to create a new button that triggers the PowerPoint to Image conversion: {% tabs %} {% highlight CSHTML %} -

    Syncfusion PowerPoint library (Essential Presentation)

    -

    Syncfusion Blazor PowerPoint library (Essential Presentation) used to create, read, edit, and convert PowerPoint files in your applications without Microsoft Office dependencies.

    +

    Syncfusion PowerPoint Library (Essential Presentation)

    +

    The Syncfusion Blazor PowerPoint library (Essential Presentation) used to create, read, edit, and convert PowerPoint files in applications without Microsoft Office dependencies.

    {% endhighlight %} {% endtabs %} -Step 5: Create a new async method with name as ``PPTXToImage`` and include the following code snippet to **convert a PowerPoint to image in Blazor WASM app**. +Step 5: Implement `PPTXToImage` method in `Presentation.razor`. +Create a new `async` method named `PPTXToImage` and include the following code snippet to **convert a PowerPoint to image in Blazor WASM Standalone app**. {% tabs %} {% highlight c# tabtitle="C#" %} @@ -728,7 +778,8 @@ using (Stream inputStream = await client.GetStreamAsync("sample-data/Input.pptx" {% endhighlight %} {% endtabs %} -Step 6: To download the PowerPoint presentation in browser, create a class file with FileUtils name and add the following code to invoke the JavaScript action to download the file in the browser. +Step 6: Create `FileUtils.cs` for JavaScript interoperability. +Create a new class file named `FileUtils` in the project and add the following code to invoke the JavaScript action for file download in the browser. {% tabs %} {% highlight c# tabtitle="C#" %} @@ -745,7 +796,8 @@ public static class FileUtils {% endhighlight %} {% endtabs %} -Step 7: Add the following JavaScript function in the **Index.html** file present under ``wwwroot``. +Step 7: Add the following JavaScript function to `index.html`. +Add this function in the `index.html` file located in `wwwroot`. {% tabs %} {% highlight HTML %} @@ -776,17 +828,18 @@ Step 7: Add the following JavaScript function in the **Index.html** file present {% endhighlight %} {% endtabs %} -Step 8: Add the following code snippet in the razor file of Navigation menu in the Shared folder. +Step 8: Add the navigation link. +Add the following code snippet to the Navigation menu's Razor file in the `Layout` folder. {% tabs %} {% highlight HTML %} - + {% endhighlight %} @@ -794,22 +847,21 @@ Step 8: Add the following code snippet in the razor file of Navigation menu in t Step 9: Build the project. -Click on Build → Build Solution or press Ctrl+Shift+B to build the project. +Click on **Build** → **Build Solution** or press Ctrl+Shift+B to build the project. Step 10: Run the project. -Click the Start button (green arrow) or press F5 to run the app. +Click the Start button (green arrow) or press F5 to run the application. -You can download a complete working sample from [GitHub](https://github.com/SyncfusionExamples/PowerPoint-Examples/tree/master/PPTX-to-Image-conversion/Convert-PowerPoint-presentation-to-Image/Blazor/WASM-app). +A complete working sample is available on [GitHub](https://github.com/SyncfusionExamples/PowerPoint-Examples/tree/master/PPTX-to-Image-conversion/Convert-PowerPoint-presentation-to-Image/Blazor/WASM-Standalone-app). -By executing the program, you will get the **image** as follows. +Upon executing the program, the **image** will be generated as follows. ![PowerPoint to Image in Blazor WASM app](PPTXtoPDF_images/Output_PowerPoint_Presentation_to-Image.png) -N> Even though PowerPoint library works in WASM app, it is recommended to use server deployment. Since the WASM app deployment increases the application payload size. +N> To convert PPTX to Image, it is necessary to access the font stream internally. However, this cannot be done automatically in a Blazor WASM Standalone application. Therefore, it is recommended to use a Web app Server, even though PPTX to Image conversion works in a WASM Standalone app. -{% endtabcontent %} - +{% endtabcontent %} {% tabcontent Visual Studio Code %} @@ -819,16 +871,16 @@ N> Even though PowerPoint library works in WASM app, it is recommended to use se * Install [.NET 8 SDK](https://dotnet.microsoft.com/en-us/download/dotnet/8.0) or later. * Open Visual Studio Code and install the [C# for Visual Studio Code extension](https://marketplace.visualstudio.com/items?itemName=ms-dotnettools.csharp) from the Extensions Marketplace. -Step 1: Create a new C# Blazor WASM app project. +Step 1: Create a new C# Blazor WASM Standalone app project. * Open the command palette by pressing Ctrl+Shift+P and type **.NET:New Project** and enter. -* Choose the **Blazor WebAssembly App** template. +* Choose the **Blazor WebAssembly Standalone App** template. -![Choose Blazor Web app from template](Workingwith-Blazor/Blazor-WASM-app-template.png) +![Choose Blazor Web app from template](Workingwith-Blazor/Blazor-WASM-Standalone-app-template.png) * Select the project location, type the project name and press enter. * Then choose **Create project**. -Step 2: To **convert a PowerPoint to Image in Blazor WASM app**, install [Syncfusion.PresentationRenderer.Net.Core](https://www.nuget.org/packages/Syncfusion.PresentationRenderer.Net.Core) and [SkiaSharp.Views.Blazor v3.116.1](https://www.nuget.org/packages/SkiaSharp.Views.Blazor/3.116.1) to the Blazor project. +Step 2: To **convert a PowerPoint to Image in Blazor WASM Standalone app**, install [Syncfusion.PresentationRenderer.Net.Core](https://www.nuget.org/packages/Syncfusion.PresentationRenderer.Net.Core) and [SkiaSharp.Views.Blazor v3.116.1](https://www.nuget.org/packages/SkiaSharp.Views.Blazor/3.116.1) to the Blazor project. * Press Ctrl + ` (backtick) to open the integrated terminal in Visual Studio Code. * Ensure you're in the project root directory where your .csproj file is located. * Run the command `dotnet add package Syncfusion.PresentationRenderer.Net.Core` and `dotnet add package SkiaSharp.Views.Blazor --version 3.116.1` to install the NuGet package. @@ -837,16 +889,16 @@ Step 2: To **convert a PowerPoint to Image in Blazor WASM app**, install [Syncfu ![Add SkiaSharp.Views.Blazor NuGet package](Workingwith-Blazor/Command-to-add-NuGet-package-for-SkiaSharp.png) -N> 1. If you're deploying the application in a Linux environment, refer to the [documentation](https://help.syncfusion.com/document-processing/powerpoint/conversions/powerpoint-to-image/net/nuget-packages-required-for-pptxtoimage-conversion#additional-nuget-packages-required-for-linux) for the required additional NuGet packages. -N> 2. Starting with v16.2.0.x, if you reference Syncfusion® assemblies from trial setup or from the NuGet feed, you also have to add "Syncfusion.Licensing" assembly reference and include a license key in your projects. Please refer to this [link](https://help.syncfusion.com/common/essential-studio/licensing/overview) to know about registering Syncfusion® license key in your application to use our components. +N> 1. If deploying the application in a Linux environment, refer to the [documentation](https://help.syncfusion.com/document-processing/powerpoint/conversions/powerpoint-to-image/net/nuget-packages-required-for-pptxtoimage-conversion#additional-nuget-packages-required-for-linux) for the required additional NuGet packages. +N> 2. Starting with v16.2.0.x, if Syncfusion® assemblies are referenced from trial setup or from the NuGet feed, the "Syncfusion.Licensing" assembly reference must also be added and a license key included in projects. Please refer to this [link](https://help.syncfusion.com/common/essential-studio/licensing/overview) to know about registering Syncfusion® license key in an application to use Syncfusion components. N> 3. If you face issues related to SkiaSharp during runtime, install the necessary WebAssembly tools by running the following commands in the terminal: N> ``` N> dotnet workload install wasm-tools -N> dotnet workload install wasm-tools-net6 N> ``` N> After completing the installation, restart Visual Studio Code to ensure proper integration of the tools. -Step 3: Create a razor file with name as ``Presentation`` under ``Pages`` folder and add the following namespaces in the file. +Step 3: Create a Razor file named `Presentation.razor` in the `Pages` folder. +Add the following namespaces in the file. {% tabs %} {% highlight c# tabtitle="C#" %} @@ -861,19 +913,21 @@ Step 3: Create a razor file with name as ``Presentation`` under ``Pages`` folder {% endhighlight %} {% endtabs %} -Step 4: Add the following code to create a new button. +Step 4: Add a button to `Presentation.razor`. +Include the following code to create a new button that triggers the PowerPoint to Image conversion: {% tabs %} {% highlight CSHTML %} -

    Syncfusion PowerPoint library (Essential Presentation)

    -

    Syncfusion Blazor PowerPoint library (Essential Presentation) used to create, read, edit, and convert PowerPoint files in your applications without Microsoft Office dependencies.

    +

    Syncfusion PowerPoint Library (Essential Presentation)

    +

    The Syncfusion Blazor PowerPoint library (Essential Presentation) used to create, read, edit, and convert PowerPoint files in applications without Microsoft Office dependencies.

    {% endhighlight %} {% endtabs %} -Step 5: Create a new async method with name as ``PPTXToImage`` and include the following code snippet to **convert a PowerPoint to image in Blazor WASM app**. +Step 5: Implement `PPTXToImage` method in `Presentation.razor`. +Create a new `async` method named `PPTXToImage` and include the following code snippet to **convert a PowerPoint to image in Blazor WASM Standalone app**. {% tabs %} {% highlight c# tabtitle="C#" %} @@ -900,7 +954,8 @@ using (Stream inputStream = await client.GetStreamAsync("sample-data/Input.pptx" {% endhighlight %} {% endtabs %} -Step 6: To download the PowerPoint presentation in browser, create a class file with FileUtils name and add the following code to invoke the JavaScript action to download the file in the browser. +Step 6: Create `FileUtils.cs` for JavaScript interoperability. +Create a new class file named `FileUtils` in the project and add the following code to invoke the JavaScript action for file download in the browser. {% tabs %} {% highlight c# tabtitle="C#" %} @@ -917,7 +972,8 @@ public static class FileUtils {% endhighlight %} {% endtabs %} -Step 7: Add the following JavaScript function in the **Index.html** file present under ``wwwroot``. +Step 7: Add the following JavaScript function to `index.html`. +Add this function in the `index.html` file located in `wwwroot`. {% tabs %} {% highlight HTML %} @@ -948,17 +1004,18 @@ Step 7: Add the following JavaScript function in the **Index.html** file present {% endhighlight %} {% endtabs %} -Step 8: Add the following code snippet in the razor file of Navigation menu in the Shared folder. +Step 8: Add the navigation link. +Add the following code snippet to the Navigation menu's Razor file in the `Layout` folder. {% tabs %} {% highlight HTML %} - + {% endhighlight %} @@ -980,13 +1037,13 @@ Run the following command in terminal to run the project. dotnet run ``` -You can download a complete working sample from [GitHub](https://github.com/SyncfusionExamples/PowerPoint-Examples/tree/master/PPTX-to-Image-conversion/Convert-PowerPoint-presentation-to-Image/Blazor/WASM-app). +A complete working sample is available on [GitHub](https://github.com/SyncfusionExamples/PowerPoint-Examples/tree/master/PPTX-to-Image-conversion/Convert-PowerPoint-presentation-to-Image/Blazor/WASM-Standalone-app). -By executing the program, you will get the **image** as follows. +Upon executing the program, the **image** will be generated as follows. ![PowerPoint to Image in Blazor WASM app](PPTXtoPDF_images/Output_PowerPoint_Presentation_to-Image.png) -N> Even though PowerPoint library works in WASM app, it is recommended to use server deployment. Since the WASM app deployment increases the application payload size. +N> To convert PPTX to Image, it is necessary to access the font stream internally. However, this cannot be done automatically in a Blazor WASM Standalone application. Therefore, it is recommended to use a Web app Server, even though PPTX to Image conversion works in a WASM Standalone app. {% endtabcontent %} @@ -997,7 +1054,7 @@ N> Even though PowerPoint library works in WASM app, it is recommended to use se * JetBrains Rider. * Install .NET 8 SDK or later. -Step 1. Open JetBrains Rider and create a new Blazor WASM app project. +Step 1. Open JetBrains Rider and create a new Blazor WASM Standalone app project. * Launch JetBrains Rider. * Click new solution on the welcome screen. @@ -1027,11 +1084,16 @@ Step 2: Install the NuGet package from [NuGet.org](https://www.nuget.org/). ![Install the SkiaSharp.Views.Blazor NuGet package](Workingwith-Blazor/Install-SkiaSharp.Views.Blazor-NuGet.png) -N> 1. If you're deploying the application in a Linux environment, refer to the [documentation](https://help.syncfusion.com/document-processing/powerpoint/conversions/powerpoint-to-image/net/nuget-packages-required-for-pptxtoimage-conversion#additional-nuget-packages-required-for-linux) for the required additional NuGet packages. -N> 2. Starting with v16.2.0.x, if you reference Syncfusion® assemblies from trial setup or from the NuGet feed, you also have to add "Syncfusion.Licensing" assembly reference and include a license key in your projects. Please refer to this [link](https://help.syncfusion.com/common/essential-studio/licensing/overview) to know about registering Syncfusion® license key in your application to use our components. -N> 3. Install this wasm-tools and wasm-tools-net6 by using the "dotnet workload install wasm-tools" and "dotnet workload install wasm-tools-net6" commands in your command prompt respectively if you are facing issues related to Skiasharp during runtime. After installing wasm tools using the above commands, please restart your machine. +N> 1. If deploying the application in a Linux environment, refer to the [documentation](https://help.syncfusion.com/document-processing/powerpoint/conversions/powerpoint-to-image/net/nuget-packages-required-for-pptxtoimage-conversion#additional-nuget-packages-required-for-linux) for the required additional NuGet packages. +N> 2. Starting with v16.2.0.x, if Syncfusion® assemblies are referenced from trial setup or from the NuGet feed, the "Syncfusion.Licensing" assembly reference must also be added and a license key included in projects. Please refer to this [link](https://help.syncfusion.com/common/essential-studio/licensing/overview) to know about registering Syncfusion® license key in an application to use Syncfusion components. +N> 3. If you face issues related to SkiaSharp during runtime, install the necessary WebAssembly tools by running the following commands in the terminal: +N> ``` +N> dotnet workload install wasm-tools +N> ``` +N> After completing the installation, restart Visual Studio Code to ensure proper integration of the tools. -Step 3: Create a razor file with name as ``Presentation`` under ``Pages`` folder and add the following namespaces in the file. +Step 3: Create a Razor file named `Presentation.razor` in the `Pages` folder. +Add the following namespaces in the file. {% tabs %} {% highlight c# tabtitle="C#" %} @@ -1046,19 +1108,21 @@ Step 3: Create a razor file with name as ``Presentation`` under ``Pages`` folder {% endhighlight %} {% endtabs %} -Step 4: Add the following code to create a new button. +Step 4: Add a button to `Presentation.razor`. +Include the following code to create a new button that triggers the PowerPoint to Image conversion: {% tabs %} {% highlight CSHTML %} -

    Syncfusion PowerPoint library (Essential Presentation)

    -

    Syncfusion Blazor PowerPoint library (Essential Presentation) used to create, read, edit, and convert PowerPoint files in your applications without Microsoft Office dependencies.

    +

    Syncfusion PowerPoint Library (Essential Presentation)

    +

    The Syncfusion Blazor PowerPoint library (Essential Presentation) used to create, read, edit, and convert PowerPoint files in applications without Microsoft Office dependencies.

    {% endhighlight %} {% endtabs %} -Step 5: Create a new async method with name as ``PPTXToImage`` and include the following code snippet to **convert a PowerPoint to image in Blazor WASM app**. +Step 5: Implement `PPTXToImage` method in `Presentation.razor`. +Create a new `async` method named `PPTXToImage` and include the following code snippet to **convert a PowerPoint to image in Blazor WASM Standalone app**. {% tabs %} {% highlight c# tabtitle="C#" %} @@ -1085,7 +1149,8 @@ using (Stream inputStream = await client.GetStreamAsync("sample-data/Input.pptx" {% endhighlight %} {% endtabs %} -Step 6: To download the PowerPoint presentation in browser, create a class file with FileUtils name and add the following code to invoke the JavaScript action to download the file in the browser. +Step 6: Create `FileUtils.cs` for JavaScript interoperability. +Create a new class file named `FileUtils` in the project and add the following code to invoke the JavaScript action for file download in the browser. {% tabs %} {% highlight c# tabtitle="C#" %} @@ -1102,7 +1167,8 @@ public static class FileUtils {% endhighlight %} {% endtabs %} -Step 7: Add the following JavaScript function in the **Index.html** file present under ``wwwroot``. +Step 7: Add the following JavaScript function to `index.html`. +Add this function in the `index.html` file located in `wwwroot`. {% tabs %} {% highlight HTML %} @@ -1133,17 +1199,18 @@ Step 7: Add the following JavaScript function in the **Index.html** file present {% endhighlight %} {% endtabs %} -Step 8: Add the following code snippet in the razor file of Navigation menu in the Shared folder. +Step 8: Add the navigation link. +Add the following code snippet to the Navigation menu's Razor file in the `Layout` folder. {% tabs %} {% highlight HTML %} - + {% endhighlight %} @@ -1157,18 +1224,18 @@ Step 10: Run the project. Click the **Run** button (green arrow) in the toolbar or press F5 to run the app. -You can download a complete working sample from [GitHub](https://github.com/SyncfusionExamples/PowerPoint-Examples/tree/master/PPTX-to-Image-conversion/Convert-PowerPoint-presentation-to-Image/Blazor/WASM-app). +A complete working sample is available on [GitHub](https://github.com/SyncfusionExamples/PowerPoint-Examples/tree/master/PPTX-to-Image-conversion/Convert-PowerPoint-presentation-to-Image/Blazor/WASM-Standalone-app). -By executing the program, you will get the **image** as follows. +Upon executing the program, the **image** will be generated as follows. ![PowerPoint to Image in Blazor WASM app](PPTXtoPDF_images/Output_PowerPoint_Presentation_to-Image.png) -N> Even though PowerPoint library works in WASM app, it is recommended to use server deployment. Since the WASM app deployment increases the application payload size. +N> To convert PPTX to Image, it is necessary to access the font stream internally. However, this cannot be done automatically in a Blazor WASM Standalone application. Therefore, it is recommended to use a Web app Server, even though PPTX to Image conversion works in a WASM Standalone app. {% endtabcontent %} -{% endtabcontents %} +{% endtabcontents %}} Click [here](https://www.syncfusion.com/document-processing/powerpoint-framework/blazor) to explore the rich set of Syncfusion® PowerPoint Library (Presentation) features. -An online sample link to [convert PowerPoint Presentation to image](https://document.syncfusion.com/demos/powerpoint/pptxtoimage#/tailwind) in ASP.NET Core. +An online sample link to [convert PowerPoint Presentation to image](https://document.syncfusion.com/demos/powerpoint/pptxtoimage#/tailwind) in ASP.NET Core. \ No newline at end of file diff --git a/Document-Processing/PowerPoint/Conversions/PowerPoint-To-Image/NET/Workingwith-Blazor/Blazor-WASM-Standalone-app-template.png b/Document-Processing/PowerPoint/Conversions/PowerPoint-To-Image/NET/Workingwith-Blazor/Blazor-WASM-Standalone-app-template.png new file mode 100644 index 0000000000000000000000000000000000000000..104bb4eadbd4d8fa72f530a04f6ef971c00fed4d GIT binary patch literal 11690 zcmZX)2{hE-8$UiNErY0Rk=>_ciOQ0g85(OPJ0T>=ItYUXW2clQYuWeRjAhK&#)L|; z8%vo%D(e`#8N2`J`#H zqz2=E*4fjH@8nMnCXAmG-bUK@0I0qz3yj1mM|C}Q0H7wGW#5jOkv`|CW8n<|obNdP zoapo@eGUM~Ky)?KP5f=B6XzPPIN;~jl*F%*bRW?`3CtITPn?oh7tjC1^`GRE)6p4? z{hv&=JfYf|%;J;;@Usj4XQv443`;CdBRt}@_(t&JCt!IGRy>Q z64b*_YodXP#GzDYU-&tVk#>&hvy2R0|Dbc~RopQyg0CebbEMn8aU?LLA>-woFC>|B z%+6~@YxKhnZ?G=ZAHdK_?8kN0rNTQ)dI3cOaIr-u#Kf`yq?sU zipetkc13`2xqMY!9T5`6#y@(C?YNueFOAHCKp=Pe@`U?bU)D?OY;NRGu|jh?b3W#m zSQkg(TwL6FC5P{vNq5!cQL03qb4xg=QDJufdp4 z;=|6;wK*2KzK;Ba30h6MN+2I|Mpkc7+{5!E#2k25W8rA7|m3nHStCjjFk7-u3m z#oT7$24R2Q2?)T%nN@C_(aXBKl}nR!;|vf0N248k(`TaCg_e&_ha9f=`Lz6t%2<*82z%BzaKW76d-mSg_B5!h7>sgsq}-&kbeB($*b1+5171cVx%s$`TE?vyY3iWB*nY zT%d=WJJ)goYp0Hk^+5_qTdz{fq9BaxQ@0=H;|6m0qcD~mo_-T>^WyBwR&y)CM*#!~ zeZtSS1?1dWDG1WQvh{=a+ydVvcIGP0X*SYP*3DR_Z#MPz+1SZ|75o@}r`Lm)GbRt>JY_Op{wpQv z(cLbdUy8vSv%T&=YaNiSqib0!ft}IfTtir!nlSQYi9xPsZhmW~eVp=Fo-xbA2e!M3 zImLFtDW%om!|gv4W34oWBe1n`K|*0rlFMG{r`+i%?EZUg!G)%#rkLWgEH3OYg~$(N z0>(|#Hm@-!?QG0-?p48bRZe$p+}q$9$_`j=+{WKU&Sm*!v**p2sLVQ3g7()sC*lND z0=EZij5&sCuCbm_gI#zHz(_~Fhmo+F!KSqDQfST~t0NkYFmdJz%guZnwn$dylRJa) zNRv%L=Ci#*D!y*=MajUaoAzI~DQP`WcFLHG1s1g8xEp=h0 zf!gxOq=C^Ys{->^P2nFA7b?$=LGb_q0fE7buXfF*X3d-ad>lk*#|u)yhimbjE5^y%OHU>e9SG{j+T(>QX-tL(4Qcg25*4SRb^_~2kp$D>C=p>LqdWlV3LR4ni zr!lzV*RXNtk}NZfo~1`4bug>1eL8sYW;upxVM@{-q`CaaT=sck*M{mIl6Q^v8txlG z?F`lo4JZp#NJG!KszaF-$b&!N4@VHqKCvlL+mS0Ho)A4^i@ZhLt8oNmyN!LtJW&u2=ED;kM=H#lv$F+p&$}+tTj}_I!b-%YN2^L#2UJ0`JsINNG$c;o>$oeR*bwsuxN5KE@d+or`%6`?2p4)$5MiK+GLc{mS-*2up z-R`^7AzRUI!L#P)>)Qm`pJqSwPBd{6Ld@r_VP9kQ_HyYiStB$H#cObokjL@n?{~1ZRzLX2Meo(ydakN zwA7DE9@$p)E~a0o7hvHCGN+u6xmuMziTBXJ&7+S+ApUrykV60M*iikB_dA;`*>p6$ z;@Tr9C!7VIrB8M{p%y%#=d(E_ z=-gZ&o@1B~P`hLxY)L={83JlQU1~j6wflAq7ecTjo*)f$Yz_r0y&FLhye*r~#1QAE zYI)ese1)vTl>ECl29u4bL(pN*P^Ul5N4SjD?@)L0Vsrj=h9bblnX+_yVz$f!p0vC# z%g|)~$S=HjS@a*+*(yL}T(Efc|Mti6KFoM9GE5g3KOtC6#;%s=-Y^|C&&4qC)&KR@ z|9@php#iL=B1cy6;m&f#)PAuQqhI8UK$$PUUPcnO$T7wGIm@l
    g=vUvIQL=+b( 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 T?^(ta2Iy)&(m>sN8utGHk5KLF literal 0 HcmV?d00001 diff --git a/Document-Processing/PowerPoint/Conversions/PowerPoint-To-Image/NET/Workingwith-Blazor/Blazor-Web-app-template.png b/Document-Processing/PowerPoint/Conversions/PowerPoint-To-Image/NET/Workingwith-Blazor/Blazor-Web-app-template.png new file mode 100644 index 0000000000000000000000000000000000000000..23d65753b33844e8f7bc5f2dee10dab594112077 GIT binary patch literal 15007 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 y|2Qrvc%@&U~VfUNx=Yy21T6 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 literal 0 HcmV?d00001 diff --git a/Document-Processing/PowerPoint/Conversions/PowerPoint-To-Image/NET/Workingwith-Blazor/Blazor_image_Server_Web_Additional_Information.png b/Document-Processing/PowerPoint/Conversions/PowerPoint-To-Image/NET/Workingwith-Blazor/Blazor_image_Server_Web_Additional_Information.png new file mode 100644 index 0000000000000000000000000000000000000000..4f8ec78c0dbabbf9564e8301f391093d35b7864d GIT binary patch literal 39258 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%0Dc|M+{)5f6hc>(<+g0( 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 z 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® PowerPoint is a [.NET Core PowerPoint library](https://www.syncfusion.com/document-processing/powerpoint-framework/net-core) used to create, read, edit and convert PowerPoint presentation programmatically without **Microsoft PowerPoint** or interop dependencies. Using this library, you can **convert a PowerPoint to PDF in Blazor**. +Syncfusion® PowerPoint is a [.NET Core PowerPoint library](https://www.syncfusion.com/document-processing/powerpoint-framework/net-core) used to create, read, edit and convert PowerPoint presentation programmatically without **Microsoft PowerPoint** or interop dependencies. Using this library, a **convert a PowerPoint to PDF in Blazor**. -## Server app +## Blazor Web App Server Application {% tabcontents %} @@ -18,48 +18,61 @@ Syncfusion® PowerPoint is a [.NET Core PowerPoint library](https: **Prerequisites:** -* Visual Studio 2022. -* Install [.NET 8 SDK](https://dotnet.microsoft.com/en-us/download/dotnet/8.0) or later. +* Visual Studio 2022. +* Install [.NET 8 SDK](https://dotnet.microsoft.com/en-us/download/dotnet/8.0) or later. + +Step 1: Create a new C# Blazor Web app project. +* Select "Blazor Web App" from the template and click **Next**. + +![Create Blazor Web App application in Visual Studio](Workingwith-Blazor/Blazor_image_Web_App.png) + +* Name the project and click **Next**. -Step 1: Create a new C# Blazor Server app project. Select Blazor Server App from the template and click the Next button. +![Name the Blazor Web App in Visual Studio](Workingwith-Blazor/Blazor_image_Web_ProjectName.png) -![Create Blazor Server application in Visual Studio for Blazor PowerPoint document ](Workingwith-Blazor/Create_project.png) +* Select the framework and click **Create** button. -Step 2: Install the [Syncfusion.PresentationRenderer.Net.Core](https://www.nuget.org/packages/Syncfusion.PresentationRenderer.Net.Core) NuGet package as reference to your project from [NuGet.org](https://www.nuget.org/). +![Select the framework in Blazor Web App Server in Visual Studio](Workingwith-Blazor/Blazor_image_Server_Web_Additional_Information.png) + +Step 2: Install the `Syncfusion.PresentationRenderer.Net.Core` NuGet package. +To convert a **PowerPoint presentation to PDF in a Web App Server**, install the [Syncfusion.PresentationRenderer.Net.Core](https://www.nuget.org/packages/Syncfusion.PresentationRenderer.Net.Core) NuGet package as reference to the project from [NuGet.org](https://www.nuget.org/). ![Install Syncfusion.PresentationRenderer.Net.Core Nuget Package](Azure-Images/App-Service-Linux/Nuget_Package_PowerPoint_Presentation_to_PDF.png) N> 1. If you're deploying the application in a Linux environment, refer to the [documentation](https://help.syncfusion.com/document-processing/powerpoint/conversions/powerpoint-to-pdf/net/nuget-packages-required-for-pptxtopdf-conversion#additional-nuget-packages-required-for-linux) for the required additional NuGet packages. -N> 2. Starting with v16.2.0.x, if you reference Syncfusion® assemblies from trial setup or from the NuGet feed, you also have to add "Syncfusion.Licensing" assembly reference and include a license key in your projects. Please refer to this [link](https://help.syncfusion.com/common/essential-studio/licensing/overview) to know about registering Syncfusion® license key in your application to use our components. +N> 2. Starting with v16.2.0.x, if Syncfusion® assemblies are referenced from trial setup or from the NuGet feed, the "Syncfusion.Licensing" assembly reference must also be added and a license key included in projects. Please refer to this [link](https://help.syncfusion.com/common/essential-studio/licensing/overview) to know about registering Syncfusion® license key in an application to use Syncfusion components. -Step 3: Create a razor file with name as **Presentation** under **Pages** folder and include the following namespaces in the file. +Step 3: Create a Razor file named `Presentation.razor` in the `Pages` folder, which is located inside the `Components` folder. +Add the following namespaces in the file. {% tabs %} {% highlight c# tabtitle="C#" %} -@page "/presentation" +@rendermode InteractiveServer +@page "/Presentation" @using System.IO; @using Convert_PowerPoint_Presentation_to_PDF; -@inject Convert_PowerPoint_Presentation_to_PDF.Data.PresentationService service +@inject Convert_PowerPoint_Presentation_to_PDF.Data.PowerPointService service @inject Microsoft.JSInterop.IJSRuntime JS {% endhighlight %} {% endtabs %} -Step 4: Add the following code to create a new button. +Step 4: Add a button to `Presentation.razor`. +Include the following code to create a new button that triggers the PowerPoint to PDF conversion: {% tabs %} {% highlight CSHTML %} -

    Syncfusion PowerPoint library (Essential Presentation)

    -

    Syncfusion Blazor PowerPoint library (Essential Presentation) used to create, read, edit, and convert PowerPoint files in your applications without Microsoft Office dependencies.

    +

    Syncfusion PowerPoint Library (Essential Presentation)

    +

    The Syncfusion Blazor PowerPoint library (Essential Presentation) used to create, read, edit, and convert PowerPoint files in applications without Microsoft Office dependencies.

    {% endhighlight %} {% endtabs %} -Step 5: Add the following code in **Presentation.razor** file to **convert PowerPoint to PDF** and download the **PDF document**. - +Step 5: Implement the method in `Presentation.razor`. +Add the following code to **convert PowerPoint to PDF** and download the **PDF document**. {% tabs %} {% highlight c# tabtitle="C#" %} @@ -78,7 +91,8 @@ Step 5: Add the following code in **Presentation.razor** file to **convert Power {% endhighlight %} {% endtabs %} -Step 6: Create a new cs file with name as **PowerPointService** under Data folder and include the following namespaces in the file. +Step 6: Create a new cs file `PowerPointService` in the `Data` folder. +Include the following namespaces in the file. {% tabs %} {% highlight c# tabtitle="C#" %} @@ -90,27 +104,28 @@ using Syncfusion.Pdf; {% endhighlight %} {% endtabs %} -Step 7: Create a new MemoryStream method with name as **ConvertPPTXtoPDF** in **PowerPointService** class and include the following code snippet to **convert a PowerPoint to PDF in Blazor Server app**. +Step 7: Implement the method in `PowerPointService.cs`. +Create a new `MemoryStream` method in the `PowerPointService` and include the following code snippet to **convert a PowerPoint to PDF in Blazor Web App Server**. {% tabs %} {% highlight c# tabtitle="C#" %} -//Open the file as Stream +// Open the file as Stream using (FileStream sourceStreamPath = new FileStream(@"wwwroot/Input.pptx", FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { - //Open the existing PowerPoint presentation with loaded stream. + // Open the existing PowerPoint presentation with loaded stream. using (IPresentation pptxDoc = Presentation.Open(sourceStreamPath)) { - //Convert the PowerPoint presentation to PDF document. + // Convert the PowerPoint presentation to PDF document. using (PdfDocument pdfDocument = PresentationToPdfConverter.Convert(pptxDoc)) { - //Create the MemoryStream to save the converted PDF. + // Create the MemoryStream to save the converted PDF. MemoryStream pdfStream = new MemoryStream(); - //Save the converted PDF document to MemoryStream. + // Save the converted PDF document to MemoryStream. pdfDocument.Save(pdfStream); pdfStream.Position = 0; - //Download PDF document in the browser. + // Download PDF document in the browser. return pdfStream; } } @@ -119,17 +134,19 @@ using (FileStream sourceStreamPath = new FileStream(@"wwwroot/Input.pptx", FileM {% endhighlight %} {% endtabs %} -Step 8: Add the following line to the Program.cs file to register the PresentationService as a scoped service in your Blazor application. +Step 8: Add the service in `Program.cs`. +Add the following line to the `Program.cs` file to register `PowerPointService` as a scoped service in your Blazor application. {% tabs %} {% highlight c# tabtitle="C#" %} -builder.Services.AddSingleton(); +builder.Services.AddScoped(); {% endhighlight %} {% endtabs %} -Step 9: Create a new class file in the project, with name as FileUtils and add the following code to invoke the JavaScript action to download the file in the browser. +Step 9: Create `FileUtils.cs` for JavaScript interoperability. +Create a new class file named `FileUtils` in the project and add the following code to invoke the JavaScript action for file download in the browser. {% tabs %} {% highlight c# tabtitle="C#" %} @@ -146,7 +163,8 @@ public static class FileUtils {% endhighlight %} {% endtabs %} -Step 10: Add the following JavaScript function in the **_Host.cshtml** in the Pages folder. +Step 10: Add the following JavaScript function to `App.razor`. +Add this function in the `App.razor` file located in the `Pages` folder. {% tabs %} {% highlight HTML %} @@ -156,7 +174,7 @@ Step 10: Add the following JavaScript function in the **_Host.cshtml** in the Pa { if (navigator.msSaveBlob) { - //Download document in Edge browser + // Download document in Edge browser var data = window.atob(bytesBase64); var bytes = new Uint8Array(data.length); for (var i = 0; i < data.length; i++) { @@ -180,17 +198,18 @@ Step 10: Add the following JavaScript function in the **_Host.cshtml** in the Pa {% endhighlight %} {% endtabs %} -Step 11: Add the following code snippet in the razor file of Navigation menu in the Shared folder. +Step 11: Add the navigation link. +Add the following code snippet to the Navigation menu's Razor file in the `Layout` folder. {% tabs %} {% highlight HTML %} - + {% endhighlight %} @@ -198,17 +217,17 @@ Step 11: Add the following code snippet in the razor file of Navigation menu in Step 12: Build the project. -Click on Build → Build Solution or press Ctrl+Shift+B to build the project. +Click on **Build** → **Build Solution** or press Ctrl+Shift+B to build the project. Step 13: Run the project. -Click the Start button (green arrow) or press F5 to run the app. +Click the Start button (green arrow) or press F5 to run the application. -You can download a complete working sample from [GitHub](https://github.com/SyncfusionExamples/PowerPoint-Examples/tree/master/PPTX-to-PDF-conversion/Convert-PowerPoint-presentation-to-PDF/Blazor/Server-app). +A complete working sample is available on [GitHub](https://github.com/SyncfusionExamples/PowerPoint-Examples/tree/master/PPTX-to-PDF-conversion/Convert-PowerPoint-presentation-to-PDF/Blazor/Blazor-Web-App-Server). -By executing the program, you will get the **PDF** as follows. +Upon executing the program, the **PDF** will be generated as follows. -![Converted PDF from PowerPoint in Blazor server app](PPTXtoPDF_images/Output_PowerPoint_Presentation_to-PDF.png) +![Converted PDF from PowerPoint in Blazor Web App server](PPTXtoPDF_images/Output_PowerPoint_Presentation_to-PDF.png) {% endtabcontent %} @@ -220,16 +239,16 @@ By executing the program, you will get the **PDF** as follows. * Install [.NET 8 SDK](https://dotnet.microsoft.com/en-us/download/dotnet/8.0) or later. * Open Visual Studio Code and install the [C# for Visual Studio Code extension](https://marketplace.visualstudio.com/items?itemName=ms-dotnettools.csharp) from the Extensions Marketplace. -Step 1: Create a new C# Blazor Server app project. +Step 1: Create a new C# Blazor Web app project. * Open the command palette by pressing Ctrl+Shift+P and type **.NET:New Project** and enter. -* Choose the **Blazor Server App** template. +* Choose the **Blazor Web App** template. -![Choose Blazor Server app from template](Workingwith-Blazor/Blazor-server-app-template.png) +![Choose Blazor Server app from template](Workingwith-Blazor/Blazor-Web-app-template.png) * Select the project location, type the project name and press enter. * Then choose **Create project**. -Step 2: To **convert a PowerPoint to PDF in server app**, install [Syncfusion.PresentationRenderer.Net.Core](https://www.nuget.org/packages/Syncfusion.PresentationRenderer.Net.Core) to the Blazor project. +Step 2: To **convert a PowerPoint to PDF in Web App server**, install [Syncfusion.PresentationRenderer.Net.Core](https://www.nuget.org/packages/Syncfusion.PresentationRenderer.Net.Core) to the Blazor project. * Press Ctrl + ` (backtick) to open the integrated terminal in Visual Studio Code. * Ensure you're in the project root directory where your .csproj file is located. * Run the command `dotnet add package Syncfusion.PresentationRenderer.Net.Core` to install the NuGet package. @@ -237,36 +256,39 @@ Step 2: To **convert a PowerPoint to PDF in server app**, install [Syncfusion.Pr ![Add Syncfusion.PresentationRenderer.Net.Core NuGet package](Workingwith-Blazor/Command-to-add-NuGet-package-for-Server.png) N> 1. If you're deploying the application in a Linux environment, refer to the [documentation](https://help.syncfusion.com/document-processing/powerpoint/conversions/powerpoint-to-pdf/net/nuget-packages-required-for-pptxtopdf-conversion#additional-nuget-packages-required-for-linux) for the required additional NuGet packages. -N> 2. Starting with v16.2.0.x, if you reference Syncfusion® assemblies from trial setup or from the NuGet feed, you also have to add "Syncfusion.Licensing" assembly reference and include a license key in your projects. Please refer to this [link](https://help.syncfusion.com/common/essential-studio/licensing/overview) to know about registering Syncfusion® license key in your application to use our components. +N> 2. Starting with v16.2.0.x, if Syncfusion® assemblies are referenced from trial setup or from the NuGet feed, the "Syncfusion.Licensing" assembly reference must also be added and a license key included in projects. Please refer to this [link](https://help.syncfusion.com/common/essential-studio/licensing/overview) to know about registering Syncfusion® license key in an application to use Syncfusion components. -Step 3: Create a razor file with name as **Presentation** under **Pages** folder and include the following namespaces in the file. +Step 3: Create a Razor file named `Presentation.razor` in the `Pages` folder, which is located inside the `Components` folder. +Add the following namespaces in the file. {% tabs %} {% highlight c# tabtitle="C#" %} -@page "/presentation" +@rendermode InteractiveServer +@page "/Presentation" @using System.IO; @using Convert_PowerPoint_Presentation_to_PDF; -@inject Convert_PowerPoint_Presentation_to_PDF.Data.PresentationService service +@inject Convert_PowerPoint_Presentation_to_PDF.Data.PowerPointService service @inject Microsoft.JSInterop.IJSRuntime JS {% endhighlight %} {% endtabs %} -Step 4: Add the following code to create a new button. +Step 4: Add a button to `Presentation.razor`. +Include the following code to create a new button that triggers the PowerPoint to PDF conversion: {% tabs %} {% highlight CSHTML %} -

    Syncfusion PowerPoint library (Essential Presentation)

    -

    Syncfusion Blazor PowerPoint library (Essential Presentation) used to create, read, edit, and convert PowerPoint files in your applications without Microsoft Office dependencies.

    +

    Syncfusion PowerPoint Library (Essential Presentation)

    +

    The Syncfusion Blazor PowerPoint library (Essential Presentation) used to create, read, edit, and convert PowerPoint files in applications without Microsoft Office dependencies.

    {% endhighlight %} {% endtabs %} -Step 5: Add the following code in **Presentation.razor** file to **convert PowerPoint to PDF** and download the **PDF document**. - +Step 5: Implement the method in `Presentation.razor`. +Add the following code to **convert PowerPoint to PDF** and download the **PDF document**. {% tabs %} {% highlight c# tabtitle="C#" %} @@ -285,7 +307,8 @@ Step 5: Add the following code in **Presentation.razor** file to **convert Power {% endhighlight %} {% endtabs %} -Step 6: Create a new cs file with name as **PowerPointService** under Data folder and include the following namespaces in the file. +Step 6: Create a new cs file `PowerPointService` in the `Data` folder. +Include the following namespaces in the file. {% tabs %} {% highlight c# tabtitle="C#" %} @@ -297,27 +320,28 @@ using Syncfusion.Pdf; {% endhighlight %} {% endtabs %} -Step 7: Create a new MemoryStream method with name as **ConvertPPTXtoPDF** in **PowerPointService** class and include the following code snippet to **convert a PowerPoint to PDF in Blazor Server app**. +Step 7: Implement the method in `PowerPointService.cs`. +Create a new `MemoryStream` method in the `PowerPointService` and include the following code snippet to **convert a PowerPoint to PDF in Blazor Web App Server**. {% tabs %} {% highlight c# tabtitle="C#" %} -//Open the file as Stream +// Open the file as Stream using (FileStream sourceStreamPath = new FileStream(@"wwwroot/Input.pptx", FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { - //Open the existing PowerPoint presentation with loaded stream. + // Open the existing PowerPoint presentation with loaded stream. using (IPresentation pptxDoc = Presentation.Open(sourceStreamPath)) { - //Convert the PowerPoint presentation to PDF document. + // Convert the PowerPoint presentation to PDF document. using (PdfDocument pdfDocument = PresentationToPdfConverter.Convert(pptxDoc)) { - //Create the MemoryStream to save the converted PDF. + // Create the MemoryStream to save the converted PDF. MemoryStream pdfStream = new MemoryStream(); - //Save the converted PDF document to MemoryStream. + // Save the converted PDF document to MemoryStream. pdfDocument.Save(pdfStream); pdfStream.Position = 0; - //Download PDF document in the browser. + // Download PDF document in the browser. return pdfStream; } } @@ -326,17 +350,19 @@ using (FileStream sourceStreamPath = new FileStream(@"wwwroot/Input.pptx", FileM {% endhighlight %} {% endtabs %} -Step 8: Add the following line to the Program.cs file to register the PresentationService as a scoped service in your Blazor application. +Step 8: Add the service in `Program.cs`. +Add the following line to the `Program.cs` file to register `PowerPointService` as a scoped service in your Blazor application. {% tabs %} {% highlight c# tabtitle="C#" %} -builder.Services.AddSingleton(); +builder.Services.AddScoped(); {% endhighlight %} {% endtabs %} -Step 9: Create a new class file in the project, with name as FileUtils and add the following code to invoke the JavaScript action to download the file in the browser. +Step 9: Create `FileUtils.cs` for JavaScript interoperability. +Create a new class file named `FileUtils` in the project and add the following code to invoke the JavaScript action for file download in the browser. {% tabs %} {% highlight c# tabtitle="C#" %} @@ -353,7 +379,8 @@ public static class FileUtils {% endhighlight %} {% endtabs %} -Step 10: Add the following JavaScript function in the **_Host.cshtml** in the Pages folder. +Step 10: Add the following JavaScript function to `App.razor`. +Add this function in the `App.razor` file located in the `Pages` folder. {% tabs %} {% highlight HTML %} @@ -363,7 +390,7 @@ Step 10: Add the following JavaScript function in the **_Host.cshtml** in the Pa { if (navigator.msSaveBlob) { - //Download document in Edge browser + // Download document in Edge browser var data = window.atob(bytesBase64); var bytes = new Uint8Array(data.length); for (var i = 0; i < data.length; i++) { @@ -387,17 +414,18 @@ Step 10: Add the following JavaScript function in the **_Host.cshtml** in the Pa {% endhighlight %} {% endtabs %} -Step 11: Add the following code snippet in the razor file of Navigation menu in the Shared folder. +Step 11: Add the navigation link. +Add the following code snippet to the Navigation menu's Razor file in the `Layout` folder. {% tabs %} {% highlight HTML %} - + {% endhighlight %} @@ -419,11 +447,11 @@ Run the following command in terminal to run the project. dotnet run ``` -You can download a complete working sample from [GitHub](https://github.com/SyncfusionExamples/PowerPoint-Examples/tree/master/PPTX-to-PDF-conversion/Convert-PowerPoint-presentation-to-PDF/Blazor/Server-app). +A complete working sample is available on [GitHub](https://github.com/SyncfusionExamples/PowerPoint-Examples/tree/master/PPTX-to-PDF-conversion/Convert-PowerPoint-presentation-to-PDF/Blazor/Blazor-Web-App-Server). -By executing the program, you will get the **PDF** as follows. +Upon executing the program, the **PDF** will be generated as follows. -![Converted PDF from PowerPoint in Blazor server app](PPTXtoPDF_images/Output_PowerPoint_Presentation_to-PDF.png) +![Converted PDF from PowerPoint in Blazor Web App server](PPTXtoPDF_images/Output_PowerPoint_Presentation_to-PDF.png) {% endtabcontent %} @@ -434,7 +462,7 @@ By executing the program, you will get the **PDF** as follows. * JetBrains Rider. * Install .NET 8 SDK or later. -Step 1. Open JetBrains Rider and create a new Blazor Server app project. +Step 1. Open JetBrains Rider and create a new Blazor Web app project. * Launch JetBrains Rider. * Click new solution on the welcome screen. @@ -461,36 +489,39 @@ Step 2: Install the NuGet package from [NuGet.org](https://www.nuget.org/). ![Install the Syncfusion.PresentationRenderer.Net.Core NuGet package](Workingwith-Blazor/Install-Syncfusion.PresentationRenderer.Net.Core-NuGet.png) N> 1. If you're deploying the application in a Linux environment, refer to the [documentation](https://help.syncfusion.com/document-processing/powerpoint/conversions/powerpoint-to-pdf/net/nuget-packages-required-for-pptxtopdf-conversion#additional-nuget-packages-required-for-linux) for the required additional NuGet packages. -N> 2. Starting with v16.2.0.x, if you reference Syncfusion assemblies from trial setup or from the NuGet feed, you also have to add "Syncfusion.Licensing" assembly reference and include a license key in your projects. Please refer to this [link](https://help.syncfusion.com/common/essential-studio/licensing/overview) to know about registering Syncfusion license key in your application to use our components. +N> 2. Starting with v16.2.0.x, if Syncfusion® assemblies are referenced from trial setup or from the NuGet feed, the "Syncfusion.Licensing" assembly reference must also be added and a license key included in projects. Please refer to this [link](https://help.syncfusion.com/common/essential-studio/licensing/overview) to know about registering Syncfusion® license key in an application to use Syncfusion components. -Step 3: Create a razor file with name as **Presentation** under **Pages** folder and include the following namespaces in the file. +Step 3: Create a Razor file named `Presentation.razor` in the `Pages` folder, which is located inside the `Components` folder. +Add the following namespaces in the file. {% tabs %} {% highlight c# tabtitle="C#" %} -@page "/presentation" +@rendermode InteractiveServer +@page "/Presentation" @using System.IO; @using Convert_PowerPoint_Presentation_to_PDF; -@inject Convert_PowerPoint_Presentation_to_PDF.Data.PresentationService service +@inject Convert_PowerPoint_Presentation_to_PDF.Data.PowerPointService service @inject Microsoft.JSInterop.IJSRuntime JS {% endhighlight %} {% endtabs %} -Step 4: Add the following code to create a new button. +Step 4: Add a button to `Presentation.razor`. +Include the following code to create a new button that triggers the PowerPoint to PDF conversion: {% tabs %} {% highlight CSHTML %} -

    Syncfusion PowerPoint library (Essential Presentation)

    -

    Syncfusion Blazor PowerPoint library (Essential Presentation) used to create, read, edit, and convert PowerPoint files in your applications without Microsoft Office dependencies.

    +

    Syncfusion PowerPoint Library (Essential Presentation)

    +

    The Syncfusion Blazor PowerPoint library (Essential Presentation) used to create, read, edit, and convert PowerPoint files in applications without Microsoft Office dependencies.

    {% endhighlight %} {% endtabs %} -Step 5: Add the following code in **Presentation.razor** file to **convert PowerPoint to PDF** and download the **PDF document**. - +Step 5: Implement the method in `Presentation.razor`. +Add the following code to **convert PowerPoint to PDF** and download the **PDF document**. {% tabs %} {% highlight c# tabtitle="C#" %} @@ -509,7 +540,8 @@ Step 5: Add the following code in **Presentation.razor** file to **convert Power {% endhighlight %} {% endtabs %} -Step 6: Create a new cs file with name as **PowerPointService** under Data folder and include the following namespaces in the file. +Step 6: Create a new cs file `PowerPointService` in the `Data` folder. +Include the following namespaces in the file. {% tabs %} {% highlight c# tabtitle="C#" %} @@ -521,27 +553,28 @@ using Syncfusion.Pdf; {% endhighlight %} {% endtabs %} -Step 7: Create a new MemoryStream method with name as **ConvertPPTXtoPDF** in **PowerPointService** class and include the following code snippet to **convert a PowerPoint to PDF in Blazor Server app**. +Step 7: Implement the method in `PowerPointService.cs`. +Create a new `MemoryStream` method in the `PowerPointService` and include the following code snippet to **convert a PowerPoint to PDF in Blazor Web App Server**. {% tabs %} {% highlight c# tabtitle="C#" %} -//Open the file as Stream +// Open the file as Stream using (FileStream sourceStreamPath = new FileStream(@"wwwroot/Input.pptx", FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { - //Open the existing PowerPoint presentation with loaded stream. + // Open the existing PowerPoint presentation with loaded stream. using (IPresentation pptxDoc = Presentation.Open(sourceStreamPath)) { - //Convert the PowerPoint presentation to PDF document. + // Convert the PowerPoint presentation to PDF document. using (PdfDocument pdfDocument = PresentationToPdfConverter.Convert(pptxDoc)) { - //Create the MemoryStream to save the converted PDF. + // Create the MemoryStream to save the converted PDF. MemoryStream pdfStream = new MemoryStream(); - //Save the converted PDF document to MemoryStream. + // Save the converted PDF document to MemoryStream. pdfDocument.Save(pdfStream); pdfStream.Position = 0; - //Download PDF document in the browser. + // Download PDF document in the browser. return pdfStream; } } @@ -550,17 +583,19 @@ using (FileStream sourceStreamPath = new FileStream(@"wwwroot/Input.pptx", FileM {% endhighlight %} {% endtabs %} -Step 8: Add the following line to the Program.cs file to register the PresentationService as a scoped service in your Blazor application. +Step 8: Add the service in `Program.cs`. +Add the following line to the `Program.cs` file to register `PowerPointService` as a scoped service in your Blazor application. {% tabs %} {% highlight c# tabtitle="C#" %} -builder.Services.AddSingleton(); +builder.Services.AddScoped(); {% endhighlight %} {% endtabs %} -Step 9: Create a new class file in the project, with name as FileUtils and add the following code to invoke the JavaScript action to download the file in the browser. +Step 9: Create `FileUtils.cs` for JavaScript interoperability. +Create a new class file named `FileUtils` in the project and add the following code to invoke the JavaScript action for file download in the browser. {% tabs %} {% highlight c# tabtitle="C#" %} @@ -577,7 +612,8 @@ public static class FileUtils {% endhighlight %} {% endtabs %} -Step 10: Add the following JavaScript function in the **_Host.cshtml** in the Pages folder. +Step 10: Add the following JavaScript function to `App.razor`. +Add this function in the `App.razor` file located in the `Pages` folder. {% tabs %} {% highlight HTML %} @@ -587,7 +623,7 @@ Step 10: Add the following JavaScript function in the **_Host.cshtml** in the Pa { if (navigator.msSaveBlob) { - //Download document in Edge browser + // Download document in Edge browser var data = window.atob(bytesBase64); var bytes = new Uint8Array(data.length); for (var i = 0; i < data.length; i++) { @@ -611,17 +647,18 @@ Step 10: Add the following JavaScript function in the **_Host.cshtml** in the Pa {% endhighlight %} {% endtabs %} -Step 11: Add the following code snippet in the razor file of Navigation menu in the Shared folder. +Step 11: Add the navigation link. +Add the following code snippet to the Navigation menu's Razor file in the `Layout` folder. {% tabs %} {% highlight HTML %} - + {% endhighlight %} @@ -635,21 +672,21 @@ Step 13: Run the project. Click the **Run** button (green arrow) in the toolbar or press F5 to run the app. -You can download a complete working sample from [GitHub](https://github.com/SyncfusionExamples/PowerPoint-Examples/tree/master/PPTX-to-PDF-conversion/Convert-PowerPoint-presentation-to-PDF/Blazor/Server-app). +A complete working sample is available on [GitHub](https://github.com/SyncfusionExamples/PowerPoint-Examples/tree/master/PPTX-to-PDF-conversion/Convert-PowerPoint-presentation-to-PDF/Blazor/Blazor-Web-App-Server). -By executing the program, you will get the **PDF** as follows. +Upon executing the program, the **PDF** will be generated as follows. -![Converted PDF from PowerPoint in Blazor server app](PPTXtoPDF_images/Output_PowerPoint_Presentation_to-PDF.png) +![Converted PDF from PowerPoint in Blazor Web App server](PPTXtoPDF_images/Output_PowerPoint_Presentation_to-PDF.png) {% endtabcontent %} {% endtabcontents %} -Click [here](https://www.syncfusion.com/document-processing/powerpoint-framework/blazor) to explore the rich set of Syncfusion PowerPoint Library (Presentation) features. +Click [here](https://www.syncfusion.com/document-processing/powerpoint-framework/blazor) to explore the rich set of Syncfusion PowerPoint Library (Presentation) features. An online sample link to [convert PowerPoint Presentation to PDF](https://document.syncfusion.com/demos/powerpoint/pptxtopdf#/tailwind) in ASP.NET Core. -## WASM app +## WASM Standalone Application {% tabcontents %} @@ -657,27 +694,33 @@ An online sample link to [convert PowerPoint Presentation to PDF](https://docume **Prerequisites:** -* Visual Studio 2022. -* Install [.NET 8 SDK](https://dotnet.microsoft.com/en-us/download/dotnet/8.0) or later. +* Visual Studio 2022. +* Install [.NET 8 SDK](https://dotnet.microsoft.com/en-us/download/dotnet/8.0) or later. -Step 1: Create a new C# Blazor WASM app project. Select Blazor WebAssembly App from the template and click the Next button. +Step 1: Create a new C# Blazor WASM Standalone app project. +Select "Blazor WebAssembly Standalone App" from the template and click the Next button. -![Create Blazor WebAssembly application in Visual Studio for Blazor PowerPoint presentation](Workingwith-Blazor/Blazor_WASM.png) +![Create Blazor WebAssembly application in Visual Studio for Blazor PowerPoint presentation](Workingwith-Blazor/Blazor_WASM_Standalone.png) -Step 2: Install the following **Nuget packages** in your application from [Nuget.org](https://www.nuget.org/). +Step 2: Install the following **Nuget packages** in the application from [Nuget.org](https://www.nuget.org/). -* [Syncfusion.PresentationRenderer.Net.Core](https://www.nuget.org/packages/Syncfusion.PresentationRenderer.Net.Core) -* [SkiaSharp.Views.Blazor v3.116.1](https://www.nuget.org/packages/SkiaSharp.Views.Blazor/3.116.1) +* [Syncfusion.PresentationRenderer.Net.Core](https://www.nuget.org/packages/Syncfusion.PresentationRenderer.Net.Core) +* [SkiaSharp.Views.Blazor v3.116.1](https://www.nuget.org/packages/SkiaSharp.Views.Blazor/3.116.1) ![Install Syncfusion.PresentationRenderer.Net.Core Nuget Package](Azure-Images/App-Service-Linux/Nuget_Package_PowerPoint_Presentation_to_PDF.png) ![Install SkiaSharp.Views.Blazor v3.116.1 Nuget Package](Workingwith-Blazor/NuGet_package_PPTXtoPDF.png) N> 1. If you're deploying the application in a Linux environment, refer to the [documentation](https://help.syncfusion.com/document-processing/powerpoint/conversions/powerpoint-to-pdf/net/nuget-packages-required-for-pptxtopdf-conversion#additional-nuget-packages-required-for-linux) for the required additional NuGet packages. -N> 2. Starting with v16.2.0.x, if you reference Syncfusion® assemblies from trial setup or from the NuGet feed, you also have to add "Syncfusion.Licensing" assembly reference and include a license key in your projects. Please refer to this [link](https://help.syncfusion.com/common/essential-studio/licensing/overview) to know about registering Syncfusion® license key in your application to use our components. -N> 3. Install this wasm-tools and wasm-tools-net6 by using the "dotnet workload install wasm-tools" and "dotnet workload install wasm-tools-net6" commands in your command prompt respectively if you are facing issues related to Skiasharp during runtime. After installing wasm tools using the above commands, please restart your machine. +N> 2. Starting with v16.2.0.x, if Syncfusion® assemblies are referenced from trial setup or from the NuGet feed, the "Syncfusion.Licensing" assembly reference must also be added and a license key included in projects. Please refer to this [link](https://help.syncfusion.com/common/essential-studio/licensing/overview) to know about registering Syncfusion® license key in an application to use Syncfusion components. +N> 3. If you face issues related to SkiaSharp during runtime, install the necessary WebAssembly tools by running the following commands in the terminal: +N> ``` +N> dotnet workload install wasm-tools +N> ``` +N> After completing the installation, restart Visual Studio Code to ensure proper integration of the tools. -Step 3: Create a razor file with name as ``Presentation`` under ``Pages`` folder and add the following namespaces in the file. +Step 3: Create a Razor file named `Presentation.razor` in the `Pages` folder. +Add the following namespaces in the file. {% tabs %} @@ -694,19 +737,21 @@ Step 3: Create a razor file with name as ``Presentation`` under ``Pages`` folder {% endhighlight %} {% endtabs %} -Step 4: Add the following code to create a new button. +Step 4: Add a button to `Presentation.razor`. +Include the following code to create a new button that triggers the PowerPoint to PDF conversion: {% tabs %} {% highlight CSHTML %} -

    Syncfusion PowerPoint library (Essential Presentation)

    -

    Syncfusion Blazor PowerPoint library (Essential Presentation) used to create, read, edit, and convert PowerPoint files in your applications without Microsoft Office dependencies.

    +

    Syncfusion PowerPoint Library (Essential Presentation)

    +

    The Syncfusion Blazor PowerPoint library (Essential Presentation) used to create, read, edit, and convert PowerPoint files in applications without Microsoft Office dependencies.

    {% endhighlight %} {% endtabs %} -Step 5: Create a new async method with name as ``PPTXToPDF`` and include the following code snippet to **convert a PowerPoint to PDF in Blazor WASM app**. +Step 5: Implement `PPTXToPDF` method in `Presentation.razor`. +Create a new `async` method named `PPTXToPDF` and include the following code snippet to **convert a PowerPoint to PDF in Blazor WASM Standalone app**. {% tabs %} {% highlight c# tabtitle="C#" %} @@ -735,7 +780,8 @@ using (Stream inputStream = await client.GetStreamAsync("sample-data/Input.pptx" {% endhighlight %} {% endtabs %} -Step 6: To download the PowerPoint presentation in browser, create a class file with FileUtils name and add the following code to invoke the JavaScript action to download the file in the browser. +Step 6: Create `FileUtils.cs` for JavaScript interoperability. +Create a new class file named `FileUtils` in the project and add the following code to invoke the JavaScript action for file download in the browser. {% tabs %} {% highlight c# tabtitle="C#" %} @@ -752,7 +798,8 @@ public static class FileUtils {% endhighlight %} {% endtabs %} -Step 7: Add the following JavaScript function in the **Index.html** file present under ``wwwroot``. +Step 7: Add the following JavaScript function to `index.html`. +Add this function in the `index.html` file located in `wwwroot`. {% tabs %} {% highlight HTML %} @@ -783,17 +830,18 @@ Step 7: Add the following JavaScript function in the **Index.html** file present {% endhighlight %} {% endtabs %} -Step 8: Add the following code snippet in the razor file of Navigation menu in the Shared folder. +Step 8: Add the navigation link. +Add the following code snippet to the Navigation menu's Razor file in the `Layout` folder. {% tabs %} {% highlight HTML %} - + {% endhighlight %} @@ -801,19 +849,19 @@ Step 8: Add the following code snippet in the razor file of Navigation menu in t Step 9: Build the project. -Click on Build → Build Solution or press Ctrl+Shift+B to build the project. +Click on **Build** → **Build Solution** or press Ctrl+Shift+B to build the project. Step 10: Run the project. -Click the Start button (green arrow) or press F5 to run the app. +Click the Start button (green arrow) or press F5 to run the application. -You can download a complete working sample from [GitHub](https://github.com/SyncfusionExamples/PowerPoint-Examples/tree/master/PPTX-to-PDF-conversion/Convert-PowerPoint-presentation-to-PDF/Blazor/WASM-app). +A complete working sample is available on [GitHub](https://github.com/SyncfusionExamples/PowerPoint-Examples/tree/master/PPTX-to-PDF-conversion/Convert-PowerPoint-presentation-to-PDF/Blazor/WASM-Standalone-app). -By executing the program, you will get the **PDF** as follows. +Upon executing the program, the **PDF** will be generated as follows. ![Converted PDF from PowerPoint in Blazor WASM app](PPTXtoPDF_images/Output_PowerPoint_Presentation_to-PDF.png) -N> Even though PowerPoint library works in WASM app, it is recommended to use server deployment. Since the WASM app deployment increases the application payload size. You can also explore our [Blazor PowerPoint library demo](https://blazor.syncfusion.com/demos/powerpoint/getting-started) that shows how to create and modify PowerPoint files from C# with just five lines of code. +N> To convert PPTX to PDF, it is necessary to access the font stream internally. However, this cannot be done automatically in a Blazor WASM Standalone application. Therefore, it is recommended to use a Web app Server, even though PPTX to PDF conversion works in a WASM Standalone app. {% endtabcontent %} @@ -825,16 +873,16 @@ N> Even though PowerPoint library works in WASM app, it is recommended to use se * Install [.NET 8 SDK](https://dotnet.microsoft.com/en-us/download/dotnet/8.0) or later. * Open Visual Studio Code and install the [C# for Visual Studio Code extension](https://marketplace.visualstudio.com/items?itemName=ms-dotnettools.csharp) from the Extensions Marketplace. -Step 1: Create a new C# Blazor WASM app project. +Step 1: Create a new C# Blazor WASM Standalone app project. * Open the command palette by pressing Ctrl+Shift+P and type **.NET:New Project** and enter. -* Choose the **Blazor WebAssembly App** template. +* Choose the **Blazor WebAssembly Standalone App** template. -![Choose Blazor Web app from template](Workingwith-Blazor/Blazor-WASM-app-template.png) +![Choose Blazor Web app from template](Workingwith-Blazor/Blazor-WASM-Standalone-app-template.png) * Select the project location, type the project name and press enter. * Then choose **Create project**. -Step 2: To **convert a PowerPoint to PDF in Blazor WASM app**, install [Syncfusion.PresentationRenderer.Net.Core](https://www.nuget.org/packages/Syncfusion.PresentationRenderer.Net.Core) and [SkiaSharp.Views.Blazor v3.116.1](https://www.nuget.org/packages/SkiaSharp.Views.Blazor/3.116.1) to the Blazor project. +Step 2: To **convert a PowerPoint to PDF in Blazor WASM Standalone app**, install [Syncfusion.PresentationRenderer.Net.Core](https://www.nuget.org/packages/Syncfusion.PresentationRenderer.Net.Core) and [SkiaSharp.Views.Blazor v3.116.1](https://www.nuget.org/packages/SkiaSharp.Views.Blazor/3.116.1) to the Blazor project. * Press Ctrl + ` (backtick) to open the integrated terminal in Visual Studio Code. * Ensure you're in the project root directory where your .csproj file is located. * Run the command `dotnet add package Syncfusion.PresentationRenderer.Net.Core` and `dotnet add package SkiaSharp.Views.Blazor --version 3.116.1` to install the NuGet package. @@ -844,15 +892,15 @@ Step 2: To **convert a PowerPoint to PDF in Blazor WASM app**, install [Syncfusi ![Add SkiaSharp.Views.Blazor NuGet package](Workingwith-Blazor/Command-to-add-NuGet-package-for-SkiaSharp.png) N> 1. If you're deploying the application in a Linux environment, refer to the [documentation](https://help.syncfusion.com/document-processing/powerpoint/conversions/powerpoint-to-pdf/net/nuget-packages-required-for-pptxtopdf-conversion#additional-nuget-packages-required-for-linux) for the required additional NuGet packages. -N> 2. Starting with v16.2.0.x, if you reference Syncfusion® assemblies from trial setup or from the NuGet feed, you also have to add "Syncfusion.Licensing" assembly reference and include a license key in your projects. Please refer to this [link](https://help.syncfusion.com/common/essential-studio/licensing/overview) to know about registering Syncfusion® license key in your application to use our components. +N> 2. Starting with v16.2.0.x, if Syncfusion® assemblies are referenced from trial setup or from the NuGet feed, the "Syncfusion.Licensing" assembly reference must also be added and a license key included in projects. Please refer to this [link](https://help.syncfusion.com/common/essential-studio/licensing/overview) to know about registering Syncfusion® license key in an application to use Syncfusion components. N> 3. If you face issues related to SkiaSharp during runtime, install the necessary WebAssembly tools by running the following commands in the terminal: N> ``` N> dotnet workload install wasm-tools -N> dotnet workload install wasm-tools-net6 N> ``` N> After completing the installation, restart Visual Studio Code to ensure proper integration of the tools. -Step 3: Create a razor file with name as ``Presentation`` under ``Pages`` folder and add the following namespaces in the file. +Step 3: Create a Razor file named `Presentation.razor` in the `Pages` folder. +Add the following namespaces in the file. {% tabs %} @@ -869,19 +917,21 @@ Step 3: Create a razor file with name as ``Presentation`` under ``Pages`` folder {% endhighlight %} {% endtabs %} -Step 4: Add the following code to create a new button. +Step 4: Add a button to `Presentation.razor`. +Include the following code to create a new button that triggers the PowerPoint to PDF conversion: {% tabs %} {% highlight CSHTML %} -

    Syncfusion PowerPoint library (Essential Presentation)

    -

    Syncfusion Blazor PowerPoint library (Essential Presentation) used to create, read, edit, and convert PowerPoint files in your applications without Microsoft Office dependencies.

    +

    Syncfusion PowerPoint Library (Essential Presentation)

    +

    The Syncfusion Blazor PowerPoint library (Essential Presentation) used to create, read, edit, and convert PowerPoint files in applications without Microsoft Office dependencies.

    {% endhighlight %} {% endtabs %} -Step 5: Create a new async method with name as ``PPTXToPDF`` and include the following code snippet to **convert a PowerPoint to PDF in Blazor WASM app**. +Step 5: Implement `PPTXToPDF` method in `Presentation.razor`. +Create a new `async` method named `PPTXToPDF` and include the following code snippet to **convert a PowerPoint to PDF in Blazor WASM Standalone app**. {% tabs %} {% highlight c# tabtitle="C#" %} @@ -910,7 +960,8 @@ using (Stream inputStream = await client.GetStreamAsync("sample-data/Input.pptx" {% endhighlight %} {% endtabs %} -Step 6: To download the PowerPoint presentation in browser, create a class file with FileUtils name and add the following code to invoke the JavaScript action to download the file in the browser. +Step 6: Create `FileUtils.cs` for JavaScript interoperability. +Create a new class file named `FileUtils` in the project and add the following code to invoke the JavaScript action for file download in the browser. {% tabs %} {% highlight c# tabtitle="C#" %} @@ -927,7 +978,8 @@ public static class FileUtils {% endhighlight %} {% endtabs %} -Step 7: Add the following JavaScript function in the **Index.html** file present under ``wwwroot``. +Step 7: Add the following JavaScript function to `index.html`. +Add this function in the `index.html` file located in `wwwroot`. {% tabs %} {% highlight HTML %} @@ -958,17 +1010,18 @@ Step 7: Add the following JavaScript function in the **Index.html** file present {% endhighlight %} {% endtabs %} -Step 8: Add the following code snippet in the razor file of Navigation menu in the Shared folder. +Step 8: Add the navigation link. +Add the following code snippet to the Navigation menu's Razor file in the `Layout` folder. {% tabs %} {% highlight HTML %} - + {% endhighlight %} @@ -990,13 +1043,13 @@ Run the following command in terminal to run the project. dotnet run ``` -You can download a complete working sample from [GitHub](https://github.com/SyncfusionExamples/PowerPoint-Examples/tree/master/PPTX-to-PDF-conversion/Convert-PowerPoint-presentation-to-PDF/Blazor/WASM-app). +A complete working sample is available on [GitHub](https://github.com/SyncfusionExamples/PowerPoint-Examples/tree/master/PPTX-to-PDF-conversion/Convert-PowerPoint-presentation-to-PDF/Blazor/WASM-Standalone-app). -By executing the program, you will get the **PDF** as follows. +Upon executing the program, the **PDF** will be generated as follows. ![Converted PDF from PowerPoint in Blazor WASM app](PPTXtoPDF_images/Output_PowerPoint_Presentation_to-PDF.png) -N> Even though PowerPoint library works in WASM app, it is recommended to use server deployment. Since the WASM app deployment increases the application payload size. You can also explore our [Blazor PowerPoint library demo](https://blazor.syncfusion.com/demos/powerpoint/getting-started) that shows how to create and modify PowerPoint files from C# with just five lines of code. +N> To convert PPTX to PDF, it is necessary to access the font stream internally. However, this cannot be done automatically in a Blazor WASM Standalone application. Therefore, it is recommended to use a Web app Server, even though PPTX to PDF conversion works in a WASM Standalone app. {% endtabcontent %} @@ -1007,7 +1060,7 @@ N> Even though PowerPoint library works in WASM app, it is recommended to use se * JetBrains Rider. * Install .NET 8 SDK or later. -Step 1. Open JetBrains Rider and create a new Blazor WASM app project. +Step 1. Open JetBrains Rider and create a new Blazor WASM Standalone app project. * Launch JetBrains Rider. * Click new solution on the welcome screen. @@ -1033,15 +1086,20 @@ Step 2: Install the NuGet package from [NuGet.org](https://www.nuget.org/). ![Install the Syncfusion.PresentationRenderer.Net.Core NuGet package](Workingwith-Blazor/Install-Syncfusion.PresentationRenderer.Net.Core-NuGet.png) -* Similary install the [SkiaSharp.Views.Blazor](https://www.nuget.org/packages/SkiaSharp.Views.Blazor/) NuGet package from [NuGet.org](https://www.nuget.org/) +* Similarly install the [SkiaSharp.Views.Blazor](https://www.nuget.org/packages/SkiaSharp.Views.Blazor/) NuGet package from [NuGet.org](https://www.nuget.org/) ![Install the SkiaSharp.Views.Blazor NuGet package](Workingwith-Blazor/Install-SkiaSharp.Views.Blazor-NuGet.png) N> 1. If you're deploying the application in a Linux environment, refer to the [documentation](https://help.syncfusion.com/document-processing/powerpoint/conversions/powerpoint-to-pdf/net/nuget-packages-required-for-pptxtopdf-conversion#additional-nuget-packages-required-for-linux) for the required additional NuGet packages. -N> 2. Starting with v16.2.0.x, if you reference Syncfusion® assemblies from trial setup or from the NuGet feed, you also have to add "Syncfusion.Licensing" assembly reference and include a license key in your projects. Please refer to this [link](https://help.syncfusion.com/common/essential-studio/licensing/overview) to know about registering Syncfusion® license key in your application to use our components. -N> 3. Install this wasm-tools and wasm-tools-net6 by using the "dotnet workload install wasm-tools" and "dotnet workload install wasm-tools-net6" commands in your command prompt respectively if you are facing issues related to Skiasharp during runtime. After installing wasm tools using the above commands, please restart your machine. +N> 2. Starting with v16.2.0.x, if Syncfusion® assemblies are referenced from trial setup or from the NuGet feed, the "Syncfusion.Licensing" assembly reference must also be added and a license key included in projects. Please refer to this [link](https://help.syncfusion.com/common/essential-studio/licensing/overview) to know about registering Syncfusion® license key in an application to use Syncfusion components. +N> 3. If you face issues related to SkiaSharp during runtime, install the necessary WebAssembly tools by running the following commands in the terminal: +N> ``` +N> dotnet workload install wasm-tools +N> ``` +N> After completing the installation, restart Visual Studio Code to ensure proper integration of the tools. -Step 3: Create a razor file with name as ``Presentation`` under ``Pages`` folder and add the following namespaces in the file. +Step 3: Create a Razor file named `Presentation.razor` in the `Pages` folder. +Add the following namespaces in the file. {% tabs %} @@ -1058,19 +1116,21 @@ Step 3: Create a razor file with name as ``Presentation`` under ``Pages`` folder {% endhighlight %} {% endtabs %} -Step 4: Add the following code to create a new button. +Step 4: Add a button to `Presentation.razor`. +Include the following code to create a new button that triggers the PowerPoint to PDF conversion: {% tabs %} {% highlight CSHTML %} -

    Syncfusion PowerPoint library (Essential Presentation)

    -

    Syncfusion Blazor PowerPoint library (Essential Presentation) used to create, read, edit, and convert PowerPoint files in your applications without Microsoft Office dependencies.

    +

    Syncfusion PowerPoint Library (Essential Presentation)

    +

    The Syncfusion Blazor PowerPoint library (Essential Presentation) used to create, read, edit, and convert PowerPoint files in applications without Microsoft Office dependencies.

    {% endhighlight %} {% endtabs %} -Step 5: Create a new async method with name as ``PPTXToPDF`` and include the following code snippet to **convert a PowerPoint to PDF in Blazor WASM app**. +Step 5: Implement `PPTXToPDF` method in `Presentation.razor`. +Create a new `async` method named `PPTXToPDF` and include the following code snippet to **convert a PowerPoint to PDF in Blazor WASM Standalone app**. {% tabs %} {% highlight c# tabtitle="C#" %} @@ -1099,7 +1159,8 @@ using (Stream inputStream = await client.GetStreamAsync("sample-data/Input.pptx" {% endhighlight %} {% endtabs %} -Step 6: To download the PowerPoint presentation in browser, create a class file with FileUtils name and add the following code to invoke the JavaScript action to download the file in the browser. +Step 6: Create `FileUtils.cs` for JavaScript interoperability. +Create a new class file named `FileUtils` in the project and add the following code to invoke the JavaScript action for file download in the browser. {% tabs %} {% highlight c# tabtitle="C#" %} @@ -1116,7 +1177,8 @@ public static class FileUtils {% endhighlight %} {% endtabs %} -Step 7: Add the following JavaScript function in the **Index.html** file present under ``wwwroot``. +Step 7: Add the following JavaScript function to `index.html`. +Add this function in the `index.html` file located in `wwwroot`. {% tabs %} {% highlight HTML %} @@ -1147,17 +1209,18 @@ Step 7: Add the following JavaScript function in the **Index.html** file present {% endhighlight %} {% endtabs %} -Step 8: Add the following code snippet in the razor file of Navigation menu in the Shared folder. +Step 8: Add the navigation link. +Add the following code snippet to the Navigation menu's Razor file in the `Layout` folder. {% tabs %} {% highlight HTML %} - + {% endhighlight %} @@ -1171,18 +1234,20 @@ Step 10: Run the project. Click the **Run** button (green arrow) in the toolbar or press F5 to run the app. -You can download a complete working sample from [GitHub](https://github.com/SyncfusionExamples/PowerPoint-Examples/tree/master/PPTX-to-PDF-conversion/Convert-PowerPoint-presentation-to-PDF/Blazor/WASM-app). +A complete working sample is available on [GitHub](https://github.com/SyncfusionExamples/PowerPoint-Examples/tree/master/PPTX-to-PDF-conversion/Convert-PowerPoint-presentation-to-PDF/Blazor/WASM-Standalone-app). -By executing the program, you will get the **PDF** as follows. +Upon executing the program, the **PDF** will be generated as follows. ![Converted PDF from PowerPoint in Blazor WASM app](PPTXtoPDF_images/Output_PowerPoint_Presentation_to-PDF.png) -N> Even though PowerPoint library works in WASM app, it is recommended to use server deployment. Since the WASM app deployment increases the application payload size. You can also explore our [Blazor PowerPoint library demo](https://blazor.syncfusion.com/demos/powerpoint/getting-started) that shows how to create and modify PowerPoint files from C# with just five lines of code. +N> To convert PPTX to PDF, it is necessary to access the font stream internally. However, this cannot be done automatically in a Blazor WASM Standalone application. Therefore, it is recommended to use a Web app Server, even though PPTX to PDF conversion works in a WASM Standalone app. {% endtabcontent %} {% endtabcontents %} -Click [here](https://www.syncfusion.com/document-processing/powerpoint-framework/blazor) to explore the rich set of Syncfusion® PowerPoint Library (Presentation) features. +Click [here](https://www.syncfusion.com/document-processing/powerpoint-framework/blazor) to explore the rich set of Syncfusion® PowerPoint Library (Presentation) features. + +An online sample link to [convert PowerPoint Presentation to PDF](https://document.syncfusion.com/demos/powerpoint/pptxtopdf#/tailwind) in ASP.NET Core. + -An online sample link to [convert PowerPoint Presentation to PDF](https://document.syncfusion.com/demos/powerpoint/pptxtopdf#/tailwind) in ASP.NET Core. diff --git a/Document-Processing/PowerPoint/Conversions/PowerPoint-To-PDF/NET/Workingwith-Blazor/Blazor-WASM-Standalone-app-template.png b/Document-Processing/PowerPoint/Conversions/PowerPoint-To-PDF/NET/Workingwith-Blazor/Blazor-WASM-Standalone-app-template.png new file mode 100644 index 0000000000000000000000000000000000000000..104bb4eadbd4d8fa72f530a04f6ef971c00fed4d GIT binary patch literal 11690 zcmZX)2{hE-8$UiNErY0Rk=>_ciOQ0g85(OPJ0T>=ItYUXW2clQYuWeRjAhK&#)L|; z8%vo%D(e`#8N2`J`#H zqz2=E*4fjH@8nMnCXAmG-bUK@0I0qz3yj1mM|C}Q0H7wGW#5jOkv`|CW8n<|obNdP zoapo@eGUM~Ky)?KP5f=B6XzPPIN;~jl*F%*bRW?`3CtITPn?oh7tjC1^`GRE)6p4? z{hv&=JfYf|%;J;;@Usj4XQv443`;CdBRt}@_(t&JCt!IGRy>Q z64b*_YodXP#GzDYU-&tVk#>&hvy2R0|Dbc~RopQyg0CebbEMn8aU?LLA>-woFC>|B z%+6~@YxKhnZ?G=ZAHdK_?8kN0rNTQ)dI3cOaIr-u#Kf`yq?sU zipetkc13`2xqMY!9T5`6#y@(C?YNueFOAHCKp=Pe@`U?bU)D?OY;NRGu|jh?b3W#m zSQkg(TwL6FC5P{vNq5!cQL03qb4xg=QDJufdp4 z;=|6;wK*2KzK;Ba30h6MN+2I|Mpkc7+{5!E#2k25W8rA7|m3nHStCjjFk7-u3m z#oT7$24R2Q2?)T%nN@C_(aXBKl}nR!;|vf0N248k(`TaCg_e&_ha9f=`Lz6t%2<*82z%BzaKW76d-mSg_B5!h7>sgsq}-&kbeB($*b1+5171cVx%s$`TE?vyY3iWB*nY zT%d=WJJ)goYp0Hk^+5_qTdz{fq9BaxQ@0=H;|6m0qcD~mo_-T>^WyBwR&y)CM*#!~ zeZtSS1?1dWDG1WQvh{=a+ydVvcIGP0X*SYP*3DR_Z#MPz+1SZ|75o@}r`Lm)GbRt>JY_Op{wpQv z(cLbdUy8vSv%T&=YaNiSqib0!ft}IfTtir!nlSQYi9xPsZhmW~eVp=Fo-xbA2e!M3 zImLFtDW%om!|gv4W34oWBe1n`K|*0rlFMG{r`+i%?EZUg!G)%#rkLWgEH3OYg~$(N z0>(|#Hm@-!?QG0-?p48bRZe$p+}q$9$_`j=+{WKU&Sm*!v**p2sLVQ3g7()sC*lND z0=EZij5&sCuCbm_gI#zHz(_~Fhmo+F!KSqDQfST~t0NkYFmdJz%guZnwn$dylRJa) zNRv%L=Ci#*D!y*=MajUaoAzI~DQP`WcFLHG1s1g8xEp=h0 zf!gxOq=C^Ys{->^P2nFA7b?$=LGb_q0fE7buXfF*X3d-ad>lk*#|u)yhimbjE5^y%OHU>e9SG{j+T(>QX-tL(4Qcg25*4SRb^_~2kp$D>C=p>LqdWlV3LR4ni zr!lzV*RXNtk}NZfo~1`4bug>1eL8sYW;upxVM@{-q`CaaT=sck*M{mIl6Q^v8txlG z?F`lo4JZp#NJG!KszaF-$b&!N4@VHqKCvlL+mS0Ho)A4^i@ZhLt8oNmyN!LtJW&u2=ED;kM=H#lv$F+p&$}+tTj}_I!b-%YN2^L#2UJ0`JsINNG$c;o>$oeR*bwsuxN5KE@d+or`%6`?2p4)$5MiK+GLc{mS-*2up z-R`^7AzRUI!L#P)>)Qm`pJqSwPBd{6Ld@r_VP9kQ_HyYiStB$H#cObokjL@n?{~1ZRzLX2Meo(ydakN zwA7DE9@$p)E~a0o7hvHCGN+u6xmuMziTBXJ&7+S+ApUrykV60M*iikB_dA;`*>p6$ z;@Tr9C!7VIrB8M{p%y%#=d(E_ z=-gZ&o@1B~P`hLxY)L={83JlQU1~j6wflAq7ecTjo*)f$Yz_r0y&FLhye*r~#1QAE zYI)ese1)vTl>ECl29u4bL(pN*P^Ul5N4SjD?@)L0Vsrj=h9bblnX+_yVz$f!p0vC# z%g|)~$S=HjS@a*+*(yL}T(Efc|Mti6KFoM9GE5g3KOtC6#;%s=-Y^|C&&4qC)&KR@ z|9@php#iL=B1cy6;m&f#)PAuQqhI8UK$$PUUPcnO$T7wGIm@l
    g=vUvIQL=+b( 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 T?^(ta2Iy)&(m>sN8utGHk5KLF literal 0 HcmV?d00001 diff --git a/Document-Processing/PowerPoint/Conversions/PowerPoint-To-PDF/NET/Workingwith-Blazor/Blazor-Web-app-template.png b/Document-Processing/PowerPoint/Conversions/PowerPoint-To-PDF/NET/Workingwith-Blazor/Blazor-Web-app-template.png new file mode 100644 index 0000000000000000000000000000000000000000..23d65753b33844e8f7bc5f2dee10dab594112077 GIT binary patch literal 15007 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 y|2Qrvc%@&U~VfUNx=Yy21T6 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%0Dc|M+{)5f6hc>(<+g0( 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 z zsd1C%%2JLp+&&mdp*x$|c=A++stFrgYZqs?6PZ!`n~*HzhsGWLa)k8LQ3gprp7!kwG#DgZOA=XKxSe*Qb+V zKz2ypr%-9DbFi;IAyjSl_F3P6*nmbYf+0quR^GOy(5Db1M8|U~og-iswi_QB`efsA zYS+k(40lUO52|r^&{nZYQS%@!fye3Ka^-2p;et&M=s^IQ?$v%9cw%KcPED z(lsmnfTsYJOTYTCafj7FjAM11I#zcAB_4BLYAfY>@rmMV-3$ee_;muteLS!OV%|CG z3kBcY+>mAGguTC<^xZwwF_^1)Z!A*w5E;uthFRR=wl;SY-Rz0a+;;5)@(?l!FZ6mE zdBgJLDMJ)6=rIs=%q-aaOT`dGe}@>SfD;i%u2=iO!N8oZo$vUTUg_|{st|fu?w`<& zEMdnOK~AhT!bfFY(};Dfr1!oQJ3Np2GF7tN22c#dStQiP)*XwQx3q4$g&B?`J?lw> z)=}$o(gM(IosX=a9*nxkB|>Bo@pfu>OQX!aF2R?!QzQa0!4bzN4YAYje@l^Rww~oL z>AFh52|-^fY;V(}c#h+wVc>lgepcS6q*Z_`K{H>7QaLT2#5rc0#~2oz2=8O=jUVz_ zyj?;0R-WOFd+LtI6ui{Lk{Z{(P`?GiNIk35YtGj=|JadFK$Q$j+>Fpibx$XAaS zNIfjk{&%;>oZ)6i=2~BoRF|(HukN9#(>dOmPlq3__>|9Ce)Ci6Qy%+wy6LPOJQTV_ z>YRf^FZAIc&JjI)t{OQp2vT$P_6RS*bF5D8__IS7{w;z%)vCK|M3z*+L(Pu5 zA2lD6m)0(9q!H2NTcZ}Z@0djGTYQ>aTU@uZ_Bc4E$P z_rci%rkiD#&+jH;hF>usOA08ed$1Wf5Ga*Q(NdcR3h^%(L~;IvPg~kZ)yiu^^ z$!B95#`^_$knO@DK}b#v5Q$`YV_&f@0DM_E9oJI^zorOz>AuWKzAOih=zq)WwF#}> zUg_(6Bfu20q539{)NOB51)k%;tEZWKLS}oU%-%K6vdG-z)C%W%&ClBMKwVtuNmm1@cBi{6@Re!QZA3T1*RO1IJ4D9X zLsMgkHyy9*PnUhc%pKoSMrjOZy9&N{(w4-%(v0bh2z9M{T(l0#B2P2Fvt+6 zlL~Mw>#Oh zu6mw=Sy`=uwQVs4Gy=Yn+gvyA0_mW^dk^gu`-jx=x&~5gCu9WKFJK8lDQ-^S^mN~h zIvzaoY&?BU;KPRxS%+uoHJI+~oGZyXmT~d5bMQ0-l!M<0@=G*#b_|f5o?5!PdxlRo zc|>#B^|E}K%iG}ypx&(&z_q&Eig|8u0m|3bSvFxh_Doxuff^2x8^h#g> zHDa&>Geh5eEph3uim13o5uC`r&kTo2+jked+)?`DdNf!NxMFy-^pm!7`c~ZmI9Ybm zqzXXMXgTz+D#&|Y{4sp9QPsgx!ec|U_Z`(veLsdmSeG~KO_Gs5o z7o{x4e*ai}WJo9=%Tz%SFdf&`H)i>|=q3vT=;=E`_0CF>hcV{!Z>{i%$Sws2k*G-y z_+JND=M@rPqN!!Id)I>oXcD?O&{cZ$Eh>0_&wBn}q;H4fpSW7&(c+RP=qHg(#Lba? zSnEdN0zyzvB|7JoAj$788f~F0FAFZeT^>jEt#s6o!xLPCP}mF?Z{BS!)0FjDlE@GV z5%A*dKfmUZV}`Q9eBV4TS#{BDE6S=)OQ$rMCpMhWfUSp#I3wVP`pG=fc+FfOY2(Dzz95Dn%hq&PYU4A}3kw>gB0l4n;lyKVT^n^c$; zuEx1L1(?9qU`K1i8oIYj$CtB-@@Dk{?H~WROIKR+K!=8e=}s-&Hh%CZ+iok_S~3t> zH@Ql9GaRwFWf&UO(uSkG*}f7O;0eXsi!9FnPTT!~7CyN~n!+ZfemE_$zeWHcW98X1 zay^(LdspubKEBm=osy;7H@?<1@d+xFS2x3ayyHdAe#q93clp9bftlOm3v_QaQfJ!) z>b4~zClQEaE6|+h;!YKmpd@k9fnS#}Qqb}YcU!)$Ww!Ep>}Us zwAEmXG-#6_Mxv0nDH*1wU8^M_ap{^7mQKY4B}+1&zdw$BIWa>#(aY911_e1hQO5c1 z1`i`yJvs;Cr$hE=@N4L084}*+FLpbejp`E z)!PXXAROf%wWBkRy!-BA`U8#M)=<*VQgD(hZC4r7Vw&bZ467$}jNGtdDn{)Ts7O3h z`M$chK@8B;x1yTu8qx_5Vh)jLj<6`L#S{P?%N0+rkxXnOmmD2we~Yao;s#%NbnBiM zvW#F|E?qu;BusHU+EG~Q>?rS|M!Vv7@(2+~XL$ zE@1ItJ3cUea?uyQNg2hw=YM|SEidPU zI0m}s&=Vr|h<2ui{yg3y$qjw+SZ^w??iV@Z;fUSNPS45QgV-|TiAfV;A0P4X607`D zK@z@fQ_j&5#qIv3?KVXfvl26%)L5w5lla+FyXEgb%vc;%z-Aoc{ z5`n49c*`FZuO*H5>1iUXudL6+Q^7-v%pbMW1*K}sP1-{a{n6XX#ojAp*XgC5BCn^7 z$ZJIojusHX_i6mcsrq@X^~B4CA~a48j}P}K``E~GR#xydhdYo+QHwCyRWgQ%0o~`y znQ_Uf`e6|hV%^15=E43CIxsq-)kZtAd{L)n1+_(!mU%@C{6{(PxL4qfsi&`b)F!5l z;=tesib^FcYiCa-y{CCua-4wE!=s(H!;cHc2%eOFR_{a6MRM9O~A zF&Jsk`@9dT3=khwAOHTmI|{oX$emKHYXpx_^^+bl#U5|4k*xLT1A9(G zQ1pos*gV-E?_%wc=T$Cqgb1TB{KfB*GG{4OtKSMc+;vj5Rx-9CP%zZB)awAHfCfGT z277Rvrral6MPs1fIi+v+2B(fx`|VSv>md&bPdKB@c{iKy`XAhP{rD?imm}jeSm%gY(yW}8Ac-esT8Sfy`UB4b6f_9Nd!m1 zxNf%R#S<-zilVgT&NpM7e)o8T)29Z%1r|z#p4hyj4cw?ZiF~~{2|=v0=$@39Zzw4;!MfE31wjctlS70AX!g9Avv>B10gF4-DblX%jW0kmFM zl@bRrD+Y-5oNU0j%HwAJQ|37QC%DM7pEQkavgvI~ZHU%*6o~g{{!)@wSFR4CD^jmv zr1Nv!xD$?E|1lAJNo0}h80&51()m^V8L(vxy$goK207*ohNbt(7mFDLgft}OEI{&g z4#s!TEW28ydi1jQz~=6GL((_T!ansQ`m3hT`zaw>8;x&ki0GOE(fJSGtNG*`)ek98 zlBSOW+(Ujk$+(|I&I&4`6=Dete9^adC^AB>Qf7fiE&{j5N75& z#%a6}k(G=8)}y;g=Q-ana!yG|oM534PCzU3#$wg@my+m|Zee~A*j9*_(i6- zXwTxf|53jDU8T+ywpo*00$o>Fn8l*#49BN~_}Q4_b&AQ11FjyOBqU?&B#)g_X$L$N z1Opqba6rIh?V`g8Bn1uCM4A3^C%nN|1kJO~UG-Li)s%98viZsXpRj=}Lax`|3WQCg6 zz{Ls>n0#2hIrMwX*^3_i9w_~NHdfZ=g0OxN{)wC1D(bkYW`YrbrDwKWjZtyD2~1Z(RZMz@!>z?aTVwD77i=7?;T7V z(7oQLHTCHB^nyi7th-=R4EZu0=T_Y|E-n83d6up)G}h|reuBZDpTEa;7nuTx;gyJt8%=Te!l`|Lj1M9HEDSe!0l$B9?r zy_O*B`WHd5cH$K6NKe_i1wQ$b^6vM77C~+dhK5%Li{xFb{q)_UGn;n#)RQzlf%^_a z20BhJs%j(AMG%7Q9h!dY{>=fmYo4v?*xik0tCIIVrp%fgTP+~s`x*`FP2+Z`0M9&x z>~8n@4zD`+!>ra0FZeH#;aw){dxu#e8JT#Z3Vf+^%wJ{u)z&yuL#G*8rr{G-=xlcP z(v-wkJ-uY6Bf|DM)*Zz@d43?9@wzP z6>4d~AG#3p|0V3Yv!fc0?Z@`C=;8MfN~@x7^m&WcG%O|hxb4AZD4wrWF7;4!XnPg? zn!AJG^S>X*p<0L=+=6@;a+{P6o11%XLG-}@IzxKkst@u)@D^CC3AGn1hpyv`YE%@8 z$>PZ$Z@O3a6P_wqSx9xhyd{Ntk!`nHBs1(qo+c)``doI!s(vHvi3xtie?(Q)U`~cw z{LB~;_YptT4S#!7x*){r!8|RO#OZ{*V(}*1+!dw~RlJ=lL8ONjQ{K18mNiGf zQKDp~HONk&^?bv^zdiSw7rW$)wu&2#+*L~CQL{Z1b{Pf=4(5bew`)C*#7I{U6Nfv= z!y~X+#g^!|m%1hvW)ky9{j;P4h?gmb=BDgEGww!$!yg$m@UgC8)f)=IqX!?<5x9D} zg(mf3E82)XVVk1uIHtvO^HSdbM6CWZ8LrOzQRz9ct%?ugO1eYWlhDZMyP&X8l}VCI z+3o#)QoOJl!+=-`=U0o8=rR@xW+n*I)^QH1D!`^5#Tz^Hzb5TioMryTo*?Klvf8Pn zGR!By$|c6IDuhpysbl%4jBbUAsh{&_&#)^s8jlDHm%RNdJEs?h{AH8Tp!Yc?Gw!I8 zDjX*gJT{9v&1YKLKi0GJi>gaqm$MQUDKDE8U(U+Q`{s$5@MG=tFG5na#WKr%djF$8 zblv78<4ua;!+_QkBRSSd$7*oiq=i~Z-^E3PJ6pv-p1j*znk5AabJG2JbYFbh{+U$9 zFja=S^1hBs{7JF#shK+)JBHTPu?3m*~Cg93kL8Dz@2@p zdB|0OIq1W`GzHd$Oab11i+vL#egAKcMSt6Ug_9ur35uPS^;le+E)Fj9qnCSQNfdRU4Jf)UdN8jf(|&{_UF5O`kg)6K6pQavT{uHt1ltc+gs@s z?Oo>UFb?!`MrzRBVC>xhD&w9;w7>p66WDb&%zE!7gH~zahUl?pQwK}j_XEr1ga|ZC z$crNOzL4phmPrS16w}T4W~vq3G4rSCQ%ADfK7DQ(?|o6_ zg~4VShdY)a`CD@2)*Y8)WIwoXYa#lH34@5v z6FNJ^IbaT*vX`~wNgR)$oLD62fbdMc!XiK|VyhS@m1--mxB@6@O~hY$G)F$P;_KbcU&rza(XkWWE@OHhi;sGekRM7U{Z?=`tFIU9Ub8dm7%OQus8 zgxIOjPo5o*=ynZxJYAp1%7&x8Tht$S+>Kvl$6N91GxL5@7&DWC-+uHfgukdRX*dQIf)JH-om^Brlak|Lgzq6 z9jA!s!E$O3-t{Fe+x_8QNnigcHX)(64^eXa654wa7!1;$k0N@SqSfB0nA;PASW~n= zlSb6!Kd0$6UM0)=@rM3jHwv`G8*VnJ6S@DEl`Q#lWH{p0Ltj%cS32It4@I`tSCyG) z+S*0qeLZ|fugMQ1#0hhIOfvsh&Eu6e^U{jS7ryUkSi^!oYa1k-_Q@$K%gZIUp@`jw z=mo{ZqrzPQ-L{mhr*9wD3}tF(kw*?+%Q^BTvH?o))Ya?Z$0YLJ&caK#Yss|xMCn>& z@O8G&kmpee9a4X;`*`+A;BW;)L#CAw7$|~jY|aRb`-W!kkaV?~uGYZ_T;A6?NJsenxu}@vd)GiZg4z^2Cuc>4AVy_d z{WL$L{j!NE$x>eV)|$|BKCEFQ%J25}S~|u_McLAhH`2xve<#AM)9Chjh74xu%x9b| zg58w-Lfp*Bu)MG(wl@+Yo2A|iSMjXd+HR+XaNtO5>&`~ktA_~>qxpU}hW8XJ&$6ZN z(2#wH>MDG$tLM@R=&gC)^Ph&j8UNY3djEaBA&0Bb{xk9my}>QfY_9_2`$HZWD(WeP zMMic=lWSo0?VsnWf~u|A)}lFdG#O?QJ(c^&3mi0f$?WyGa+`=*MYgWrqJ zJE8@Tz6{ZFYu{LpjK7wXlpg%cwo36mzAZ;jLaI5xt(wl6KgaHHx2J#ZssDog>Y*>D z3O`Ok5i2$a!zV$>ISdsa&BvQXU=B`<+tx!@Z}QWbudC;?kQc_b^cuNx2_1e!Zwj!? z%NYL=Wt}DlV04k_iZR9AJ6t07rS^W-i4@B?bD}df=~t}+LI-O9)z!_gy}yB3e|A1z zLHkV#>R6={@95k4t z>J9*Q`$1gaO*a;_@e+(WxAl*{j?mO1>{Skc9&Ciym7An)vafeyYg!d4u0n-u-^4ep z9vF&?iciOeGKV+xK9Z0Mi1C|D^ShCvhaT)!nM}g=1E~_a2>xRg=31bYQZi}o=FMm2#cS^UV@TJr_cS0haV?8-k*by)obarc z;ggwdtC^XLAUBNuOlq^$DGpn?P~LBhSL(sDLhTRH3~lyi6&b;{Qehc3nqv$95Nod= zp_|11L2imb;{OjR@_$-;lF@Y@|JKCl=*s-okGNR9i9)`eu?C*!-=+3mv5O zyK=DZij~9Wo2=ic3y_mdB<_AwDlZe4d%iJrIWs#eBq0&KvSN02emHU@{53tD_9P~{ zt@8q%;}6N2nVH%-`bNqULgaC(sQC2!T+`gfTU9c}Wgk}Z6!kz;Qe2(9YR; zIi;b2cw>_?ucgHp{R@X|bekgz-R7aMKPx09CSYrg#t1VSBLbzVwFs0hIQRSamrhRE zhyeR=qt<#3scd{kM$`NE1iIZj9Odm)RNg(R7&5B$C=+LZmz6pEZmaAV9K6oy|18js zf6qF-wzmY|JK0RF|6JNsXuFe;d}|wV_C$?{^3(-o6*{~QY5YIoHDMp`++E?_8^TTn z%+J7yKc~G^YwH%j3m~*s=!Z%FkFz!dL$V^pR2hc^)l^&UzZet~$OD1^1l%))wh znI1;=ST0`Q)2)|hrWY1s(}BUX8X6k^tbJ&?I}{N1Ih1pgu&rDIsIpP_=7^A%jPW38 z1$$&v@cwUBo{Ne;eR+L7Iv$LJBoeB?phq7E`;5kEepkM=obRo>pXcc^D75`KZh9^C z#Q4O=SkOB}=qAERz`1NoTcP#!({JZuWj;d zV>92m!sJB-XHI7VFzZ6Prr*pF3C)Z)+sc-?JHGwP>b@#otqhE<$Us(8!Pu$ z7n(g@b%9+Hsw4jhG3LrOMrzWg_I3>~U2j6efl@4+J4$_p(|2Sdiu za*wmFxQeK!Cq~rQds)ooJv?h2w@=vF*}3OFU&o@)!f5ifiVy4|Rr*YI-5W*4zhLMv z5jJvn_ru24RzX>r3jTJ$#PV`nXD4fQIX^ns6jc3|#SZ-7p%eCVS1CSW%rfv38V>(_ zXTPZ!UD2NXMWaL~CsP2+FCd@=Z#RG~orRB=H##w5WlJh1y8rG_5~_AWNQp+g!%qT@ z{y^AEl5H0+Qw}8NjHuCr&kz2$0^9%1g8rWkPlkhZu&Xy7cc>p<1`BBY!|D&37lZ;a zY_Q%7zgH;iXwVjjOc-CtKsyCAkRP(Y?}{twYsfN89mtDPez-9NLnr^L$qQYleXZrP zPpT%YA_ouym+hRw-9v)8iz10Cg|Fc+>@e;)e|W_kD74L71pX5MfMRGetWgEiH6P`# z*C(G-vto~uX|3~(D)h{SGbeP7!{gWJ40yltY)x{n0yP#P6XA(>$7NeB?#(<=RpKjB zpwqk2fWi4o%}i%pUghwq^VM9&FVJ@jIIuwt-*=vC^pzi6sZpI4&G!EH0ii&kOcp1Q zuYpfW@mi8iu8MBC!pn|1<8$0cvzC~1qJ)!XZa%`JhGPs7+p%H zEj-<@N7g<5bg@%bq!1L4 ztqGw|U)SC}?CW8Zl_eseeVc&h-Z#)suM(IrZah}HlOHpa*!pOCCJ2}plu*eB-$lRb2M!bKS6eslG_jJ)YY^6#?OX;U*X<g|5sfed<~+cVg@y3f>~C92d+SKEyv{#Xl@NSao(A_mU0Ozd{=yIj|0CfW zAYu8=TG9PC+Zw@MGSl9t*dyI{B`Rpyk~q>Avjp;7hdGJH`^2PJN|5tl& z85Kttc8MlHkf4pb26t_oAPor?2=2k%U4vVr!Gkvm1b26L=@6U{tV3f7fev&+RuLW-X~U2y2HVa9POEm`Cl6)eG^6)Oq zjw+|$&zHMPs(aY&0SDydnWn*Wfpl*?GeI z(tSE2*5yD++ft^7IU4`n5_|H@?vB9ylY;cA!?!(YUS8L*bT@zKka+%8|7tg{I#IZ) zsyxH-tG9T5k)BJe4p7QfW`Wxe(lcr+7mMH%7v9Q#dbQm0&BdCTmiaFt-Kv4|&&M}k z{DB&c?pg=kSPtG=Zs+J|+Wa}tnQ zGnh(0-vd8vZv(T@_5PaGDR{>;d-B}}?S7(TdyalFY#Px?u@7E0Czt%bTzch8Yfzr> zXV>eo(RVZ9y9584knYBW{2xnqj=|k$--VC6PJ{hf%v$_yAkBhKFQXCjJ~jCT_d_8k z0XbTa6dd~0_0wVcYv=C2(C(-8$bZk){MSSbAP9oD&`VxHL9fwU9?+`8r(4QGdH?JH zlIXbNEeaewtoss6?oS_ark=L)T;cw>lFF>_=M?M| zy3%qNaxcE+x(8UJUw5m3m+A0odHa>{-x`$}@T4Rs2yEUL`x(L#trPc$);dH+deX{m zldW2sUu>karcBl18-0&{Z2p4|paQ345=5k=xP9_UvT$y|?uTPZxP~kWlyts-?5+uV zHpVfO>2LefmU~(f1qHR=^-`}iKdHE@D98t4aqAvL`|~NDiu9#5QX-MXrMab)2&TQRBJkU~IzEi8fMHT$5TmKNVpUMZO3JUh1_(vb6IcL<1#hPs|%T}BVfc8kQMUt)^-qrGwpphXNn67|^B86s(g zHFrGNg4bi7pD9|85>PfUxedX|s-3IdB)rjNvl@z0Z&9Fl3(R6CZk}@fhnN*w@^1Z1 z#QY4VZf-x6EP|e(?40q*%*EnMOU55nX}1O5SXfyQ-re1i(;O-pd*Q$a1~nGN?VRty z-?8OAh=NypXrcBDKC;!;)}g0oBg`Nf#*9<$({SY!5d3(u)%m?Bz)M~gjG{NoR|Qz( zepC@9c-Wk?Nd}jskdq|&Yim>!)EE@FjthtZkJJVDX* z0eK#HIxH8y7o_u6K;*z10plEk@UbDBp;0AVrtx#w36Ll_UsiR^uK4^;gv7Iw!C6vOa!3ycKx=*l}J&KoM!u zM*YNfcfO>ietM!OUXQ*`HN%J=j@}|Y-yD89mU-JIMOhmh)Ar9N!!@Wq=8mY7u;6=Y2151^`S#yYGyhVm4lW^ye;LF$z)HH% zL1`kjLr#%93WQRycLcB~jG5WoUnSo40+gP2AfTqxH`N5zlcWWmjLV&h`YYdm7+;`j z^%Ca>EHUzx&A0!u!2b&+=zn#WG?azb!tILY_jjHCSm#XJSO*wQ{;h~%xAnlvWoxRh z-U+q?xJnoJ_>vU*=(CB5A96OisHuT4%36nw zt=mvXhh!t zX4@G~-537j-ut+UrzQT-r38J#g;`qbit_=! zicVaMF7?R6V`uD7jw?W zP_An)YDu;p)1B?So3Mebx#r2~skZ6l)o#w8>pams54V`!LU6@eG{MeZZ1^I`n$iHh zTR1kJt0o=ijs$XA45!(_;^>+ALn^hfpTYbdc*xZetW{_k0 z&C!}F!@ml{dCf_?MbqFNl74Jo&EopA`Bfs6tNnFLi*&)a(^h;7|IV8de%{9n{OxR$ z(+ZewiVMbn>_ke!IR$ zCp|Ei=Y3fjG+(1s7D|>29Q)%M)iEERK&+QAS*}+#j7_;wE=w`f6}`ZEOl5Vdky5w- zqnB!Ch|#QDn}@r2c&`7J0uo}1*AZ>2;35p`?x7a*f3H7pG^bPWxG>glYD(48Sspsv z&OSAx+J8Q#B6?Vu1m6n5Nto@knk%a5dJx6jtO3>N5CF$5mIe@Kq+6P+mE=7KEIZ|y zHX1s*3117$kr1U`xXU;OSjPD70|vtw+8(F7CtVdG~9`7JUqic8w|0!Y(Q<$oxC3dVV+0_*C9v@ zl&!o%V+=o=|Op7S`YVH9cB7S%Kmdpk=_^w3fr$vf+a z0Y(cx_FpD0vRGdMv&6(Zh@~|@2c>wiAZ12ME!m%n%uTrG=P>A?mD zIuTpr2IRv5Rz@SGWa+`d$F}MB;H>g%=A+*OhDOp>xj%8)Fg+h5 zg|%4R31*yfg4s5vNGhbVk62yia_VScq-v_Pd`2w2?RKZJ;wt;8>lxrG0wM-xR zo}`3r0|VnlClf0>nu~ckBbzIfhB@L7`9~tA9~(C@noG+G@~+a!KL=hKclkX$mI}r^ z@lveEETApJ8<3cxJYg`T^w^?L3LGw~pvS6_b^kDtI7$_xZsFuXT`WyI#=)bM&`b3a zdXPfA1+Dr>7c6LlbPJw5)H1KZ}jyY|2sttdLDMv zf|?n&@(+=^!6$bV;B;MKwyeY<^bUrSBFwlS?qkZaBmR2e z%K-6WYt>5CLP|Hvn3+fPw=e1Cwmr>>4@LIDkO!)fFJ6(0Uk7gb{1QUXM0{F1@%|y_ zw9Tww79ZA{%*rDCG&lr@@XS$@{Co02h_JZw8vE?N^0D@2J=pCy+ap7fatPs} zg1A#RxvR~1ziwQ7480-acscC=v7eJPqW+6YIm%%8W4-Tu#_`Dtc6Atd)S?N$f2*R! zpbr363n9GmK$6h&REM?z2pbKxe{eU>B`xEo?YkjH#uCE0*`41}Q2kE^>Gs!-FF^!) zC_59FGh#-`vQBkm;lp>*CwKP5@kwbhX5^Wzs@r~)@HLIcW-?~!!as}Nb6{ZEi=B8& zCaM@b!aV;u)V91Cy~`Jg5P5ijbX_4PRZcN#Dl79qN(u$;y^t#uP_;aY>Uh z`NPo5CrTI$+!ELuA;lI|=yct8gp80q9>!%l({Ff~DqLEn7)>YcK7B{gv>|)R#h!{G z9idOb_zJAC!BiPAoKbW?CVuwkUI%Z|XTR8Xi{$`M`4}zGEO~vHkD8M89IA>{jX9|I zhJ+AwHm>3&Cq-cJsirG4%RKU`jh^cx-5w39W+n|Zd8Q3|LV z!QO7*r!w-dlerrp*pw4xtsEYD5Xlqd=;2R$VW^w9X`=KjQ(j6? zE6KUwQYZJusO*cmx%)&We6GKnc{V#6ady@C;e%`RVLf<@xSr~SJJw4aJtl?t6KQEb zSb&7YAL}G(CKS?(o($bfG182&g3CVRtRQm6eQFcJBWaSapG4=_fV_#VVH7W5xr3}aK=N)P|KYzi*S+Q&t%2?-?C_v-yPkK*4u=z94=21eA zHxY*g3MgF@_12g-&p0UcE#brObACcXBIY)-@7IT_45)|pcSbdJmvCB%T>Dvj6jo-( zDfVIA1$-`4!y%pu`Y(A5R|EN0HKPQ{@-#J#lHv8{Xq|boHfnV7Y4Te{nUNh6L4J>h zi%Wsl(cNOwCv77J+TZg`ACNgDojJ*`?)yw{0BR1QY+NoJ{Pc8%|Z~dg`NE zt_9xNe6?`$(XnrHQHfgJ4zl{1@yf-SNYP)hSCq`&;E}$@VV#IfSXe!~Q_T!LSORqz zkzuhx;#56VRM&*k9UM%aOX|FAEUW1w-hj#fH!^aHeT~JHJkh=P!ECJG?j8yI zv0)C4(w~zy_W8w9QgWk?C8-**?B0*jWSr zMtlTa!BE5U^l3q?qfFsF4QK`dDvZa8_=;dl%T$+9WkWyUYM%?XtL5cG`=mrt4Km}4xS7!MRVeC~ ztXd~`)GlahxUnKPP>fK=N^98FGEcC;2>Shm>Tur2>Lk-SZL%@eXPgx|b{_mYovc2H zzwl^tjCGdng*$wIC`iK0!1zaG*0D3{#{qc_a92^+`z94H#$DY034vipN9U3rdJ0on z{%kX{!_O=FjnC1xK9{Y;z5$a>wsJ|F0ZLpSKq-t6Z*AG_va$0m^yS^ivL?OJdUGtC z!@Wq*bLK~BEzNH#h9_~Dkze`w_KC_jR{sPqiyRLbwinzl7oA^<6LvCR6b5yqp6|=j zeaFA*d~iB0(U9MHbG(BvD*R|EWU$7RoNBs~MT(&Kla*X9`t4MIVirDfDl`xrtg*r4 zI)_*ZynmCL05jYvA|g`P(BNUhkumW#$c#cDc8&7&qiWrVsCEN@l+T!XT=?gXT><$; zyRxpW$>H`#4b^h*-|IsHa8uP;D?uH%cf-qTai@n(U^lF|AfDfecjTY+3YK3K?!^oN zi+SwPXF%2j{2x#rdHkC|`#%Yf{g1ZEKi~cTl|cKyF~|x~14rpPTHo9ze;yM8PrMQu zC|Vk1yIY7iPgF$hUZyXRt?ggO7ESop${`SYgC?nVhaY&>0!gKm()*gJoO2DMx z&skk_&#W91c_Ita<=ymzD0f1`v|iUAgX8vT%ByyM+1h!I<1aL?j|DCo?sb_kBYS{c zG>u%vU7-AwYp6fP!hE#)Rvle3U)|QSD+6Z)J&l58=QU^!aw!n&J){1@BEolG#{?rc0RlXr%88 zQ|X(UMlZe^X@MNc^Cuc7=h=Yg4$lp%s%zwUf29JH1&|7?;pl_<$F`W{u5e`}|e^|3F_J?d$n*2S3 zaVs4U3wx)xFQ--2Ub%bU5;)o5*`HO6lwG;sNUHP!Xh z#0eVo$XEg_MFw&1NNO|fXvD5ZZcB@h1&s}t+Ak)CeL}* zRIYN~Xsz4%shU0MfSf#toHDwnTu1C>j=D>3-VE136IaP)=$Jp3O-aM7D$LW|B>IwW zo-`eUw)kV5v!I=Z;hPu@cdobBBf}zNmcM@N0ir~JHg^FO z8_`wiPxamjsatr~QPbtSk4_CpQsx4bZ_V(>PY)iSVe^T$W0v^PaC0BeLFq;2HbNU# zb?wwh$y>BP)N(;QmB>(dX@|_qo>kfJQuuR^C`Q-!ydPZuL~fJ0SZtW1^!f#v;s~od z`xJ&f<7S{=fGOVP0=uRgew@6eGj4QQR{E<}KC#$vm5ejmpAO zHV0pgEG~ys@v6h>>WCXF8DlH6G|Y68TEei%!Fwlg#}`bZ-KOtMP*)E)HP=?l(6*+V z{XZ=&GV%=J%JM^$C3aVSZOr(nPEA<`wb2P@AdpnKIs;`mm%zKNEu8?020FQ+RNf+c zTQdcQnk-hQy?L=Kk{di4GK>P4ba;9K*S;)P1|9#w8%CZB#z# zxu}MChpAfoy7rFPjc<6`+PaoDA)sktk_laF>9f0-*ZM5Pv4!kYdE{mi}#U` zd=}g`k&1_U5Deipx5Vfv)^4&RM9d9Ef9{ks!zL!RygMx44P^SGL?;>)nu7 zJfV$goT~~NX|`96hsv9D#8F6kx+e%d`m>jqj70OA23pWi>=?I?Or({$;`L70+mOBD zci!ZwWM86u8F02e&T?k*mT->aVy`R6+Wm9b%T%FDTMb5ZbYVxs-{A`N2;WQ}{dEW$YOg~lJ^ z?{_h+mztjiohPH_Z+RD`=_Al|`i81|S?*O;JNd({eMW~#fxe|JNuIb(GtH&2(l=H^ zh)>@VWUzf-o8@_)_OBlats5KjHFqU!A1P2v|9mK*oXfwy^k}cdb;tNABc-z7CLLwW z?8K}VO zGroBZ+1BnMw9(>@9n{rrLc=fA8#xg!L@o3CArC^^5~xml_N4pFv)r2E{ew{$HB!=0 zz<=1hgfq7nz#EEXcAh#mLU>&_3?3D$>DCvmOL2IEkUS6QQ$01>ji8Hc%)K1Hz2??b zQwZ4tP@bTG8CEr@98i%H934@FzUOXycFEzFClj|3mGA#jp1^21Vd0Ju z2(G?i8&iphdGX*B`!ppp1AA{?DOG17bcoMPmCLpNaA?g9Uk##K2Sz~|7GGz|KmfsZ z1H6nc{JBv>+Ll`q@|@cIuh>h%jTJ^qY$?|!-it3Do~T(+jlPWsQD;=Eq7Dko(8xrG z=^P?h4)$sNE~B5?&c)pxB)tv8vWg9*%ui3E2WeC~D5qw>4SN8Zxz*x)IL&2j5?pWp zaqxD^{U^6!EBwneQ9YJBX6$pVXzS_ZrY&S(Op2anL_)f#RoTeS@+04Ln=*Q~a&4zU zj+p|F&?ATUamT99X2Z*3dI`h#jN&)H0X{*{K?JJtk8c>Zn%N}yWM42p=#p*i9LM11 zKZI`-usP8wY6h_l?93Ao?#7%RcszOXo^gE=!~?SER69H&$gd~q28H3V!uh(2n|P-N ziTLBNPO##De(76yj}$+HMcK$N>ls2It`^k5Qoi(Fl8N6eES1ITz$mWlVWI2Ql{_6l5$ z3FVDw65Qsz&RAMr9Gu)jb5PRd1ELc=@iy$f+r_kEmU&OBVdDH$D!>d+GA*`qvLF4q zOweV_OJCB4j#@&*xQWp>E<=&aNPU27L%xvax3j{UV(>ZUS&Xmy7!!$Lce5Klj*?TG z%o~A^Tf0XI%sFxp9plsfwbAvt1vm;BnX8bH_U6DN4DCKK)QBsJt3LfH;nScZ7n5=Epd<^e8MV z9&{K?Dy_+m=_a1gcPTf;!^6ZqfDz`tVpq)_?yEt~fvvSg`i35*ic*I;gPe*^sVJ9d zphV97x{8Xj;?(^F2_d$9G9bYM#5mgLN%}nGfXAy8)I6IRAB@A_Q1TB1Tii;eXl;b@ z$$+g8)&p?(BOvhv`HhN5%P56{CURoY6wc#owdhUHK8Bhl@L0jN54%6?+X>FJoMAS0 z9_kLkz9;23^Zg0LQ-3UmlgDa`fu8S?R#C+*jQDsP#eCT<8b*d;srBv(@yGay#Lm*e zAY8z#dNGHU{?(?BnNM@SD_@nR63!YGdthFN}%YdTVG z6BUCswSe+J%fqH&@+rhgLok;2x1FQ+TazGt8UepXp^f0jrMR#-e?)WFNOxHYi58S2 zI}zPWSeH>+8gwjww!D$uSKdfgUjv4duVkBkeA+D())cA2=7{VYnLzRI@Zgv3 zEtL!#wwsHuTMAtf<{k;mos$-gN<ry6WW?UV$&&tR`ns0JymN6dDuiNS$ z6!Y&R_lffpBK^`An`O%u*w(t+_#%E!;lM`(ynKD*XS6s31RFIXkpErr>t3#`IHA+oS2_2X~ zN0iH%z#3cIgp#-ORCkGqODa3DquTA2bDTK)J7IoV`JrWe2 z7?KzZZs@5V73rb~-y&y{w*}+d&S(h6KzIh6)bBdl{PQbKm!qCjPxbq?suSo-W+jsg zy`AQZbK^CeEc-M@^#ZZ;B!hK9zm_1(+!HGcMarGMRS|7DKNV)Ryb#yN>$v9ha;9$b zC9M*BCNmugJ8RaUfT*D=V-e>IRetstUYZ4=OpCRj-yAL)hd3m29cnpBhrCG;;3`es zu^MY#6j5!sg$cqWAA6Sd1AgT%{;(u2isf^~tD(2f$f0Xr75{-`)h!9@;Ok^>nd~Wv z7f8@#){d2g^p9*cepAi?q{}#K?-(ogJ}wJ?VbJ4*Wf@B0(o!29vk|YWI5CU%hQS6S z55HD`P{bngea1v4cVJ}sxH~gizEw90N1pKZ z?3{v;j-Z4x@}8iCdmhAv36N!i<)Z7S&vjJeQ#epX2j^{{gm(m8Crw}UJYz(9QaXkI*qi5ngBkh%-r(my2l*d2J^If%`Oi7|U)db%|DOA# z2gOUA=4U{+N$Q#xLWI)WsE)klRSOXiF(_ivo(K-V*DuA6&Db{^e$eKanw?$CXl@p^ zUaMMbi`pmQUM=(Xv9{5vbXsd3{W<^7S+9rz+r|S0nY9a7l0w>ep#uyG5N=VWaV$ zs`USBnCj}`v9UJ76g}NVS4T%js_eWxSsk4P9e~2xicVE?s?ZkM>&zcZF%xc!yEvox zyAd6d66dm&?jO@z2M_x1HT-+27a+r03c>h|uqIhtY_@181=XqPn`uGaTgoyPmxT3= znr}Duen8NI+7l0{0+7wI-Skf5)x4#k;IH=T^o0 zMbE=R>K>Ovo^L|L@EWzU(qZ_Um%xcjbu9z4G%ZaDRHOF$Y%7MDLZ4oFGx?F7g08!i zkT~ksGDS_T`FLy4&)W5w$v^QT+`QEm_L^SkHOm-is3fwcvSM5f9)7pGU|?$cidWT3o^n~vwC+ANn_ z-^`?9Tb>J(UURzbe&E#g4t4OxJ;UaxsuZaMpqzA$ol2#WPZixj8b^IO++txwKnDB2 zIZ4WDEbpASlZ2_KJ}=o|^A2^Ag7M2^d~G+;7C}A~2(fWD&kKc@0X%XMOd9iZIJ~}k zUI{#wmL_PHRFmDBz-fQ^NTHdQ6D_zm+utupNi9py z1O`gL7Yq^Fa4#PeY0>@2x~Ft#ti%=oAu*0s z@3(i}N)ZOHf2NTL(c&e~sdMw^v9|Dtk zj$KGQ17FW$#rj@n?z6^!8Zp2Od=Kp{<}d2(z$}}U7+jkqg5U;!;GGFC)1#lsmx`(Q zWuCsrGB`etyYdJzHZi5-YQ}3!&C6l?0}K`t$qFp#0Rk4v;U)Ea_!J1|Iww?StPs(! zlwpV!EHo&ds-M&214qC-nH8Fp$)dpW)uOH&k1RhJF3~geuR{Lo%J)#->No@!Z}qDX zP3D1jcvMtI`i92+9fmR9KME8RjPlF|wj0j*a}FK2MLy-~cd5BFWbBGmXj4rvJzdBR zaHs)I$TO0fLvUoS5+*Ny2qTG?i{rh7_@MdzN8b?;zSjuY& zt;$wDDJfgQ&DLbsfu{P>$lq%@292d&y7vZW0EZD-ZKj#Gb$4SE5eX{K_2#Ros+M$i z;#*r=XQAG;U|!bRyamm7MU|%Fe!_9ySbVDlCRnVC0yjYVz$^dlB8B® PowerPoint is a [.NET Core PowerPoint library](https://www.syncfusion.com/document-processing/powerpoint-framework/net-core) used to create, read, edit and convert PowerPoint documents programmatically without **Microsoft PowerPoint** or interop dependencies. Using this library, you can **open and save a Presentation in Blazor**. +Syncfusion® PowerPoint is a [.NET Core PowerPoint library](https://www.syncfusion.com/document-processing/powerpoint-framework/net-core) used to create, read, edit and convert PowerPoint documents programmatically without **Microsoft PowerPoint** or interop dependencies. Using this library, a **open and save a Presentation in Blazor**. -## Server app +## Blazor Web App Server Application -Step 1: Create a new C# Blazor Server app project. Select Blazor Server App from the template and click the Next button. +**Prerequisites:** -![Create Blazor Server application in Visual Studio for Blazor PowerPoint document ](Workingwith-Blazor/Create_project.png) +* Visual Studio 2022. +* Install [.NET 8 SDK](https://dotnet.microsoft.com/en-us/download/dotnet/8.0) or later. -Step 2: Install the [Syncfusion.Presentation.Net.Core](https://www.nuget.org/packages/Syncfusion.Presentation.Net.Core/) NuGet package as reference to your project from [NuGet.org](https://www.nuget.org/). +Step 1: Create a new C# Blazor Web app project. +* Select "Blazor Web App" from the template and click **Next**. + +![Create Blazor Web App application in Visual Studio](Workingwith-Blazor/Blazor_image_Web_App.png) + +* Name the project and click **Next**. + +![Name the Blazor Web App in Visual Studio](Workingwith-Blazor/Blazor_image_Web_ProjectName.png) + +* Select the framework and click **Create** button. + +![Select the framework in Blazor Web App Server in Visual Studio](Workingwith-Blazor/Blazor_image_Server_Web_Additional_Information.png) + +Step 2: Install the `Syncfusion.Presentation.Net.Core` NuGet package. +Install the [Syncfusion.Presentation.Net.Core](https://www.nuget.org/packages/Syncfusion.Presentation.Net.Core/) NuGet package as reference to the project from [NuGet.org](https://www.nuget.org/). ![Install Syncfusion.Presentation.Net.Core Nuget Package](Workingwith-Core/install_nuget.png) -N> Starting with v16.2.0.x, if you reference Syncfusion® assemblies from trial setup or from the NuGet feed, you also have to add "Syncfusion.Licensing" assembly reference and include a license key in your projects. Please refer to this [link](https://help.syncfusion.com/common/essential-studio/licensing/overview) to know about registering Syncfusion® license key in your application to use our components. +N> Starting with v16.2.0.x, if Syncfusion® assemblies are referenced from trial setup or from the NuGet feed, the "Syncfusion.Licensing" assembly reference must also be added and a license key included in projects. Please refer to this [link](https://help.syncfusion.com/common/essential-studio/licensing/overview) to know about registering Syncfusion® license key in an application to use Syncfusion components. -Step 3: Create a razor file with name as **Presentation** under **Pages** folder and include the following namespaces in the file. +Step 3: Create a Razor file named `Presentation.razor` in the `Pages` folder, which is located inside the `Components` folder. +Include the following namespaces in the file: {% tabs %} {% highlight c# tabtitle="C#" %} -@page "/presentation" +@rendermode InteractiveServer +@page "/Presentation" @using System.IO; @using Open_and_save_PowerPoint; @inject Open_and_save_PowerPoint.Data.PowerPointService service @@ -36,19 +53,21 @@ Step 3: Create a razor file with name as **Presentation** under **Pages** folder {% endhighlight %} {% endtabs %} -Step 4: Add the following code to create a new button. +Step 4: Add a button to `Presentation.razor`. +Include the following code to create a new button that triggers the presentation processing: {% tabs %} {% highlight CSHTML %} -

    Syncfusion PowerPoint library (Essential Presentation)

    -

    Syncfusion Blazor PowerPoint library (Essential Presentation) used to create, read, edit, and convert PowerPoint files in your applications without Microsoft Office dependencies.

    +

    Syncfusion PowerPoint Library (Essential Presentation)

    +

    The Syncfusion Blazor PowerPoint library (Essential Presentation) used to create, read, edit, and convert PowerPoint files in applications without Microsoft Office dependencies.

    {% endhighlight %} {% endtabs %} -Step 5: Add the following code in **Presentation.razor** file to create and download the **Presentation document**. +Step 5: Implement `OpenAndSavePresentation` method in `Presentation.razor`. +Add the following code to create and download the **Presentation document**. {% tabs %} {% highlight c# tabtitle="C#" %} @@ -68,7 +87,8 @@ Step 5: Add the following code in **Presentation.razor** file to create and down {% endhighlight %} {% endtabs %} -Step 6: Create a new cs file with name as **PowerPointService** under Data folder and include the following namespaces in the file. +Step 6: Create a new cs file `PowerPointService` in the `Data` folder. +Include the following namespaces in the file. {% tabs %} {% highlight c# tabtitle="C#" %} @@ -78,13 +98,14 @@ using Syncfusion.Presentation; {% endhighlight %} {% endtabs %} -Step 7: Create a new MemoryStream method with name as **OpenAndSavePresentation** in **PowerPointService** class and include the following code snippet to **open an existing PowerPoint Presentation in Blazor Server app**. +Step 7: Implement the `OpenAndSavePresentation` method in `PowerPointService.cs`. +Create a new `MemoryStream` method named `OpenAndSavePresentation` in the `PowerPointService` class, and include the following code snippet to **open an existing PowerPoint Presentation in Blazor Web app Server**. {% tabs %} {% highlight c# tabtitle="C#" %} using (FileStream sourceStreamPath = new FileStream(@"wwwroot/Template.pptx", FileMode.Open, FileAccess.Read, FileShare.ReadWrite)); -//Open an existing PowerPoint Presentation. +// Open an existing PowerPoint Presentation. using (IPresentation pptxDoc = Presentation.Open(sourceStreamPath)); {% endhighlight %} @@ -95,33 +116,45 @@ Step 8: Add below code snippet demonstrates accessing a shape from a slide and c {% tabs %} {% highlight c# tabtitle="C#" %} -//Get the first slide from the PowerPoint Presentation. +// Get the first slide from the PowerPoint Presentation. ISlide slide = pptxDoc.Slides[0]; -//Get the first shape of the slide. +// Get the first shape of the slide. IShape shape = slide.Shapes[0] as IShape; -//Change the text of the shape. +// Change the text of the shape. if (shape.TextBody.Text == "Company History") shape.TextBody.Text = "Company Profile"; {% endhighlight %} {% endtabs %} -Step 9: Add below code example to **save the PowerPoint Presentation in Blazor Server app**. +Step 9: Add below code example to **save the PowerPoint Presentation in Blazor Web App Server**. {% tabs %} {% highlight c# tabtitle="C#" %} -//Save the PowerPoint Presentation as stream. +// Save the PowerPoint Presentation as stream. MemoryStream pptxStream = new(); pptxDoc.Save(pptxStream); pptxStream.Position = 0; -//Download Powerpoint document in the browser. +// Download Powerpoint document in the browser. return pptxStream; {% endhighlight %} {% endtabs %} - -Step 10: Create a new class file in the project, with name as FileUtils and add the following code to invoke the JavaScript action to download the file in the browser. + +Step 10: Add the service in `Program.cs`. +Add the following line to the `Program.cs` file to register `PowerPointService` as a scoped service in the Blazor application. + +{% tabs %} +{% highlight c# tabtitle="C#" %} + +builder.Services.AddScoped(); + +{% endhighlight %} +{% endtabs %} + +Step 11: Create `FileUtils.cs` for JavaScript interoperability. +Create a new class file named `FileUtils` in the project and add the following code to invoke the JavaScript action for file download in the browser. {% tabs %} {% highlight c# tabtitle="C#" %} @@ -138,7 +171,8 @@ public static class FileUtils {% endhighlight %} {% endtabs %} -Step 11: Add the following JavaScript function in the _Host.cshtml in the Pages folder. +Step 12: Add the following JavaScript function to `App.razor`. +Add this function in the `App.razor` file located in the `Pages` folder. {% tabs %} {% highlight HTML %} @@ -148,7 +182,7 @@ Step 11: Add the following JavaScript function in the _Host.cshtml in the Pages { if (navigator.msSaveBlob) { - //Download document in Edge browser + // Download document in Edge browser var data = window.atob(bytesBase64); var bytes = new Uint8Array(data.length); for (var i = 0; i < data.length; i++) { @@ -172,27 +206,60 @@ Step 11: Add the following JavaScript function in the _Host.cshtml in the Pages {% endhighlight %} {% endtabs %} -You can download a complete working sample from [GitHub](https://github.com/SyncfusionExamples/PowerPoint-Examples/tree/master/Read-and-save-PowerPoint-presentation/Open-and-save-PowerPoint/Blazor/Blazor-Server-app). +Step 13: Add the navigation link. +Add the following code snippet to the Navigation menu's Razor file in the `Layout` folder. + +{% tabs %} + +{% highlight HTML %} + + + +{% endhighlight %} + +{% endtabs %} + +Step 14: Build the project. + +Click on **Build** → **Build Solution** or press Ctrl+Shift+B to build the project. + +Step 15: Run the project. + +Click the Start button (green arrow) or press F5 to run the application. + +A complete working sample is available on [GitHub](https://github.com/SyncfusionExamples/PowerPoint-Examples/tree/master/Read-and-save-PowerPoint-presentation/Open-and-save-PowerPoint/Blazor/Blazor-Web-App-Server). -By executing the program, you will get the **PowerPoint document** as follows. +Upon executing the program, the **PowerPoint document** will be generated as follows. -![Blazor Server output PowerPoint document](Workingwith-Core/Open-and-Save-output-image.png) +![Blazor Web App Server output PowerPoint document](Workingwith-Core/Open-and-Save-output-image.png) Click [here](https://www.syncfusion.com/document-processing/powerpoint-framework/blazor) to explore the rich set of Syncfusion® PowerPoint Library (Presentation) features. -## WASM app +## WASM Standalone Application -Step 1: Create a new C# Blazor WASM app project. Select Blazor WebAssembly App from the template and click the Next button. +**Prerequisites:** -![Create Blazor WebAssembly application in Visual Studio for Blazor PowerPoint document](Workingwith-Blazor/Blazor_WASM.png) +* Visual Studio 2022. +* Install [.NET 8 SDK](https://dotnet.microsoft.com/en-us/download/dotnet/8.0) or later. -Step 2: To **create a PowerPoint document in WASM app**, install [Syncfusion.Presentation.Net.Core](https://www.nuget.org/packages/Syncfusion.Presentation.Net.Core) to the Blazor project. +Step 1: Create a new C# Blazor WASM Standalone app project. +Select "Blazor WebAssembly Standalone App" from the template and click the **Next** button. + +![Create Blazor WebAssembly application in Visual Studio for Blazor PowerPoint document](Workingwith-Blazor/Blazor_WASM_Standalone.png) + +Step 2: Install the `Syncfusion.Presentation.Net.Core` NuGet package. +To **create a PowerPoint document in WASM Standalone app**, install [Syncfusion.Presentation.Net.Core](https://www.nuget.org/packages/Syncfusion.Presentation.Net.Core) to the Blazor project. ![Install Syncfusion.Presentation.Net.Core Nuget Package](Workingwith-Blazor/NuGet.png) -N> Starting with v16.2.0.x, if you reference Syncfusion® assemblies from trial setup or from the NuGet feed, you also have to add "Syncfusion.Licensing" assembly reference and include a license key in your projects. Please refer to this [link](https://help.syncfusion.com/common/essential-studio/licensing/overview) to know about registering Syncfusion® license key in your application to use our components. +N> Starting with v16.2.0.x, if Syncfusion® assemblies are referenced from trial setup or from the NuGet feed, the "Syncfusion.Licensing" assembly reference must also be added and a license key included in projects. Please refer to this [link](https://help.syncfusion.com/common/essential-studio/licensing/overview) to know about registering Syncfusion® license key in an application to use Syncfusion components. -Step 3: Create a razor file with name as ``Presentation`` under ``Pages`` folder and add the following namespaces in the file. +Step 3: Create a Razor file named `Presentation.razor` in the `Pages` folder. +Add the following namespaces in the file. {% tabs %} {% highlight c# tabtitle="C#" %} @@ -206,25 +273,27 @@ Step 3: Create a razor file with name as ``Presentation`` under ``Pages`` folder {% endhighlight %} {% endtabs %} -Step 4: Add the following code to create a new button. +Step 4: Add a button to `Presentation.razor`. +Include the following code to create a new button that triggers the presentation processing: {% tabs %} {% highlight CSHTML %} -

    Syncfusion PowerPoint library (Essential Presentation)

    -

    Syncfusion Blazor PowerPoint library (Essential Presentation) used to create, read, edit, and convert PowerPoint files in your applications without Microsoft Office dependencies.

    +

    Syncfusion PowerPoint Library (Essential Presentation)

    +

    The Syncfusion Blazor PowerPoint library (Essential Presentation) used to create, read, edit, and convert PowerPoint files in applications without Microsoft Office dependencies.

    {% endhighlight %} {% endtabs %} -Step 5: Create a new async method with name as ``OpenAndSavePresentation`` and include the following code snippet to **open an existing PowerPoint Presentation in Blazor WASM app**. +Step 5: Implement `OpenAndSavePresentation` method in `Presentation.razor`. +Create a new `async` method named `OpenAndSavePresentation` and include the following code snippet to **open an existing PowerPoint Presentation in Blazor WASM Standalone app**. {% tabs %} {% highlight c# tabtitle="C#" %} using (Stream inputStream = await client.GetStreamAsync("Data/Template.pptx")); -//Open an existing PowerPoint Presentation. +// Open an existing PowerPoint Presentation. using (IPresentation pptxDoc = Syncfusion.Presentation.Presentation.Open(inputStream)); {% endhighlight %} @@ -235,33 +304,34 @@ Step 6: Add below code snippet demonstrates accessing a shape from a slide and c {% tabs %} {% highlight c# tabtitle="C#" %} -//Get the first slide from the PowerPoint Presentation. +// Get the first slide from the PowerPoint Presentation. ISlide slide = pptxDoc.Slides[0]; -//Get the first shape of the slide. +// Get the first shape of the slide. IShape shape = slide.Shapes[0] as IShape; -//Change the text of the shape. +// Change the text of the shape. if (shape.TextBody.Text == "Company History") shape.TextBody.Text = "Company Profile"; {% endhighlight %} {% endtabs %} -Step 7: Add below code example to **save the PowerPoint Presentation in Blazor WASM app**. +Step 7: Add below code example to **save the PowerPoint Presentation in Blazor WASM Standalone app**. {% tabs %} {% highlight c# tabtitle="C#" %} -//Save the PowerPoint Presentation as stream. +// Save the PowerPoint Presentation as stream. MemoryStream pptxStream = new(); pptxDoc.Save(pptxStream); pptxStream.Position = 0; -//Download Powerpoint document in the browser. +// Download Powerpoint document in the browser. await JS.SaveAs("Sample.pptx", pptxStream.ToArray()); {% endhighlight %} {% endtabs %} -Step 8: To download the PowerPoint document in browser, create a class file with FileUtils name and add the following code to invoke the JavaScript action to download the file in the browser. +Step 8: Create `FileUtils.cs` for JavaScript interoperability. +Create a new class file named `FileUtils` in the project and add the following code to invoke the JavaScript action for file download in the browser. {% tabs %} {% highlight c# tabtitle="C#" %} @@ -278,7 +348,8 @@ public static class FileUtils {% endhighlight %} {% endtabs %} -Step 9: Add the following JavaScript function in the Index.html file present under ``wwwroot``. +Step 9: Add the following JavaScript function to `index.html`. +Add this function in the `index.html` file located in `wwwroot`. {% tabs %} {% highlight HTML %} @@ -286,7 +357,7 @@ Step 9: Add the following JavaScript function in the Index.html file present und @@ -115,7 +105,7 @@ PdfViewer.Inject( Toolbar,Magnification, Navigation, LinkAnnotation,ThumbnailVie let pdfviewer: PdfViewer = new PdfViewer({ documentPath:'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', - resourceUrl:"https://cdn.syncfusion.com/ej2/23.1.43/dist/ej2-pdfviewer-lib" + resourceUrl:"https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib" }); pdfviewer.appendTo('#PdfViewer'); @@ -135,19 +125,10 @@ document.getElementById('setNone').addEventListener('click', ()=> { EJ2 PDF Viewer - + - - - - - - - - - - + @@ -174,11 +155,11 @@ Add the below `serviceUrl` in the `index.ts` file {% previewsample "Document-Processing/code-snippet/pdfviewer/javascript-es6/text-markup-annotation/highlight-normal-mode-cs1/index.html" %} -## Highlight a text programmatically +## Highlight text programmatically -The PDF Viewer library enables you to programmatically highlight text within the PDF Viewer control using the [**addAnnotation()**](https://ej2.syncfusion.com/documentation/api/pdfviewer/annotation/#annotation) method. +Programmatically add highlights using the [addAnnotation](https://ej2.syncfusion.com/documentation/api/pdfviewer/annotation/#addannotation) method. -Here's an example of how you can use the **addAnnotation()** method to apply highlighting programmatically: +Example: ```html @@ -193,7 +174,7 @@ PdfViewer.Inject(Toolbar, Magnification, Navigation, Annotation, LinkAnnotation, let pdfviewer: PdfViewer = new PdfViewer(); pdfviewer.documentPath = "https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf"; -pdfviewer.resourceUrl = "https://cdn.syncfusion.com/ej2/25.1.35/dist/ej2-pdfviewer-lib"; +pdfviewer.resourceUrl = "https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib"; pdfviewer.appendTo('#PdfViewer'); let highlight = document.getElementById('highlight'); @@ -235,22 +216,22 @@ if (highlight) { {% endhighlight %} {% endtabs %} -## Underline a text +## Underline text -There are two ways to underline a text in the PDF document: +There are two ways to underline text: 1. Using the context menu - * Select a text in the PDF document and right-click it. - * Select **Underline** option in the context menu that appears. +* Select text in the PDF document and right-click it. +* Select **Underline** in the context menu. ![Alt text](../images/underline_context.png) 2. Using the annotation toolbar - * Click the **Edit Annotation** button in the PDF Viewer toolbar. A toolbar appears below it. - * Select the **Underline** button in the annotation toolbar. It enables the underline mode. - * Select the text and the underline annotation will be added. - * You can also select the text and apply the underline annotation using the **Underline** button. +* Click the **Edit Annotation** button in the PDF Viewer toolbar to open the annotation toolbar. +* Select **Underline** to enable underline mode. +* Select text to add the underline annotation. +* Alternatively, select text first and then click **Underline**. ![Alt text](../images/underline_button.png) @@ -268,7 +249,7 @@ PdfViewer.Inject( Toolbar,Magnification, Navigation, LinkAnnotation,ThumbnailVie let pdfviewer: PdfViewer = new PdfViewer({ documentPath:'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', - resourceUrl:"https://cdn.syncfusion.com/ej2/23.1.43/dist/ej2-pdfviewer-lib" + resourceUrl:"https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib" }); pdfviewer.appendTo('#PdfViewer'); @@ -284,19 +265,10 @@ document.getElementById('set').addEventListener('click', ()=> { EJ2 PDF Viewer - + - - - - - - - - - - + @@ -333,7 +305,7 @@ PdfViewer.Inject( Toolbar,Magnification, Navigation, LinkAnnotation,ThumbnailVie let pdfviewer: PdfViewer = new PdfViewer({ documentPath:'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', - resourceUrl:"https://cdn.syncfusion.com/ej2/23.1.43/dist/ej2-pdfviewer-lib" + resourceUrl:"https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib" }); pdfviewer.appendTo('#PdfViewer'); @@ -353,19 +325,10 @@ document.getElementById('setNone').addEventListener('click', ()=> { EJ2 PDF Viewer - + - - - - - - - - - - + @@ -391,11 +354,11 @@ Add the below `serviceUrl` in the `index.ts` file {% previewsample "Document-Processing/code-snippet/pdfviewer/javascript-es6/text-markup-annotation/underline-normal-mode-cs1/index.html" %} -## Underline a text programmatically +## Underline text programmatically -The PDF Viewer library enables you to programmatically Underline text within the PDF Viewer control using the [**addAnnotation()**](https://ej2.syncfusion.com/documentation/api/pdfviewer/annotation/#annotation) method. +Programmatically add underlines using the [addAnnotation](https://ej2.syncfusion.com/documentation/api/pdfviewer/annotation/#addannotation) method. -Here's an example of how you can use the **addAnnotation()** method to apply Underline programmatically: +Example: ```html @@ -410,7 +373,7 @@ PdfViewer.Inject(Toolbar, Magnification, Navigation, Annotation, LinkAnnotation, let pdfviewer: PdfViewer = new PdfViewer(); pdfviewer.documentPath = "https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf"; -pdfviewer.resourceUrl = "https://cdn.syncfusion.com/ej2/25.1.35/dist/ej2-pdfviewer-lib"; +pdfviewer.resourceUrl = "https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib"; pdfviewer.appendTo('#PdfViewer'); let underline = document.getElementById('underline'); @@ -452,22 +415,22 @@ if (underline) { {% endhighlight %} {% endtabs %} -## Strikethrough a text +## Strikethrough text -There are two ways to strikethrough a text in the PDF document: +There are two ways to strikethrough text: 1. Using the context menu - * Select a text in the PDF document and right-click it. - * Select **Strikethrough** option in the context menu that appears. +* Select text in the PDF document and right-click it. +* Select **Strikethrough** in the context menu. ![Alt text](../images/strikethrough_context.png) 2. Using the annotation toolbar - * Click the **Edit Annotation** button in the PDF Viewer toolbar. A toolbar appears below it. - * Select the **Strikethrough** button in the annotation toolbar. It enables the strikethrough mode. - * Select the text and the strikethrough annotation will be added. - * You can also select the text and apply the strikethrough annotation using the **Strikethrough** button. +* Click the **Edit Annotation** button in the PDF Viewer toolbar to open the annotation toolbar. +* Select **Strikethrough** to enable strikethrough mode. +* Select text to add the strikethrough annotation. +* Alternatively, select text first and then click **Strikethrough**. ![Alt text](../images/strikethrough_button.png) @@ -485,7 +448,7 @@ PdfViewer.Inject( Toolbar,Magnification, Navigation, LinkAnnotation,ThumbnailVie let pdfviewer: PdfViewer = new PdfViewer({ documentPath:'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', - resourceUrl:"https://cdn.syncfusion.com/ej2/23.1.43/dist/ej2-pdfviewer-lib" + resourceUrl:"https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib" }); pdfviewer.appendTo('#PdfViewer'); @@ -501,19 +464,10 @@ document.getElementById('set').addEventListener('click', ()=> { EJ2 PDF Viewer - + - - - - - - - - - - + @@ -537,7 +491,7 @@ Add the below `serviceUrl` in the `index.ts` file {% previewsample "Document-Processing/code-snippet/pdfviewer/javascript-es6/text-markup-annotation/strikethrough-mode-cs1/index.html" %} -Refer to the following code snippet to switch back to normal mode from underline mode. +Refer to the following code snippet to switch back to normal mode from strikethrough mode. {% tabs %} {% highlight ts tabtitle="index.ts" %} @@ -549,7 +503,7 @@ TextSelection, Annotation); let pdfviewer: PdfViewer = new PdfViewer({ documentPath:'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', - resourceUrl:"https://cdn.syncfusion.com/ej2/23.1.43/dist/ej2-pdfviewer-lib" + resourceUrl:"https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib" }); pdfviewer.appendTo('#PdfViewer'); @@ -570,19 +524,10 @@ document.getElementById('setNone').addEventListener('click', ()=> { EJ2 PDF Viewer - + - - - - - - - - - - + @@ -609,11 +554,11 @@ Add the below `serviceUrl` in the `index.ts` file {% previewsample "Document-Processing/code-snippet/pdfviewer/javascript-es6/text-markup-annotation/strikethrough-normal-mode-cs1/index.html" %} -## Strikethrough a text programmatically +## Strikethrough text programmatically -The PDF Viewer library enables you to programmatically Strikethrough text within the PDF Viewer control using the [**addAnnotation()**](https://ej2.syncfusion.com/documentation/api/pdfviewer/annotation/#annotation) method. +Programmatically add strikethrough using the [addAnnotation](https://ej2.syncfusion.com/documentation/api/pdfviewer/annotation/#addannotation) method. -Here's an example of how you can use the **addAnnotation()** method to apply Strikethrough programmatically: +Example: ```html @@ -628,7 +573,7 @@ PdfViewer.Inject(Toolbar, Magnification, Navigation, Annotation, LinkAnnotation, let pdfviewer: PdfViewer = new PdfViewer(); pdfviewer.documentPath = "https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf"; -pdfviewer.resourceUrl = "https://cdn.syncfusion.com/ej2/25.1.35/dist/ej2-pdfviewer-lib"; +pdfviewer.resourceUrl = "https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib"; pdfviewer.appendTo('#PdfViewer'); let strikethrough = document.getElementById('strikethrough'); @@ -670,21 +615,21 @@ if (strikethrough) { {% endhighlight %} {% endtabs %} -## Squiggly a text +## Add squiggly to text -There are two ways to add squiggly to a text in the PDF document: +There are two ways to add squiggly to text: 1. Using the context menu - * Select a text in the PDF document and right-click it. - * Select **Squiggly** option in the context menu that appears. +* Select text in the PDF document and right-click it. +* Select **Squiggly** in the context menu. ![Alt text](../images/squiggly_context.png) 2. Using the annotation toolbar - * Click the **Edit Annotation** button in the PDF Viewer toolbar. A toolbar appears below it. - * Select the **Squiggly** button in the annotation toolbar. It enables the squiggly mode. - * Select the text and the squiggly annotation will be added. - * You can also select the text and apply the squiggly annotation using the **Squiggly** button. +* Click the **Edit Annotation** button in the PDF Viewer toolbar to open the annotation toolbar. +* Select **Squiggly** to enable squiggly mode. +* Select text to add the squiggly annotation. +* Alternatively, select text first and then click **Squiggly**. ![Alt text](../images/squiggly_button.png) @@ -702,7 +647,7 @@ PdfViewer.Inject( Toolbar,Magnification, Navigation, LinkAnnotation,ThumbnailVie let pdfviewer: PdfViewer = new PdfViewer({ documentPath:'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', - resourceUrl:"https://cdn.syncfusion.com/ej2/30.1.37/dist/ej2-pdfviewer-lib" + resourceUrl:"https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib" }); pdfviewer.appendTo('#PdfViewer'); @@ -718,19 +663,10 @@ document.getElementById('set').addEventListener('click', ()=> { EJ2 PDF Viewer - + - - - - - - - - - - + @@ -754,7 +690,7 @@ Add the below `serviceUrl` in the `index.ts` file {% previewsample "Document-Processing/code-snippet/pdfviewer/javascript-es6/text-markup-annotation/squiggly-mode-cs1/index.html" %} -Refer to the following code snippet to switch back to normal mode from underline mode. +Refer to the following code snippet to switch back to normal mode from squiggly mode. {% tabs %} {% highlight ts tabtitle="index.ts" %} @@ -766,7 +702,7 @@ TextSelection, Annotation); let pdfviewer: PdfViewer = new PdfViewer({ documentPath:'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', - resourceUrl:"https://cdn.syncfusion.com/ej2/30.1.37/dist/ej2-pdfviewer-lib" + resourceUrl:"https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib" }); pdfviewer.appendTo('#PdfViewer'); @@ -787,19 +723,10 @@ document.getElementById('setNone').addEventListener('click', ()=> { EJ2 PDF Viewer - + - - - - - - - - - - + @@ -826,11 +753,11 @@ Add the below `serviceUrl` in the `index.ts` file {% previewsample "Document-Processing/code-snippet/pdfviewer/javascript-es6/text-markup-annotation/squiggly-normal-mode-cs1/index.html" %} -## Squiggly a text programmatically +## Add squiggly to text programmatically -The PDF Viewer library enables you to programmatically Squiggly text within the PDF Viewer control using the [**addAnnotation()**](https://ej2.syncfusion.com/documentation/api/pdfviewer/annotation/#annotation) method. +Programmatically add squiggly using the [addAnnotation](https://ej2.syncfusion.com/documentation/api/pdfviewer/annotation/#addannotation) method. -Here's an example of how you can use the **addAnnotation()** method to apply Squiggly programmatically: +Example: ```html @@ -845,7 +772,7 @@ PdfViewer.Inject(Toolbar, Magnification, Navigation, Annotation, LinkAnnotation, let pdfviewer: PdfViewer = new PdfViewer(); pdfviewer.documentPath = "https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf"; -pdfviewer.resourceUrl = "https://cdn.syncfusion.com/ej2/30.1.37/dist/ej2-pdfviewer-lib"; +pdfviewer.resourceUrl = "https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib"; pdfviewer.appendTo('#PdfViewer'); let squiggly = document.getElementById('squiggly'); @@ -889,39 +816,39 @@ if (squiggly) { ## Deleting a text markup annotation -The selected annotation can be deleted by the following ways: +The selected annotation can be deleted in the following ways: -1. Using Delete key - * Select the annotation to be deleted. - * Click the Delete key in the keyboard. The selected annotation will be deleted. +1. Using the Delete/Backspace key + * Select the annotation. + * Press Delete (or Backspace). The selected annotation is removed. 2. Using the annotation toolbar - * Select the annotation to be deleted. - * Click the **Delete Annotation** button in the annotation toolbar. The selected annotation will be deleted. + * Select the annotation. + * Click **Delete Annotation** in the annotation toolbar. The selected annotation is removed. ![Alt text](../images/delete_button.png) -## Editing the properties of the text markup annotation +## Edit text markup annotation properties The color and the opacity of the text markup annotation can be edited using the Edit Color tool and the Edit Opacity tool in the annotation toolbar. -### Editing color +### Edit color -The color of the annotation can be edited using the color palette provided in the Edit Color tool. +Use the color palette in the Edit Color tool to change the annotation color. ![Alt text](../images/edit_color.png) -### Editing opacity +### Edit opacity -The opacity of the annotation can be edited using the range slider provided in the Edit Opacity tool. +Use the range slider in the Edit Opacity tool to change annotation opacity. ![Alt text](../images/edit_opacity.png) -## Setting default properties during control initialization +## Set default properties during control initialization -The properties of the text markup annotation can be set before creating the control using highlightSettings, underlineSettings, strikethroughSettings and squigglySettings. +Set default properties before creating the control using `highlightSettings`, `underlineSettings`, `strikethroughSettings`, and `squigglySettings`. ->After editing the default color and opacity using the Edit Color tool and Edit Opacity tool, they will be changed to the selected values. +> After editing default color and opacity using the Edit Color and Edit Opacity tools, the values update to the selected settings. Refer to the following code snippet to set the default annotation settings. @@ -961,22 +888,22 @@ pdfviewer.appendTo('#PdfViewer'); {% endhighlight %} {% endtabs %} -## Performing undo and redo +## Perform undo and redo -The PDF Viewer performs undo and redo for the changes made in the PDF document. In text markup annotation, undo and redo actions are provided for: +The PDF Viewer supports undo and redo for changes. For text markup annotations, undo and redo are provided for: * Inclusion of the text markup annotations. * Deletion of the text markup annotations. * Change of either color or opacity of the text markup annotations. -Undo and redo actions can be done by the following ways: +Undo and redo actions can be performed in the following ways: 1. Using keyboard shortcuts: - After performing a text markup annotation action, you can undo it by using Ctrl + Z shortcut and redo by using Ctrl + Y shortcut. -2. Using toolbar: - Undo and redo can be done using the **Undo** tool and **Redo** tool provided in the toolbar. + After performing a text markup annotation action, press Ctrl+Z to undo and Ctrl+Y to redo. +2. Using the toolbar: + Use the **Undo** and **Redo** tools in the toolbar. -Refer to the following code snippet for calling undo and redo actions from the client-side. +Refer to the following code snippet to call undo and redo actions from the client side. {% tabs %} {% highlight ts tabtitle="index.ts" %} @@ -988,7 +915,7 @@ PdfViewer.Inject( Toolbar,Magnification, Navigation, LinkAnnotation,ThumbnailVie let pdfviewer: PdfViewer = new PdfViewer({ documentPath:'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', - resourceUrl:"https://cdn.syncfusion.com/ej2/23.1.43/dist/ej2-pdfviewer-lib" + resourceUrl:"https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib" }); pdfviewer.appendTo('#PdfViewer'); @@ -1008,19 +935,10 @@ document.getElementById('redo').addEventListener('click', ()=> { EJ2 PDF Viewer - + - - - - - - - - - - + @@ -1045,17 +963,17 @@ Add the below `serviceUrl` in the `index.ts` file {% previewsample "Document-Processing/code-snippet/pdfviewer/javascript-es6/text-markup-annotation/undo-redo-cs1/index.html" %} -## Saving the text markup annotation +## Save text markup annotations -When you click the download tool in the toolbar, the text markup annotations will be saved in the PDF document. This action will not affect the original document. +Click the download tool in the toolbar to save text markup annotations to the PDF document. The original document is not modified. -## Printing the text markup annotation +## Print text markup annotations -When the print tool is selected in the toolbar, the PDF document will be printed along with the text markup annotations added to the pages. This action will not affect the original document. +Click the print tool in the toolbar to print the PDF document with text markup annotations. The original document is not modified. -## Disabling text markup annotation +## Disable text markup annotation -The PDF Viewer control provides an option to disable the text markup annotation feature. The code snippet for disabling the feature is as follows. +Disable text markup annotations using the `enableTextMarkupAnnotation` property. {% tabs %} {% highlight ts tabtitle="Standalone" %} @@ -1088,4 +1006,4 @@ pdfviewer.appendTo('#PdfViewer'); ## See also * [Toolbar items](../toolbar) -* [Feature Modules](../feature-module) +* [Feature modules](../feature-module) diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es6/download.md b/Document-Processing/PDF/PDF-Viewer/javascript-es6/download.md index a0b679bcd..d53c97d2f 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es6/download.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es6/download.md @@ -1,16 +1,15 @@ --- layout: post -title: Download in Typescript Pdfviewer control | Syncfusion -description: Learn here all about Download in Syncfusion Typescript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Download in TypeScript PDF Viewer | Syncfusion +description: Learn how to enable, disable, and programmatically trigger download in the Syncfusion TypeScript PDF Viewer, including download events and base64 handling. platform: document-processing -control: Download -publishingplatform: Typescript +control: PDF Viewer documentation: ug domainurl: ##DomainURL## --- -# Download in Typescript Pdfviewer control +# Download in TypeScript PDF Viewer -The PDF Viewer supports downloading the loaded PDF file. You can enable/disable the download using the following code snippet. +The PDF Viewer supports downloading the loaded PDF document. Use the enableDownload property to enable or disable the download option, as shown below. ```html @@ -71,9 +70,11 @@ pdfviewer.load('https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', null {% endhighlight %} {% endtabs %} -![Alt text](./images/download.png) +> Note: When loading documents from other origins, ensure that CORS is correctly configured on the server. In server-backed mode, the document is streamed through the serviceUrl endpoint, which must allow download requests. -You can invoke download action using following code snippet., +![PDF Viewer toolbar showing the download button](./images/download.png) + +You can invoke the download action using the following code snippet: {% tabs %} {% highlight ts tabtitle="Standalone" %} @@ -106,9 +107,9 @@ pdfviewer.download(); ## How to get the base64 string while downloading the PDF document -The [downloadEnd](https://ej2.syncfusion.com/documentation/api/pdfviewer/#downloadend) event of the PDF viewer allows you to get the downloaded document as a base64 string. +The [downloadEnd](https://ej2.syncfusion.com/documentation/api/pdfviewer/#downloadend) event of the PDF Viewer is raised after the file is prepared for download and provides the document as a base64 string. -The following code illustrates how to get the downloaded document as a base64 string. +The following example illustrates how to access the downloaded document as a base64 string. Note: Handling very large base64 strings may impact memory usage; consider using a stream when possible. ``` @@ -139,4 +140,4 @@ document.getElementById('load').addEventListener('click', function () { ## See also * [Toolbar items](./toolbar) -* [Feature Modules](./feature-module) \ No newline at end of file +* [Feature modules](./feature-module) diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es6/event.md b/Document-Processing/PDF/PDF-Viewer/javascript-es6/event.md new file mode 100644 index 000000000..2dd97736c --- /dev/null +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es6/event.md @@ -0,0 +1,1377 @@ +--- +layout: post +title: Events in TypeScript PDF Viewer | Syncfusion +description: Comprehensive list of events in the Syncfusion TypeScript PDF Viewer with descriptions, event arguments, and usage examples to integrate custom logic. +platform: document-processing +control: PDF Viewer +documentation: ug +domainurl: ##DomainURL## +--- + +# Events in TypeScript PDF Viewer + +The PDF Viewer component triggers events for creation, page navigation, document life cycle, context menu interactions, comments, bookmarks, download and export, hyperlinks, annotation import/export, custom keyboard commands, printing, signatures, text search, and text selection. Use these events to integrate custom logic into application workflows. + +The following table lists commonly used events supported by the PDF Viewer component: + +| Event | Description | +| ----- | ----------- | +| [`bookmarkClick`](#bookmarkclick) | Triggers when a bookmark item is clicked in the bookmark panel. | +| [`buttonFieldClick`](#buttonfieldclick) | Triggers when a button form field is clicked. | +| [`commentAdd`](#commentadd) | Triggers when a comment is added to the comment panel. | +| [`commentDelete`](#commentdelete) | Triggers when a comment is deleted from the comment panel. | +| [`commentEdit`](#commentedit) | Triggers when a comment is edited in the comment panel. | +| [`commentSelect`](#commentselect) | Triggers when a comment is selected in the comment panel. | +| [`commentStatusChanged`](#commentstatuschanged) | Triggers when a comment’s status changes in the comment panel. | +| [`created`](#created) | Triggers during the creation of the PDF Viewer component. | +| [`customContextMenuBeforeOpen`](#customcontextmenubeforeopen) | Fires before the custom context menu opens. | +| [`customContextMenuSelect`](#customcontextmenuselect) | Fires when a custom context menu item is selected. | +| [`documentLoad`](#documentload) | Triggers while loading a document into the PDF Viewer. | +| [`documentLoadFailed`](#documentloadfailed) | Triggers when document loading fails. | +| [`documentUnload`](#documentunload) | Triggers when the document is closed. | +| [`downloadEnd`](#downloadend) | Triggers after a document is downloaded. | +| [`downloadStart`](#downloadstart) | Triggers when the download action is initiated. | +| [`exportFailed`](#exportfailed) | Triggers when exporting annotations fails. | +| [`exportStart`](#exportstart) | Triggers when exporting annotations starts. | +| [`exportSuccess`](#exportsuccess) | Triggers when annotations are exported successfully. | +| [`extractTextCompleted`](#extracttextcompleted) | Triggers when text extraction is completed. | +| [`hyperlinkClick`](#hyperlinkclick) | Triggers when a hyperlink is clicked. | +| [`hyperlinkMouseOver`](#hyperlinkmouseover) | Triggers when hovering over a hyperlink. | +| [`importFailed`](#importfailed) | Triggers when importing annotations fails. | +| [`importStart`](#importstart) | Triggers when importing annotations starts. | +| [`importSuccess`](#importsuccess) | Triggers when annotations are imported successfully. | +| [`keyboardCustomCommands`](#keyboardcustomcommands) | Triggers when customized keyboard command keys are pressed. | +| [`moveSignature`](#movesignature) | Triggers when a signature is moved across the page. | +| [`pageChange`](#pagechange) | Triggers when the current page number changes. | +| [`pageClick`](#pageclick) | Triggers when a mouse click occurs on a page. | +| [`pageMouseover`](#pagemouseover) | Triggers when moving the mouse over a page. | +| [`pageOrganizerSaveAs`](#pageorganizersaveas) | Triggers when a `save as` action is performed in the page organizer. | +| [`pageRenderComplete`](#pagerendercomplete) | Triggers after a page finishes rendering. | +| [`pageRenderInitiate`](#pagerenderinitiate) | Triggers when page rendering begins. | +| [`printEnd`](#printend) | Triggers when a print action is completed. | +| [`printStart`](#printstart) | Triggers when a print action is initiated. | +| [`removeSignature`](#removesignature) | Triggers when a signature is removed. | +| [`resizeSignature`](#resizesignature) | Triggers when a signature is resized. | +| [`resourcesLoaded`](#resourcesloaded) | Triggers after PDFium resources are loaded. | +| [`signaturePropertiesChange`](#signaturepropertieschange) | Triggers when signature properties are changed. | +| [`signatureSelect`](#signatureselect) | Triggers when a signature is selected. | +| [`signatureUnselect`](#signatureunselect) | Triggers when a signature is unselected. | +| [`textSearchComplete`](#textsearchcomplete) | Triggers when a text search is completed. | +| [`textSearchHighlight`](#textsearchhighlight) | Triggers when the searched text is highlighted. | +| [`textSearchStart`](#textsearchstart) | Triggers when a text search is initiated. | +| [`textSelectionEnd`](#textselectionend) | Triggers when text selection is complete. | +| [`textSelectionStart`](#textselectionstart) | Triggers when text selection is initiated. | +| [`thumbnailClick`](#thumbnailclick) | Triggers when a thumbnail is clicked. | +| [`toolbarClick`](#toolbarclick) | Triggers when a toolbar item is clicked. | +| [`validateFormFields`](#validateformfields) | Triggers when form field validation fails. | +| [`zoomChange`](#zoomchange) | Triggers when the magnification value changes. | + +Note: For annotation and signature events, see the dedicated Annotations Events topic. + +## bookmarkClick + +The [bookmarkClick](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#bookmarkclickevent) event triggers when a bookmark item is clicked in the bookmark panel. + +- Event arguments: [BookmarkClickEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/bookmarkClickEventArgs/). + +Example: + +```typescript +import { PdfViewer, Toolbar, Magnification, Navigation, LinkAnnotation,ThumbnailView, BookmarkView, + TextSelection, Annotation, FormDesigner, FormFields, ValidateFormFieldsArgs, PageOrganizer } from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject( Toolbar,Magnification, Navigation, LinkAnnotation,ThumbnailView, + BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer ); +const viewer: PdfViewer = new PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib', + bookmarkClick: function (args: any) { + console.log(`Bookmark clicked: ${args.name}`); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +## toolbarClick + +The [toolbarClick](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#toolbarclickevent) event triggers when a toolbar item is clicked. Use it to handle actions based on the clicked item's id or name. + +- Event arguments: `ClickEventArgs`. + +Example: + +```typescript +import { PdfViewer, Toolbar, Magnification, Navigation, LinkAnnotation,ThumbnailView, BookmarkView, + TextSelection, Annotation, FormDesigner, FormFields, ValidateFormFieldsArgs, PageOrganizer } from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject( Toolbar,Magnification, Navigation, LinkAnnotation,ThumbnailView, + BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer ); +const viewer: PdfViewer = new PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib', + toolbarClick: function (args: any) { + console.log(`Toolbar item clicked: ${args.name}`); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +## validateFormFields + +The [validateFormFields](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#validateformfieldsevent) event triggers when form field validation fails, typically before a download or submit action proceeds. Use this event to inspect which required fields are empty and show custom messages or block application logic if needed. + +- Event arguments: [ValidateFormFieldsArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/validateFormFieldsArgs/) + - name: Event name + - documentName: Current document name + - formField: The last interacted field’s data (if applicable) + - nonFillableFields: Array detailing required/invalid fields + +When it triggers +- Add a form field and mark it Required (UI: right‑click field > Properties > Required). +- Leave the field empty and click Download. The event fires and provides the list of fields that failed validation. + +Example: + +```typescript +import { PdfViewer, Toolbar, Magnification, Navigation, LinkAnnotation, ThumbnailView, BookmarkView, + TextSelection, Annotation, FormDesigner, FormFields, ValidateFormFieldsArgs, PageOrganizer } from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject(Toolbar, Magnification, Navigation, LinkAnnotation, ThumbnailView, + BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer); + +const viewer: PdfViewer = new PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/form-designer.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib' +}); + +viewer.enableFormFieldsValidation = true; +viewer.validateFormFields = function (args) { + console.log('form field event name:', args.name); + console.log('form field document name:', args.documentName); + console.log('form field data:', args.formField); + console.log('non fillable form field details:', args.nonFillableFields); +}; + +viewer.appendTo('#pdfViewer'); +``` + +Tip +- To require a field programmatically, set isRequired: true when creating or editing the field via Form Designer APIs. + +## zoomChange + +The [zoomChange](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#zoomchangeevent) event triggers when the magnification value changes. + +- Event arguments: [ZoomChangeEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/zoomChangeEventArgs/). + +Example: + +```typescript +import { PdfViewer, Toolbar, Magnification, Navigation, LinkAnnotation,ThumbnailView, BookmarkView, + TextSelection, Annotation, FormDesigner, FormFields, ValidateFormFieldsArgs, PageOrganizer } from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject( Toolbar,Magnification, Navigation, LinkAnnotation,ThumbnailView, + BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer ); +const viewer: PdfViewer = new PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib', + zoomChange: function (args: any) { + console.log(`Zoom changed to: ${args.zoomValue}%`); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +## buttonFieldClick + +The [buttonFieldClick](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#buttonfieldclickevent) event triggers when a button form field is clicked. + +- Event arguments: [ButtonFieldClickEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/buttonFieldClickEventArgs/). + +Example: + +```typescript +import { PdfViewer, Toolbar, Magnification, Navigation, LinkAnnotation,ThumbnailView, BookmarkView, + TextSelection, Annotation, FormDesigner, FormFields, ValidateFormFieldsArgs, PageOrganizer } from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject( Toolbar,Magnification, Navigation, LinkAnnotation,ThumbnailView, + BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer ); +const viewer: PdfViewer = new PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib', + buttonFieldClick: function (args: any) { + console.log(`Button field clicked. Name: ${args.name}`); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +## commentAdd + +The [commentAdd](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#commentaddevent) event triggers when a comment is added in the comment panel. + +- Event arguments: [CommentEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/commentEventArgs/). + +Example: + +```typescript +import { PdfViewer, Toolbar, Magnification, Navigation, LinkAnnotation,ThumbnailView, BookmarkView, + TextSelection, Annotation, FormDesigner, FormFields, ValidateFormFieldsArgs, PageOrganizer } from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject( Toolbar,Magnification, Navigation, LinkAnnotation,ThumbnailView, + BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer ); +const viewer: PdfViewer = new PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib', + commentAdd: function (args: any) { + console.log(`Comment added. Id: ${args.id}`); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +## commentDelete + +The [commentDelete](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#commentdeleteevent) event triggers when a comment is deleted in the comment panel. + +- Event arguments: [CommentEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/commentEventArgs/). + +Example: + +```typescript +import { PdfViewer, Toolbar, Magnification, Navigation, LinkAnnotation,ThumbnailView, BookmarkView, + TextSelection, Annotation, FormDesigner, FormFields, ValidateFormFieldsArgs, PageOrganizer } from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject( Toolbar,Magnification, Navigation, LinkAnnotation,ThumbnailView, + BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer ); +const viewer: PdfViewer = new PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib', + commentDelete: function (args: any) { + console.log(`Comment deleted. Id: ${args.id}`); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +## commentEdit + +The [commentEdit](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#commenteditevent) event triggers when a comment is edited in the comment panel. + +- Event arguments: [CommentEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/commentEventArgs/). + +Example: + +```typescript +import { PdfViewer, Toolbar, Magnification, Navigation, LinkAnnotation,ThumbnailView, BookmarkView, + TextSelection, Annotation, FormDesigner, FormFields, ValidateFormFieldsArgs, PageOrganizer } from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject( Toolbar,Magnification, Navigation, LinkAnnotation,ThumbnailView, + BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer ); +const viewer: PdfViewer = new PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib', + commentEdit: function (args: any) { + console.log(`Comment edited. Id: ${args.id}`); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +## commentSelect + +The [commentSelect](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#commentselectevent) event triggers when a comment is selected in the comment panel. + +- Event arguments: [CommentEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/commentEventArgs/). + +Example: + +```typescript +import { PdfViewer, Toolbar, Magnification, Navigation, LinkAnnotation,ThumbnailView, BookmarkView, + TextSelection, Annotation, FormDesigner, FormFields, ValidateFormFieldsArgs, PageOrganizer } from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject( Toolbar,Magnification, Navigation, LinkAnnotation,ThumbnailView, + BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer ); +const viewer: PdfViewer = new PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib', + commentSelect: function (args: any) { + console.log(`Comment selected. Id: ${args.id}`); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +## commentStatusChanged + +The [commentStatusChanged](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#commentstatuschangedevent) event triggers when a comment status is changed in the comment panel. + +- Event arguments: [CommentEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/commentEventArgs/). + +Example: + +```typescript +import { PdfViewer, Toolbar, Magnification, Navigation, LinkAnnotation,ThumbnailView, BookmarkView, + TextSelection, Annotation, FormDesigner, FormFields, ValidateFormFieldsArgs, PageOrganizer } from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject( Toolbar,Magnification, Navigation, LinkAnnotation,ThumbnailView, + BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer ); +const viewer: PdfViewer = new PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib', + commentStatusChanged: function (args: any) { + console.log(`Comment status changed. Id: ${args.id}, Status: ${args.status}`); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +## created + +The [created](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#createdevent) event is triggered during the creation of the PDF Viewer component. + +- Event arguments: `void`. + +Example: + +```typescript +import { PdfViewer, Toolbar, Magnification, Navigation, LinkAnnotation,ThumbnailView, BookmarkView, + TextSelection, Annotation, FormDesigner, FormFields, ValidateFormFieldsArgs, PageOrganizer } from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject( Toolbar,Magnification, Navigation, LinkAnnotation,ThumbnailView, + BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer ); + +const viewer: PdfViewer = new PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib', + created: function (args: any) { + console.log('PDF Viewer created'); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +## customContextMenuBeforeOpen + +The [customContextMenuBeforeOpen](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#customcontextmenubeforeopenevent) event fires just before the context menu is shown. Use it to show or hide items based on the current state (for example, only show search items when text is selected). + +- Event arguments: [CustomContextMenuBeforeOpenEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/customContextMenuBeforeOpenEventArgs/) + - name: Event name + - ids: Array of menu item ids that will be shown; remove ids to hide items for this open + +Example: + +```typescript +import { PdfViewer, Toolbar, Magnification, Navigation, LinkAnnotation,ThumbnailView, BookmarkView, + TextSelection, Annotation, FormDesigner, FormFields, ValidateFormFieldsArgs, PageOrganizer } from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject( Toolbar,Magnification, Navigation, LinkAnnotation,ThumbnailView, + BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer ); +const viewer: PdfViewer = new PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib', + customContextMenuBeforeOpen: function (args: any) { + console.log(`Before open context menu at page ${args.name}`); + } +}); +const menuItems: any[] = [ + { + text: 'SEARCH_ON_WEB', + id: 'web_search', + iconCss: 'e-icons e-search', + items: [ + { + text: 'SEARCH_IN_GOOGLE_IMAGE', + id: 'web_search_images', + }, + { + text: 'SEARCH_IN_WIKIPEDIA', + id: 'web_search_wikipedia', + }, + { + text: 'SEARCH_IN_YOUTUBE', + id: 'web_search_youtube', + }, + { + text: 'SEARCH_GOOGLE', + id: 'web_search_google', + }, + ], + }, + { + id: 'web_search_separator', + separator: true, + }, +]; + + viewer.appendTo("#pdfViewer"); + viewer.documentLoad = function (args) { + viewer.addCustomMenu(menuItems, false, false); + }; +``` + +## customContextMenuSelect + +The [customContextMenuSelect](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#customcontextmenuselectevent) event fires when a custom menu item is clicked. Use it to branch logic by the clicked item's id. + +- Event arguments: [CustomContextMenuSelectEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/customContextMenuSelectEventArgs/). + +- name: Event name +- id: The id of the clicked menu item + +Example: + +```typescript +import { PdfViewer, Toolbar, Magnification, Navigation, LinkAnnotation,ThumbnailView, BookmarkView, + TextSelection, Annotation, FormDesigner, FormFields, ValidateFormFieldsArgs, PageOrganizer } from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject( Toolbar,Magnification, Navigation, LinkAnnotation,ThumbnailView, + BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer ); +const viewer: PdfViewer = new PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib', + customContextMenuSelect: function (args: any) { + console.log(`Context menu item selected: ${args.name}`); + } +}); +const menuItems: any[] = [ + { + text: 'SEARCH_ON_WEB', + id: 'web_search', + iconCss: 'e-icons e-search', + items: [ + { + text: 'SEARCH_IN_GOOGLE_IMAGE', + id: 'web_search_images', + }, + { + text: 'SEARCH_IN_WIKIPEDIA', + id: 'web_search_wikipedia', + }, + { + text: 'SEARCH_IN_YOUTUBE', + id: 'web_search_youtube', + }, + { + text: 'SEARCH_GOOGLE', + id: 'web_search_google', + }, + ], + }, + { + id: 'web_search_separator', + separator: true, + }, +]; + +viewer.appendTo("#pdfViewer"); +viewer.documentLoad = function (args) { + viewer.addCustomMenu(menuItems, false, false); +}; + +``` + +## documentLoad + +The [documentLoad](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#documentloadevent) event occurs after a document is successfully loaded and parsed. + +- Event arguments: [LoadEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/loadEventArgs/). + +Example: + +```typescript +import { PdfViewer, Toolbar, Magnification, Navigation, LinkAnnotation,ThumbnailView, BookmarkView, + TextSelection, Annotation, FormDesigner, FormFields, ValidateFormFieldsArgs, PageOrganizer } from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject( Toolbar,Magnification, Navigation, LinkAnnotation,ThumbnailView, + BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer ); +const viewer: PdfViewer = new PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib', +}); +viewer.appendTo('#pdfViewer'); +viewer.documentLoad = function (args) { + console.log(`Document loaded: page count = ${args.pageData}`); +}; +``` + +## documentLoadFailed + +The [documentLoadFailed](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#documentloadfailedevent) event triggers when loading a document fails. + +- Event arguments: [LoadFailedEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/loadFailedEventArgs/). + +Example: + +```typescript +import { PdfViewer, Toolbar, Magnification, Navigation, LinkAnnotation,ThumbnailView, BookmarkView, + TextSelection, Annotation, FormDesigner, FormFields, ValidateFormFieldsArgs, PageOrganizer } from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject( Toolbar,Magnification, Navigation, LinkAnnotation,ThumbnailView, + BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer ); +const viewer: PdfViewer = new PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/invalid.pdf', +}); +viewer.appendTo('#pdfViewer'); +viewer.documentLoadFailed = function (args) { + console.log(`Load failed. Error: ${args.documentName}`); +} +``` + +## documentUnload + +The [documentUnload](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#documentunloadevent) event triggers when closing the current document. + +- Event arguments: [UnloadEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/unloadEventArgs/). + +Example: + +```typescript +import { PdfViewer, Toolbar, Magnification, Navigation, LinkAnnotation,ThumbnailView, BookmarkView, + TextSelection, Annotation, FormDesigner, FormFields, ValidateFormFieldsArgs, PageOrganizer } from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject( Toolbar,Magnification, Navigation, LinkAnnotation,ThumbnailView, + BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer ); +const viewer: PdfViewer = new PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib', + +}); +viewer.appendTo('#pdfViewer'); +viewer.documentUnload = function (args) { + console.log('Document unloaded'); +} +``` + +## downloadEnd + +The [downloadEnd](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#downloadendevent) event triggers after a document download completes. + +- Event arguments: [DownloadEndEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/downloadEndEventArgs/). + +Example: + +```typescript +import { PdfViewer, Toolbar, Magnification, Navigation, LinkAnnotation,ThumbnailView, BookmarkView, + TextSelection, Annotation, FormDesigner, FormFields, ValidateFormFieldsArgs, PageOrganizer } from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject( Toolbar,Magnification, Navigation, LinkAnnotation,ThumbnailView, + BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer ); +const viewer: PdfViewer = new PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib', + downloadEnd: function (args: any) { + console.log(`Download finished. File name: ${args.fileName}`); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +## downloadStart + +The [downloadStart](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#downloadstartevent) event triggers when the download operation is initiated. + +- Event arguments: [DownloadStartEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/downloadStartEventArgs/). + +Example: + +```typescript +import { PdfViewer, Toolbar, Magnification, Navigation, LinkAnnotation,ThumbnailView, BookmarkView, + TextSelection, Annotation, FormDesigner, FormFields, ValidateFormFieldsArgs, PageOrganizer } from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject( Toolbar,Magnification, Navigation, LinkAnnotation,ThumbnailView, + BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer ); +const viewer: PdfViewer = new PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib', + downloadStart: function (args: any) { + console.log('Download started'); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +## exportFailed + +The [exportFailed](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#exportfailedevent) event triggers when exporting annotations fails. + +- Event arguments: [ExportFailureEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/exportFailureEventArgs/). + +Example: + +```typescript +import { PdfViewer, Toolbar, Magnification, Navigation, LinkAnnotation,ThumbnailView, BookmarkView, + TextSelection, Annotation, FormDesigner, FormFields, ValidateFormFieldsArgs, PageOrganizer } from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject( Toolbar,Magnification, Navigation, LinkAnnotation,ThumbnailView, + BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer ); +const viewer: PdfViewer = new PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib', + exportFailed: function (args: any) { + console.log(`Export failed: ${args.name}`); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +## exportStart + +The [exportStart](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#exportstartevent) event triggers when exporting annotations starts. + +- Event arguments: [ExportStartEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/exportStartEventArgs/). + +Example: + +```typescript +import { PdfViewer, Toolbar, Magnification, Navigation, LinkAnnotation,ThumbnailView, BookmarkView, + TextSelection, Annotation, FormDesigner, FormFields, ValidateFormFieldsArgs, PageOrganizer } from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject( Toolbar,Magnification, Navigation, LinkAnnotation,ThumbnailView, + BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer ); +const viewer: PdfViewer = new PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib', + exportStart: function (args: any) { + console.log('Export started'); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +## exportSuccess + +The [exportSuccess](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#exportsuccessevent) event triggers when annotations are exported successfully. + +- Event arguments: [ExportSuccessEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/exportSuccessEventArgs/). + +Example: + +```typescript +import { PdfViewer, Toolbar, Magnification, Navigation, LinkAnnotation,ThumbnailView, BookmarkView, + TextSelection, Annotation, FormDesigner, FormFields, ValidateFormFieldsArgs, PageOrganizer } from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject( Toolbar,Magnification, Navigation, LinkAnnotation,ThumbnailView, + BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer ); +const viewer: PdfViewer = new PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib', + exportSuccess: function (args: any) { + console.log('Export success'); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +## extractTextCompleted + +The [extractTextCompleted](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#extracttextcompletedevent) event triggers when text extraction completes. + +- Event arguments: [ExtractTextCompletedEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/extractTextCompletedEventArgs/). + +Example: + +```typescript +import { PdfViewer, Toolbar, Magnification, Navigation, LinkAnnotation,ThumbnailView, BookmarkView, + TextSelection, Annotation, FormDesigner, FormFields, ValidateFormFieldsArgs, PageOrganizer } from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject( Toolbar,Magnification, Navigation, LinkAnnotation,ThumbnailView, + BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer ); +const viewer: PdfViewer = new PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib', + extractTextCompleted: function (args: any) { + console.log(`Extracted text length: ${(args.documentTextCollection || '').length}`); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +## hyperlinkClick + +The [hyperlinkClick](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#hyperlinkclickevent) event triggers when a hyperlink is clicked. + +- Event arguments: [HyperlinkClickEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/hyperlinkClickEventArgs/). + +Example: + +```typescript +import { PdfViewer, Toolbar, Magnification, Navigation, LinkAnnotation,ThumbnailView, BookmarkView, + TextSelection, Annotation, FormDesigner, FormFields, ValidateFormFieldsArgs, PageOrganizer } from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject( Toolbar,Magnification, Navigation, LinkAnnotation,ThumbnailView, + BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer ); +const viewer: PdfViewer = new PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib', + hyperlinkClick: function (args: any) { + console.log(`Hyperlink clicked: ${args.hyperlink}`); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +## hyperlinkMouseOver + +The [hyperlinkMouseOver](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#hyperlinkmouseoverevent) event triggers when hovering over a hyperlink. + +- Event arguments: HyperlinkMouseOverArgs. + +Example: + +```typescript +import { PdfViewer, Toolbar, Magnification, Navigation, LinkAnnotation,ThumbnailView, BookmarkView, + TextSelection, Annotation, FormDesigner, FormFields, ValidateFormFieldsArgs, PageOrganizer } from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject( Toolbar,Magnification, Navigation, LinkAnnotation,ThumbnailView, + BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer ); +const viewer: PdfViewer = new PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib', + hyperlinkMouseOver: function (args: any) { + console.log(`Hyperlink hover at page: ${args.name}`); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +## importFailed + +The [importFailed](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#importfailedevent) event triggers when importing annotations fails. + +- Event arguments: [ImportFailureEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/importFailureEventArgs/). + +Example: + +```typescript +import { PdfViewer, Toolbar, Magnification, Navigation, LinkAnnotation,ThumbnailView, BookmarkView, + TextSelection, Annotation, FormDesigner, FormFields, ValidateFormFieldsArgs, PageOrganizer } from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject( Toolbar,Magnification, Navigation, LinkAnnotation,ThumbnailView, + BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer ); +const viewer: PdfViewer = new PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib', + importFailed: function (args: any) { + console.log(`Import failed: ${args.name}`); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +## importStart + +The [importStart](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#importstartevent) event triggers when importing annotations starts. + +- Event arguments: [ImportStartEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/importStartEventArgs/). + +Example: + +```typescript +import { PdfViewer, Toolbar, Magnification, Navigation, LinkAnnotation,ThumbnailView, BookmarkView, + TextSelection, Annotation, FormDesigner, FormFields, ValidateFormFieldsArgs, PageOrganizer } from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject( Toolbar,Magnification, Navigation, LinkAnnotation,ThumbnailView, + BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer ); +const viewer: PdfViewer = new PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib', + importStart: function (args: any) { + console.log('Import started'); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +## importSuccess + +The [importSuccess](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#importsuccessevent) event triggers when annotations are imported successfully. + +- Event arguments: [ImportSuccessEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/importSuccessEventArgs/). + +Example: + +```typescript +import { PdfViewer, Toolbar, Magnification, Navigation, LinkAnnotation,ThumbnailView, BookmarkView, + TextSelection, Annotation, FormDesigner, FormFields, ValidateFormFieldsArgs, PageOrganizer } from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject( Toolbar,Magnification, Navigation, LinkAnnotation,ThumbnailView, + BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer ); +const viewer: PdfViewer = new PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib', + importSuccess: function (args: any) { + console.log('Import success'); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +## keyboardCustomCommands + +The [keyboardCustomCommands](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#keyboardcustomcommandsevent) event triggers when customized keyboard command keys are pressed. + +- Event arguments: [KeyboardCustomCommandsEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/keyboardCustomCommandsEventArgs/). + + - name: Event name + - keyboardCommand: The command metadata raised by Command Manager + +When it triggers +- After registering gestures in commandManager.keyboardCommand. For example, pressing Shift + Alt + G or Shift + Alt + H triggers the event. Use this to handle custom keyboard shortcuts. + +Refer to [Keyboard interaction](./accessibility#keyboard-interaction) for details about adding and handling custom shortcut keys. +Example: + +```typescript +import { PdfViewer, Toolbar, Magnification, Navigation, LinkAnnotation,ThumbnailView, BookmarkView, + TextSelection, Annotation, FormDesigner, FormFields, ValidateFormFieldsArgs, PageOrganizer } from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject( Toolbar,Magnification, Navigation, LinkAnnotation,ThumbnailView, + BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer ); +const viewer: PdfViewer = new PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib', +}); +viewer.commandManager = { + keyboardCommand: [ + { + name: 'customCopy', + gesture: { + pdfKeys: PdfKeys.G, + modifierKeys: ModifierKeys.Shift | ModifierKeys.Alt, + }, + }, + { + name: 'customPaste', + gesture: { + pdfKeys: PdfKeys.H, + modifierKeys: ModifierKeys.Shift | ModifierKeys.Alt, + }, + }, + { + name: 'customCut', + gesture: { + pdfKeys: PdfKeys.Z, + modifierKeys: ModifierKeys.Control, + }, + }, + { + name: 'customSelectAll', + gesture: { + pdfKeys: PdfKeys.E, + modifierKeys: ModifierKeys.Control, + }, + }, + ], +}; +viewer.appendTo('#pdfViewer'); +viewer.keyboardCustomCommands = (args: any): void => { + console.log('Custom command triggered:', args); +}; +``` + +## moveSignature + +The [moveSignature](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#movesignatureevent) event triggers when a signature is moved across the page. + +- Event arguments: `MoveSignatureEventArgs`. + +Example: + +```typescript +import { PdfViewer, Toolbar, Magnification, Navigation, LinkAnnotation,ThumbnailView, BookmarkView, + TextSelection, Annotation, FormDesigner, FormFields, ValidateFormFieldsArgs, PageOrganizer } from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject( Toolbar,Magnification, Navigation, LinkAnnotation,ThumbnailView, + BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer ); +const viewer: PdfViewer = new PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib', + moveSignature: function (args: any) { + console.log(`Signature moved on page ${args.id}`); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +## pageChange + +The [pageChange](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#pagechangeevent) event triggers when the current page number changes (for example, via scrolling or navigation controls). + +- Event arguments: [PageChangeEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/pageChangeEventArgs/). + +Example: + +```typescript +import { PdfViewer, Toolbar, Magnification, Navigation, LinkAnnotation,ThumbnailView, BookmarkView, + TextSelection, Annotation, FormDesigner, FormFields, ValidateFormFieldsArgs, PageOrganizer } from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject( Toolbar,Magnification, Navigation, LinkAnnotation,ThumbnailView, + BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer ); +const viewer: PdfViewer = new PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib', + pageChange: function (args: any) { + console.log(`Page changed from ${args.previousPageNumber} to ${args.currentPageNumber}`); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +## pageClick + +The [pageClick](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#pageclickevent) event triggers when a mouse click occurs on a page. + +- Event arguments: [PageClickEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/pageClickEventArgs/). + +Example: + +```typescript +import { PdfViewer, Toolbar, Magnification, Navigation, LinkAnnotation,ThumbnailView, BookmarkView, + TextSelection, Annotation, FormDesigner, FormFields, ValidateFormFieldsArgs, PageOrganizer } from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject( Toolbar,Magnification, Navigation, LinkAnnotation,ThumbnailView, + BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer ); +const viewer: PdfViewer = new PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib', + pageClick: function (args: any) { + console.log(`Page ${args.pageNumber} clicked at (${args.x}, ${args.y})`); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +## pageMouseover + +The [pageMouseover](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#pagemouseoverevent) event triggers when the mouse moves over a page. + +- Event arguments: `PageMouseoverEventArgs`. + +Example: + +```typescript +import { PdfViewer, Toolbar, Magnification, Navigation, LinkAnnotation,ThumbnailView, BookmarkView, + TextSelection, Annotation, FormDesigner, FormFields, ValidateFormFieldsArgs, PageOrganizer } from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject( Toolbar,Magnification, Navigation, LinkAnnotation,ThumbnailView, + BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer ); +const viewer: PdfViewer = new PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib', + pageMouseover: function (args: any) { + console.log(`Mouse over page ${args.name}`); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +## pageOrganizerSaveAs + +The [pageOrganizerSaveAs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#pageorganizersaveasevent) event triggers when a Save As action is performed in the page organizer. + +- Event arguments: `PageOrganizerSaveAsEventArgs`. + +Example: + +```typescript +import { PdfViewer, Toolbar, Magnification, Navigation, LinkAnnotation,ThumbnailView, BookmarkView, + TextSelection, Annotation, FormDesigner, FormFields, ValidateFormFieldsArgs, PageOrganizer } from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject( Toolbar,Magnification, Navigation, LinkAnnotation,ThumbnailView, + BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer ); +const viewer: PdfViewer = new PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib', + pageOrganizerSaveAs: function (args: any) { + console.log(`Page organizer save triggered. File name: ${args.downloadDocument}`); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +## pageRenderComplete + +The [pageRenderComplete](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#pagerendercompleteevent) event triggers after a page finishes rendering. + +- Event arguments: [PageRenderCompleteEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/pageRenderCompleteEventArgs/). + +Example: + +```typescript +import { PdfViewer, Toolbar, Magnification, Navigation, LinkAnnotation,ThumbnailView, BookmarkView, + TextSelection, Annotation, FormDesigner, FormFields, ValidateFormFieldsArgs, PageOrganizer } from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject( Toolbar,Magnification, Navigation, LinkAnnotation,ThumbnailView, + BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer ); +const viewer: PdfViewer = new PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib', + pageRenderComplete: function (args: any) { + console.log(`Page ${args.data} rendering completed.`); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +## pageRenderInitiate + +The [pageRenderInitiate](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#pagerenderinitiateevent) event triggers when page rendering begins. + +- Event arguments: [PageRenderInitiateEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/pageRenderInitiateEventArgs/). + +Example: + +```typescript +import { PdfViewer, Toolbar, Magnification, Navigation, LinkAnnotation,ThumbnailView, BookmarkView, + TextSelection, Annotation, FormDesigner, FormFields, ValidateFormFieldsArgs, PageOrganizer } from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject( Toolbar,Magnification, Navigation, LinkAnnotation,ThumbnailView, + BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer ); +const viewer: PdfViewer = new PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib', + pageRenderInitiate: function (args: any) { + console.log(`Page ${args.jsonData} rendering initiated.`); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +## printEnd + +The [printEnd](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#printendevent) event triggers when a print action completes. + +- Event arguments: [PrintEndEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/printEndEventArgs/). + +Example: + +```typescript +import { PdfViewer, Toolbar, Magnification, Navigation, LinkAnnotation,ThumbnailView, BookmarkView, + TextSelection, Annotation, FormDesigner, FormFields, ValidateFormFieldsArgs, PageOrganizer } from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject( Toolbar,Magnification, Navigation, LinkAnnotation,ThumbnailView, + BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer ); +const viewer: PdfViewer = new PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib', + printEnd: function (args: any) { + console.log('Print action completed.'); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +## printStart + +The [printStart](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#printstartevent) event triggers when a print action is initiated. + +- Event arguments: [PrintStartEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/printStartEventArgs/). + +Example: + +```typescript +import { PdfViewer, Toolbar, Magnification, Navigation, LinkAnnotation,ThumbnailView, BookmarkView, + TextSelection, Annotation, FormDesigner, FormFields, ValidateFormFieldsArgs, PageOrganizer } from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject( Toolbar,Magnification, Navigation, LinkAnnotation,ThumbnailView, + BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer ); +const viewer: PdfViewer = new PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib', + printStart: () => { + console.log('Print action initiated.'); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +## removeSignature + +The [removeSignature](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#removesignatureevent) event triggers when a signature is removed. + +- Event arguments: [RemoveSignatureEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/removeSignatureEventArgs/). + +Example: + +```typescript +import { PdfViewer, Toolbar, Magnification, Navigation, LinkAnnotation,ThumbnailView, BookmarkView, + TextSelection, Annotation, FormDesigner, FormFields, ValidateFormFieldsArgs, PageOrganizer } from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject( Toolbar,Magnification, Navigation, LinkAnnotation,ThumbnailView, + BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer ); +const viewer: PdfViewer = new PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib', + removeSignature: function (args: any) { + console.log(`Signature removed from page ${args.bounds}`); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +## resizeSignature + +The [resizeSignature](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#resizesignatureevent) event triggers when a signature is resized. + +- Event arguments: [ResizeSignatureEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/resizeSignatureEventArgs/). + +Example: + +```typescript +import { PdfViewer, Toolbar, Magnification, Navigation, LinkAnnotation,ThumbnailView, BookmarkView, + TextSelection, Annotation, FormDesigner, FormFields, ValidateFormFieldsArgs, PageOrganizer } from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject( Toolbar,Magnification, Navigation, LinkAnnotation,ThumbnailView, + BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer ); +const viewer: PdfViewer = new PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib', + resizeSignature: function (args: any) { + console.log(`Signature resized on page ${args.currentPosition}`); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +## resourcesLoaded + +The [resourcesLoaded](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#resourcesloadedevent) event triggers after the viewer's required resources are loaded. + +- Event arguments: `void`. + +Example: + +```typescript +import { PdfViewer, Toolbar, Magnification, Navigation, LinkAnnotation,ThumbnailView, BookmarkView, + TextSelection, Annotation, FormDesigner, FormFields, ValidateFormFieldsArgs, PageOrganizer } from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject( Toolbar,Magnification, Navigation, LinkAnnotation,ThumbnailView, + BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer ); +const viewer: PdfViewer = new PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib', + resourcesLoaded: function (args: any) { + console.log('PDFium resources loaded.'); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +## signaturePropertiesChange + +The [signaturePropertiesChange](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#signaturepropertieschangeevent) event triggers when signature properties change. + +- Event arguments: [SignaturePropertiesChangeEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/signaturePropertiesChangeEventArgs/). + +Example: + +```typescript +import { PdfViewer, Toolbar, Magnification, Navigation, LinkAnnotation,ThumbnailView, BookmarkView, + TextSelection, Annotation, FormDesigner, FormFields, ValidateFormFieldsArgs, PageOrganizer } from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject( Toolbar,Magnification, Navigation, LinkAnnotation,ThumbnailView, + BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer ); +const viewer: PdfViewer = new PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib', + signaturePropertiesChange: function (args: any) { + console.log(`Signature properties changed on page ${args.type}`); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +## signatureSelect + +The [signatureSelect](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#signatureselectevent) event triggers when a signature is selected. + +- Event arguments: [SignatureSelectEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/signatureSelectEventArgs/). + +Example: + +```typescript +import { PdfViewer, Toolbar, Magnification, Navigation, LinkAnnotation,ThumbnailView, BookmarkView, + TextSelection, Annotation, FormDesigner, FormFields, ValidateFormFieldsArgs, PageOrganizer } from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject( Toolbar,Magnification, Navigation, LinkAnnotation,ThumbnailView, + BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer ); +const viewer: PdfViewer = new PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib', + signatureSelect: function (args: any) { + console.log(`Signature selected on page ${args.signature}`); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +## signatureUnselect + +The [signatureUnselect](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#signatureunselectevent) event triggers when a signature is unselected. + +- Event arguments: [SignatureUnselectEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/signatureUnselectEventArgs/). + +Example: + +```typescript +import { PdfViewer, Toolbar, Magnification, Navigation, LinkAnnotation,ThumbnailView, BookmarkView, + TextSelection, Annotation, FormDesigner, FormFields, ValidateFormFieldsArgs, PageOrganizer } from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject( Toolbar,Magnification, Navigation, LinkAnnotation,ThumbnailView, + BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer ); +const viewer: PdfViewer = new PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib', + signatureUnselect: function (args: any) { + console.log(`Signature unselected ${args.signature}`); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +## textSearchComplete + +The [textSearchComplete](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#textsearchcompleteevent) event triggers when a text search completes. + +- Event arguments: [TextSearchCompleteEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/textSearchCompleteEventArgs/). + +Example: + +```typescript +import { PdfViewer, Toolbar, Magnification, Navigation, LinkAnnotation,ThumbnailView, BookmarkView, + TextSelection, Annotation, FormDesigner, FormFields, ValidateFormFieldsArgs, PageOrganizer } from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject( Toolbar,Magnification, Navigation, LinkAnnotation,ThumbnailView, + BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer ); +const viewer: PdfViewer = new PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib', + textSearchComplete: function (args: any) { + console.log('Text search completed.'); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +## textSearchHighlight + +The [textSearchHighlight](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#textsearchhighlightevent) event triggers when searched text is highlighted. + +- Event arguments: [TextSearchHighlightEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/textSearchHighlightEventArgs/). + +Example: + +```typescript +import { PdfViewer, Toolbar, Magnification, Navigation, LinkAnnotation,ThumbnailView, BookmarkView, + TextSelection, Annotation, FormDesigner, FormFields, ValidateFormFieldsArgs, PageOrganizer } from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject( Toolbar,Magnification, Navigation, LinkAnnotation,ThumbnailView, + BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer ); +const viewer: PdfViewer = new PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib', + textSearchHighlight: function (args: any) { + console.log(`Search result ${args.bounds} highlighted.`); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +## textSearchStart + +The [textSearchStart](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#textsearchstartevent) event triggers when a text search is initiated. + +- Event arguments: [TextSearchStartEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/textSearchStartEventArgs/). + +Example: + +```typescript +import { PdfViewer, Toolbar, Magnification, Navigation, LinkAnnotation,ThumbnailView, BookmarkView, + TextSelection, Annotation, FormDesigner, FormFields, ValidateFormFieldsArgs, PageOrganizer } from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject( Toolbar,Magnification, Navigation, LinkAnnotation,ThumbnailView, + BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer ); +const viewer: PdfViewer = new PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib', + textSearchStart: function (args: any) { + console.log(`Text search started for: "${args.searchText}"`); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +## textSelectionEnd + +The [textSelectionEnd](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#textselectionendevent) event triggers when text selection is complete. + +- Event arguments: [TextSelectionEndEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/textSelectionEndEventArgs/). + +Example: + +```typescript +import { PdfViewer, Toolbar, Magnification, Navigation, LinkAnnotation,ThumbnailView, BookmarkView, + TextSelection, Annotation, FormDesigner, FormFields, ValidateFormFieldsArgs, PageOrganizer } from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject( Toolbar,Magnification, Navigation, LinkAnnotation,ThumbnailView, + BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer ); +const viewer: PdfViewer = new PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib', + textSelectionEnd: function (args: any) { + console.log(`Text selection ended on page ${args.pageIndex}.`); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +## textSelectionStart + +The [textSelectionStart](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#textselectionstartevent) event triggers when text selection is initiated. + +- Event arguments: `TextSelectionStartEventArgs`. + +Example: + +```typescript +import { PdfViewer, Toolbar, Magnification, Navigation, LinkAnnotation,ThumbnailView, BookmarkView, + TextSelection, Annotation, FormDesigner, FormFields, ValidateFormFieldsArgs, PageOrganizer } from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject( Toolbar,Magnification, Navigation, LinkAnnotation,ThumbnailView, + BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer ); +const viewer: PdfViewer = new PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib', + textSelectionStart: function (args: any) { + console.log(`Text selection started on page ${args.pageIndex}.`); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +## thumbnailClick + +The [thumbnailClick](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#thumbnailclickevent) event triggers when a thumbnail is clicked. + +- Event arguments: [ThumbnailClickEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/thumbnailClickEventArgs/). + +Example: + +```typescript +import { PdfViewer, Toolbar, Magnification, Navigation, LinkAnnotation,ThumbnailView, BookmarkView, + TextSelection, Annotation, FormDesigner, FormFields, ValidateFormFieldsArgs, PageOrganizer } from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject( Toolbar,Magnification, Navigation, LinkAnnotation,ThumbnailView, + BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer ); +const viewer: PdfViewer = new PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl: 'https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib', + thumbnailClick: function (args: any) { + console.log(`Thumbnail clicked for page index ${args.pageNumber}.`); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +> Tip: For annotation and signature-specific events and arguments, see the dedicated Annotations Events topic. diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es6/feature-module.md b/Document-Processing/PDF/PDF-Viewer/javascript-es6/feature-module.md index 5c2c98442..91806dbf7 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es6/feature-module.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es6/feature-module.md @@ -1,35 +1,34 @@ --- layout: post -title: Feature module in Typescript Pdfviewer Control | Syncfusion -description: Learn here all about Feature module in Syncfusion Essential Typescript Pdfviewer control, its elements and more. +title: Feature modules in TypeScript PDF Viewer | Syncfusion +description: Learn to inject feature modules in Syncfusion TypeScript PDF Viewer to enable toolbar, search, forms, and more. platform: document-processing -control: Feature module -publishingplatform: Typescript +control: PDF Viewer documentation: ug domainurl: ##DomainURL## --- -# Feature module in Typescript Pdfviewer Control +# Feature modules in TypeScript PDF Viewer -The PDF Viewer features are segregated into individual feature-wise modules to enable selectively referencing in the application. The required modules should be injected to extend its functionality. The following are the selective modules of PDF Viewer that can be included as required: +The PDF Viewer features are provided as individual modules, allowing applications to include only what is needed. Inject the required modules to enable functionality, then configure the corresponding properties on the PDF Viewer instance. -The available PdfViewer modules are: +Available PDF Viewer modules: -* **Toolbar**:- Built-in toolbar for better user interaction. -* **Magnification**:- Perform zooming operation for better viewing experience. -* **Navigation**:- Easy navigation across the PDF pages. -* **LinkAnnotation**:- Easy navigation within and outside of the PDF document. -* **ThumbnailView**:- Easy navigation with in the PDF document. -* **BookmarkView**:- Easy navigation based on the bookmark content of the PDF document. -* **TextSelection**:- Select and copy text from a PDF file. -* **TextSearch**:- Search a text easily across the PDF document. -* **Print**:- Print the entire document or a specific page directly from the browser. -* **Annotation**:- Annotations can be added or edited in the PDF document. -* **FormFields**:- Preserve the form fields in the PDF document. -* **FormDesigner**:- Form fields can be added or edited in the PDF document. +* [**Toolbar**](./toolbar-customization): Built-in toolbar for user interaction. +* [**Magnification**](./magnification): Perform zoom operations for a better viewing experience. +* [**Navigation**](./interactive-pdf-navigation/page-navigation): Navigate across pages. +* [**LinkAnnotation**](./interactive-pdf-navigation/table-of-content-navigation): Navigate within the document or to external destinations via hyperlinks. +* [**ThumbnailView**](./interactive-pdf-navigation/page-thumbnail-navigation): Navigate within the document using page thumbnails. +* [**BookmarkView**](./interactive-pdf-navigation/bookmark-navigation): Navigate using document bookmarks (table of contents). +* [**TextSelection**](./textselection): Select and copy text from the document. +* [**TextSearch**](./text-search): Search for text across the document. +* [**Print**](./print): Print the entire document or specific pages directly from the browser. +* [**Annotation**](./annotations/text-markup-annotation): Add and edit annotations. +* [**FormFields**](./form-designer/create-programmatically): Work with form fields in the document. +* [**FormDesigner**](./form-designer/create-programmatically): Add or edit form fields in the document. ->In addition to injecting the required modules in your application, enable corresponding properties to extend the functionality for a PDF Viewer instance. -Refer to the following table. +> In addition to injecting the required modules in an application, enable the corresponding properties to activate features on a PDF Viewer instance. +Refer to the following table: | Module | Dependent modules to be injected for extending the functionality of PDF Viewer in your application | Property to enable the functionality for a PDF Viewer instance | |---|---|---| diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es6/form-designer/create-programmatically.md b/Document-Processing/PDF/PDF-Viewer/javascript-es6/form-designer/create-programmatically.md index 0b5227170..cb9a6291d 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es6/form-designer/create-programmatically.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es6/form-designer/create-programmatically.md @@ -1,30 +1,28 @@ --- layout: post -title: Create programmatically in Typescript Pdfviewer control | Syncfusion -description: Learn here all about Create programmatically in Syncfusion Typescript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Create form fields in the TypeScript PDF Viewer component | Syncfusion +description: Learn how to add, update, delete, save, print, validate, and import/export form fields in the Syncfusion TypeScript PDF Viewer component. platform: document-processing -control: Create programmatically -publishingplatform: Typescript +control: PDF Viewer documentation: ug -domainurl: ##DomainURL## --- -# Create programmatically in Typescript Pdfviewer control +# Create programmatically in TypeScript PDF Viewer control -The PDF Viewer control provides the option to add, edit and delete the Form Fields. The Form Fields type supported by the PDF Viewer Control are: +The PDF Viewer component provides options to add, edit, and delete form fields. The supported form field types are: - * Textbox - * Password - * CheckBox - * RadioButton - * ListBox - * DropDown - * SignatureField - * InitialField +- Textbox +- Password +- CheckBox +- RadioButton +- ListBox +- DropDown +- Signature field +- Initial field ## Add a form field to PDF document programmatically -Using addFormField method, the form fields can be added to the PDF document programmatically. We need to pass two parameters in this method. They are Form Field Type and Properties of Form Field Type. To add form field programmatically, Use the following code. +Use the addFormField method to add form fields programmatically. Pass the form field type and the corresponding property object as parameters. The following example demonstrates adding multiple fields on document load. {% tabs %} {% highlight ts tabtitle="index.ts" %} @@ -37,7 +35,7 @@ PdfViewer.Inject( Toolbar,Magnification, Navigation, LinkAnnotation, ThumbnailVi let pdfviewer: PdfViewer = new PdfViewer({ documentPath:'https://cdn.syncfusion.com/content/pdf/form-designer.pdf', - resourceUrl:"https://cdn.syncfusion.com/ej2/23.1.43/dist/ej2-pdfviewer-lib" + resourceUrl:"https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib" }); pdfviewer.appendTo('#PdfViewer'); @@ -73,19 +71,10 @@ pdfviewer.documentLoad = function (args) { EJ2 PDF Viewer - + - - - - - - - - - - + @@ -100,15 +89,14 @@ pdfviewer.documentLoad = function (args) { {% endhighlight %} {% endtabs %} -N> To set up the **server-backed PDF Viewer**, -Add the below `serviceUrl` in the `index.ts` file +N> To configure the server-backed PDF Viewer, add the following `serviceUrl` in the `index.ts` file: `pdfviewer.serviceUrl = 'https://document.syncfusion.com/web-services/pdf-viewer/api/pdfviewer/';` {% previewsample "Document-Processing/code-snippet/pdfviewer/javascript-es6/addformfield-cs3/index.html" %} ## Edit/Update form field programmatically -Using updateFormField method, Form Field can be updated programmatically. We should get the Form Field object/Id from FormFieldCollections property that you would like to edit and pass it as a parameter to updateFormField method. The second parameter should be the properties that you would like to update for Form Field programmatically. We have updated the value and background Color properties of Textbox Form Field. +Use the updateFormField method to modify a form field programmatically. Retrieve the target field from the formFieldCollections property (by object or ID) and pass it as the first parameter. Provide the properties to update as the second parameter. The following example updates the background color of a Textbox field. {% tabs %} {% highlight ts tabtitle="index.ts" %} @@ -121,7 +109,7 @@ TextSelection, Annotation, FormDesigner, FormFields); let pdfviewer: PdfViewer = new PdfViewer({ documentPath:'https://cdn.syncfusion.com/content/pdf/form-designer.pdf', - resourceUrl:"https://cdn.syncfusion.com/ej2/23.1.43/dist/ej2-pdfviewer-lib" + resourceUrl:"https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib" }); pdfviewer.appendTo('#PdfViewer'); @@ -158,19 +146,10 @@ pdfviewer.formDesignerModule.updateFormField(pdfviewer.formFieldCollections[0], EJ2 PDF Viewer - + - - - - - - - - - - + @@ -185,15 +164,14 @@ pdfviewer.formDesignerModule.updateFormField(pdfviewer.formFieldCollections[0], {% endhighlight %} {% endtabs %} -N> To set up the **server-backed PDF Viewer**, -Add the below `serviceUrl` in the `index.ts` file +N> To configure the server-backed PDF Viewer, add the following `serviceUrl` in the `index.ts` file: `pdfviewer.serviceUrl = 'https://document.syncfusion.com/web-services/pdf-viewer/api/pdfviewer/';` {% previewsample "Document-Processing/code-snippet/pdfviewer/javascript-es6/updateformfield-cs3/index.html" %} ## Delete form field programmatically -Using deleteFormField method, the form field can be deleted programmatically. We should retrieve the Form Field object/Id from FormFieldCollections property that you would like to delete and pass it as a parameter to deleteFormField method. To delete a Form Field programmatically, use the following code. +Use the deleteFormField method to remove a form field programmatically. Retrieve the target field from the formFieldCollections property (by object or ID) and pass it to deleteFormField. The following example deletes the first form field. {% tabs %} {% highlight ts tabtitle="index.ts" %} @@ -206,7 +184,7 @@ TextSelection, Annotation, FormDesigner, FormFields); let pdfviewer: PdfViewer = new PdfViewer({ documentPath:'https://cdn.syncfusion.com/content/pdf/form-designer.pdf', - resourceUrl:"https://cdn.syncfusion.com/ej2/23.1.43/dist/ej2-pdfviewer-lib" + resourceUrl:"https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib" }); pdfviewer.appendTo('#PdfViewer'); @@ -243,19 +221,10 @@ pdfviewer.documentLoad = function (args) { EJ2 PDF Viewer - + - - - - - - - - - - + @@ -270,19 +239,18 @@ pdfviewer.documentLoad = function (args) { {% endhighlight %} {% endtabs %} -N> To set up the **server-backed PDF Viewer**, -Add the below `serviceUrl` in the `index.ts` file +N> To configure the server-backed PDF Viewer, add the following `serviceUrl` in the `index.ts` file: `pdfviewer.serviceUrl = 'https://document.syncfusion.com/web-services/pdf-viewer/api/pdfviewer/';` {% previewsample "Document-Processing/code-snippet/pdfviewer/javascript-es6/deleteformfield-cs3/index.html" %} ## Saving the form fields -When the download icon is selected on the toolbar, the Form Fields will be saved in the PDF document and this action will not affect the original document. Refer the below GIF for further reference. +Selecting the Download icon on the toolbar saves the form fields in the exported PDF without modifying the original document. See the following GIF for reference. -![Alt text](../images/saveformfield.gif) +![Save form fields from the PDF Viewer](../images/saveformfield.gif) -You can invoke download action using following code snippet. +You can invoke the download action using the following code snippet. {% tabs %} {% highlight ts tabtitle="Standalone" %} @@ -315,11 +283,11 @@ pdfviewer.download(); ## Printing the form fields -When the print icon is selected on the toolbar, the PDF document will be printed along with the Form Fields added to the pages and this action will not affect the original document. Refer the below GIF for further reference. +Selecting the Print icon on the toolbar prints the PDF with the added form fields. This action does not modify the original document. See the following GIF for reference. -![Alt text](../images/printformfield.gif) +![Print the PDF with form fields](../images/printformfield.gif) -You can invoke print action using the following code snippet., +You can invoke the print action using the following code snippet: {% tabs %} {% highlight ts tabtitle="Standalone" %} @@ -360,7 +328,7 @@ pdfviewer.print.print(); ## setFormFieldMode programmatically -The **setFormFieldMode** method is a function in the Syncfusion PDF Viewer library that allows you to add a form field dynamically by passing the type of the form field. You can pass the form fields as a parameter like below. +The setFormFieldMode method enables adding a form field dynamically by specifying the field type. For example, the following adds a Password field when a button is clicked. ``` @@ -406,15 +374,15 @@ document.getElementById('addPasswordField').addEventListener('click', function ( ## Open the existing PDF document -We can open the already saved PDF document contains Form Fields in it by clicking the open icon in the toolbar. Refer the below GIF for further reference. +Open a PDF that already contains form fields by clicking the Open icon on the toolbar. See the following GIF for reference. -![Alt text](../images/openexistingpdf.gif) +![Open a PDF with existing form fields](../images/openexistingpdf.gif) ## Validate form fields -The form fields in the PDF Document will be validated when the `enableFormFieldsValidation` is set to true and hook the validateFormFields. The validateFormFields will be triggered when the PDF document is downloaded or printed with the non-filled form fields. The non-filled fields will be obtained in the `nonFillableFields` property of the event arguments of validateFormFields. +Form fields are validated when enableFormFieldsValidation is set to true and the validateFormFields event is handled. The event triggers during download or print if required fields are not filled. The non-filled fields are available in the nonFillableFields property of the event arguments. -Add the following code snippet to validate the form fields, +Add the following code to validate form fields: {% tabs %} {% highlight ts tabtitle="Standalone" %} @@ -454,11 +422,11 @@ var nonfilledFormFields = args.nonFillableFields; ## Export and import form fields -The PDF Viewer control provides the support to export and import the form field data in the following formats using the `importFormFields`, `exportFormFields`, and `exportFormFieldsAsObject` methods. +The PDF Viewer component supports exporting and importing form field data using the importFormFields, exportFormFields, and exportFormFieldsAsObject methods in the following formats: -* FDF -* XFDF -* JSON +- FDF +- XFDF +- JSON ### Export and import as FDF @@ -467,7 +435,7 @@ Using the `exportFormFields` method, the form field data can be exported in the * The first one must be the destination path for the exported data. If the path is not specified, it will ask for the location while exporting. * The second parameter should be the format type of the form data. -The following code explains how to export the form field data as FDF. +The following example exports and imports form field data as FDF. ```ts @@ -492,7 +460,7 @@ document.getElementById('importFdf').addEventListener('click', ()=> { ### Export and import as XFDF -The following code explains how to export the form field data as XFDF. +The following example exports and imports form field data as XFDF. ```ts @@ -517,7 +485,7 @@ document.getElementById('importXfdf').addEventListener('click', ()=> { ### Export and import as JSON -The following code explains how to export the form field data as JSON. +The following example exports and imports form field data as JSON. ```ts @@ -542,7 +510,7 @@ document.getElementById('importJson').addEventListener('click', ()=> { ### Export and import as Object -The PDF Viewer control supports exporting the form field data as an object, and the exported data will be imported into the current PDF document from the object. +The PDF Viewer component supports exporting the form field data as an object and importing that data back into the current PDF document. The following code shows how to export the form field data as an object and import the form field data from that object into the current PDF document via a button click. @@ -587,20 +555,20 @@ document.getElementById('importData').addEventListener('click', ()=> { ``` ## Form field properties -Form field properties in Syncfusion PDF Viewer allow you to customize and interact with form fields embedded within PDF documents. This documentation provides an overview of the form field properties supported by the Syncfusion PDF Viewer and explains how to use them effectively. +Form field properties allow customization and interaction with fields embedded in PDF documents. The following sections outline the supported field types and their configurable settings. - * Textbox - * Password - * CheckBox - * RadioButton - * ListBox - * DropDown - * SignatureField - * InitialField +- Textbox +- Password +- CheckBox +- RadioButton +- ListBox +- DropDown +- Signature field +- Initial field ### Signature and initial fields settings -Using the `updateFormField` method, the form fields can be updated programmatically. +Use the updateFormField method to modify form fields programmatically. The following code example explains how to update the signature field properties on a button click. @@ -621,7 +589,7 @@ document.getElementById('updateProperties').addEventListener('click',function() ``` -The following code example explains how to update the properties of the signature field added to the document from the form designer toolbar. +The following code shows how to configure default properties for a signature field added from the Form Designer toolbar. ```ts @@ -659,9 +627,9 @@ viewer.signatureFieldSettings = { ``` -![Signature Field Settings](../images/SignatureField.png) +![Signature field settings in the PDF Viewer](../images/SignatureField.png) -The following code example explains how to update the properties of the initial field added to the document from the form designer toolbar. +The following code shows how to configure default properties for an initial field added from the Form Designer toolbar. ```ts @@ -699,13 +667,13 @@ viewer.initialFieldSettings = { ``` -![Initial Field Settings](../images/InitialField.png) +![Initial field settings in the PDF Viewer](../images/InitialField.png) ### Textbox field settings Using the `updateFormField` method, the form fields can be updated programmatically. -The following code example explains how to update the Textbox field properties on a button click. +The following example updates Textbox field properties on a button click. ```html @@ -741,7 +709,7 @@ document.getElementById('updateProperties').addEventListener('click',function() ``` -The following code example explains how to update the properties of the Textbox field added to the document from the form designer toolbar. +The following code shows how to configure default properties for a Textbox field added from the Form Designer toolbar. ```ts @@ -785,13 +753,13 @@ viewer.textFieldSettings = { ``` -![Textbox Field Settings](../images/Textbox.png) +![Textbox field settings in the PDF Viewer](../images/Textbox.png) ### Password field settings Using the `updateFormField` method, the form fields can be updated programmatically. -The following code example explains how to update the Password field properties on a button click. +The following example updates Password field properties on a button click. ```html @@ -826,7 +794,7 @@ document.getElementById('updateProperties').addEventListener('click',function() ``` -The following code example explains how to update the properties of the Password field added to the document from the form designer toolbar. +The following code shows how to configure default properties for a Password field added from the Form Designer toolbar. ```ts @@ -868,13 +836,13 @@ viewer.passwordFieldSettings = { ``` -![Password Field Settings](../images/Password.png) +![Password field settings in the PDF Viewer](../images/Password.png) ### CheckBox field settings Using the `updateFormField` method, the form fields can be updated programmatically. -The following code example explains how to update the CheckBox field properties on a button click. +The following example updates CheckBox field properties on a button click. ```html @@ -903,7 +871,7 @@ document.getElementById('updateProperties').addEventListener('click',function() ``` -The following code example explains how to update the properties of the CheckBox field added to the document from the form designer toolbar. +The following code shows how to configure default properties for a CheckBox field added from the Form Designer toolbar. ```ts @@ -934,13 +902,13 @@ viewer.checkBoxFieldSettings = { ``` -![Checkbox Settings](../images/Checkbox.png) +![CheckBox field settings in the PDF Viewer](../images/Checkbox.png) ### RadioButton field settings Using the `updateFormField` method, the form fields can be updated programmatically. -The following code example explains how to update the RadioButton field properties on a button click. +The following example updates RadioButton field properties on a button click. ```html @@ -969,7 +937,7 @@ document.getElementById('updateProperties').addEventListener('click',function() ``` -The following code example explains how to update the properties of the RadioButton field added to the document from the form designer toolbar. +The following code shows how to configure default properties for a RadioButton field added from the Form Designer toolbar. ```ts @@ -1001,13 +969,13 @@ viewer.radioButtonFieldSettings = { ``` -![Radiobutton Settings](../images/Radiobutton.png) +![RadioButton field settings in the PDF Viewer](../images/Radiobutton.png) ### ListBox field settings Using the `updateFormField` method, the form fields can be updated programmatically. -The following code example explains how to update the ListBox field properties on a button click. +The following example updates ListBox field properties on a button click. ```html @@ -1041,7 +1009,7 @@ document.getElementById('updateProperties').addEventListener('click',function() ``` -The following code example explains how to update the properties of the Listbox field added to the document from the form designer toolbar. +The following code shows how to configure default properties for a ListBox field added from the Form Designer toolbar. ```ts @@ -1084,13 +1052,13 @@ viewer.listBoxFieldSettings = { ``` -![Listbox Settings](../images/Listbox.png) +![ListBox field settings in the PDF Viewer](../images/Listbox.png) ### DropDown field settings Using the `updateFormField` method, the form fields can be updated programmatically. -The following code example explains how to update the DropDown field properties on a button click. +The following example updates DropDown field properties on a button click. ```html @@ -1124,7 +1092,7 @@ document.getElementById('updateProperties').addEventListener('click',function() ``` -The following code example explains how to update the properties of the Dropdown field added to the document from the form designer toolbar. +The following code shows how to configure default properties for a DropDown field added from the Form Designer toolbar. ```ts @@ -1167,4 +1135,4 @@ viewer.listBoxFieldSettings = { ``` -![Dropdown Settings](../images/Dropdown.png) \ No newline at end of file +![DropDown field settings in the PDF Viewer](../images/Dropdown.png) diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es6/form-designer/create-with-user-interface-interaction.md b/Document-Processing/PDF/PDF-Viewer/javascript-es6/form-designer/create-with-user-interface-interaction.md index 789fb974e..df46c4910 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es6/form-designer/create-with-user-interface-interaction.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es6/form-designer/create-with-user-interface-interaction.md @@ -1,30 +1,28 @@ --- layout: post -title: User interaction in Typescript Pdfviewer control | Syncfusion -description: Learn here all about Create with user interface interaction in Syncfusion Typescript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Design form fields in the TypeScript PDF Viewer component | Syncfusion +description: Learn how to add, drag, resize, edit, and manage form fields using the UI in the Syncfusion TypeScript PDF Viewer component. platform: document-processing -control: Create with user interface interaction -publishingplatform: Typescript +control: PDF Viewer documentation: ug -domainurl: ##DomainURL## --- -# Create with user interface interaction +# Create with user interface interaction for TypeScript -The PDF viewer control provides the option for interaction with Form Fields such as Drag and resize. you can draw a Form Field dynamically by clicking the Form Field icon on the toolbar and draw it in the PDF document. The Form Fields type supported by the PDF Viewer Control are: +The PDF Viewer component supports interactive form field design, including drawing, dragging, and resizing fields directly on the page. Click the Form Field icon on the toolbar to add a field and place it on the document. Supported form field types include: - * Textbox - * Password - * CheckBox - * RadioButton - * ListBox - * DropDown - * SignatureField - * InitialField +- Textbox +- Password +- CheckBox +- RadioButton +- ListBox +- DropDown +- Signature field +- Initial field ## Enable or Disable form designer toolbar -We should inject FormDesigner module and set enableFormDesignerToolbar as true to enable the Form designer icon on the toolbar. By default, enableFormDesignerToolbar is set as true. Use the following code to inject FormDesigner module and to enable the enableFormDesignerToolbar property. +Inject the FormDesigner module and set enableFormDesignerToolbar to true to display the Form Designer icon on the toolbar. The default value is true. Use the following code to enable the toolbar option. ```ts import { PdfViewer } from '@syncfusion/ej2-pdfviewer'; @@ -37,41 +35,41 @@ pdfviewer.enableFormDesignerToolbar= true; ## Add the form field dynamically -Click the Form Field icon on the toolbar and then click on to the PDF document to draw a Form Field. Refer the below GIF for further reference. +Click the Form Field icon on the toolbar, then click on the PDF to draw a form field. See the following GIF for reference. -![Alt text](../images/addformfield.gif) +![Add a form field using the toolbar](../images/addformfield.gif) ## Drag the form field -We provide options to drag the Form Field which is currently selected in the PDF document. Refer the below GIF for further reference. +Drag the selected form field to reposition it within the PDF document. See the following GIF for reference. -![Alt text](../images/dragformfield.gif) +![Drag a selected form field in the PDF Viewer](../images/dragformfield.gif) ## Resize the form field -We provide options to resize the Form Field which is currently selected in the PDF document. Refer the below GIF for further reference. +Resize the selected form field using the resize handles on the field boundary. See the following GIF for reference. -![Alt text](../images/resizeformfield.gif) +![Resize a selected form field in the PDF Viewer](../images/resizeformfield.gif) ## Edit or Update the form field dynamically -The properties of the Form Fields can be edited using the Form Field Properties window. It can be opened by selecting the Properties option in the context menu that appears on the right by clicking the Form Field object. Refer the below image for the properties available to customize the appearance of the Form Field. +Edit form field properties using the Form Field Properties dialog. Open it by right-clicking a form field and selecting Properties from the context menu. The following images show examples of available settings. -![Alt text](../images/generalproperties.png) +![Form field general properties dialog](../images/generalproperties.png) -![Alt text](../images/appearanceproperties.png) +![Form field appearance properties dialog](../images/appearanceproperties.png) -![Alt text](../images/dropdownproperties.png) +![DropDown field properties dialog](../images/dropdownproperties.png) ## Clipboard operation with form field -The PDF Viewer control supports the clipboard operations such as cut, copy and paste for Form Fields. You can right click on the Form Field object to view the context menu and select to the clipboard options that you would like to perform. Refer the below image for the options in the context menu. +The PDF Viewer supports clipboard operations such as cut, copy, and paste for form fields. Right-click a form field to open the context menu and choose the desired clipboard action. The following image shows the available options. -![Alt text](../images/clipboardformfield.png) +![Clipboard options for a form field in the context menu](../images/clipboardformfield.png) ## Undo and Redo -We provided support to undo/redo the Form Field actions that are performed at runtime. Use the following code example to perform undo/redo actions. +Undo and redo actions are supported for runtime changes made to form fields. Use the following code to perform undo and redo operations. ```ts import { PdfViewer } from '@syncfusion/ej2-pdfviewer'; diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es6/form-designer/form-field-events.md b/Document-Processing/PDF/PDF-Viewer/javascript-es6/form-designer/form-field-events.md index b1a8e3804..c4ec104bb 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es6/form-designer/form-field-events.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es6/form-designer/form-field-events.md @@ -1,15 +1,14 @@ --- layout: post -title: Form Field Events in Typescript Pdfviewer control | Syncfusion -description: Learn here all about different form field in Syncfusion Typescript Pdfviewer component of Syncfusion Essential JS 2 and more. +title: Form Field Events in TypeScript PDF Viewer control | Syncfusion +description: Learn here all about different form field in Syncfusion TypeScript PDF Viewer component of Syncfusion Essential JS 2 and more. platform: document-processing -control: Form Field Events -publishingplatform: Typescript +control: PDF Viewer documentation: ug domainurl: ##DomainURL## --- -# PDF Viewer Form Field events +# PDF Viewer Form Field events in TypeScript The PDF Viewer control provides the support to different Form Field events. The Form Field events supported by the PDF Viewer Control are: diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es6/form-filling.md b/Document-Processing/PDF/PDF-Viewer/javascript-es6/form-filling.md new file mode 100644 index 000000000..a6384128f --- /dev/null +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es6/form-filling.md @@ -0,0 +1,83 @@ +--- +layout: post +title: Form filling in TypeScript PDF Viewer | Syncfusion +description: Learn to view, fill, export, and import PDF form fields in Syncfusion TS PDF Viewer, including disabling interaction and handling signatures. +platform: document-processing +control: PDF Viewer +documentation: ug +domainurl: ##DomainURL## +--- + +# Form filling in TypeScript PDF Viewer + +The PDF Viewer displays existing form fields in a PDF and enables users to fill, validate, and download the filled data. + +The PDF Viewer supports the following form field types: + +* Text box +* Password +* Check box +* Radio button +* List box +* Dropdown +* Signature field +* Initial field + +![Form filling in TypeScript PDF Viewer](./images/form-filling.png) + +## Disabling form fields + +The PDF Viewer provides an option to disable interaction with form fields. Use the following configuration to disable form fields in the viewer. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +import { PdfViewer, Toolbar, Magnification, Navigation, Annotation, LinkAnnotation, ThumbnailView, BookmarkView, TextSelection, TextSearch, FormFields, FormDesigner} from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject(Toolbar, Magnification, Navigation, Annotation, LinkAnnotation, ThumbnailView, BookmarkView, TextSelection, TextSearch, FormFields, FormDesigner); + +let pdfviewer: PdfViewer = new PdfViewer(); +pdfviewer.documentPath = "https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf"; +pdfviewer.resourceUrl = "https://cdn.syncfusion.com/ej2/31.1.17/dist/ej2-pdfviewer-lib"; +pdfviewer.enableFormDesigner = false; +pdfviewer.appendTo('#PdfViewer'); + +{% endhighlight %} +{% endtabs %} + +## Add a handwritten signature to a signature field + +Add a handwritten signature to a signature field by following these steps: + +* Click the signature field in the PDF document to open the signature panel. + +![Signature field in TypeScript PDF Viewer](./images/form-filling-signature.png) + +* Draw the signature in the signature panel. + +![Signature panel in TypeScript PDF Viewer](./images/form-filling-signature-dialog.png) + +* Select **CREATE**. The drawn signature is added to the signature field. + +![Signature added in TypeScript PDF Viewer](./images/form-filling-signature-signed.png) + +## Delete a signature from a signature field + +Delete a signature placed in a signature field by using the Delete option in the annotation toolbar. + +![Deleting a signature in TypeScript PDF Viewer](./images/form-filling-signature-del.png) + +## Export and import form fields + +The PDF Viewer supports exporting and importing form field data using the `importFormFields`, `exportFormFields`, and `exportFormFieldsAsObject` methods. The following formats are supported: + +* FDF +* XFDF +* JSON + +For more information, see the [Form fields documentation](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/form-designer/create-programmatically#export-and-import-form-fields). + +## See also + +* [Handwritten signature in TypeScript PDF Viewer](./annotations/signature-annotation) +* [Form Designer events](./form-designer/form-field-events) diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es6/formdesigner/programmatically-work-with-form-field.md b/Document-Processing/PDF/PDF-Viewer/javascript-es6/formdesigner/programmatically-work-with-form-field.md deleted file mode 100644 index 57ba56d5c..000000000 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es6/formdesigner/programmatically-work-with-form-field.md +++ /dev/null @@ -1,116 +0,0 @@ ---- -layout: post -title: Programmatically work with form field in Typescript Pdfviewer control | Syncfusion -description: Learn here all about Programmatically work with form field in Syncfusion Typescript Pdfviewer control of Syncfusion Essential JS 2 and more. -platform: document-processing -control: Programmatically work with form field -publishingplatform: Typescript -documentation: ug -domainurl: ##DomainURL## ---- - -# Programmatically work with form field in Typescript Pdfviewer control - -The PDF Viewer control provides the option to add, edit and delete the Form Fields. The Form Fields type supported by the PDF Viewer Control are: - - * Textbox - * Password - * CheckBox - * RadioButton - * ListBox - * DropDown - * SignatureField - * InitialField - -## Add a form field to PDF document programmatically - -Using addFormField method, the form fields can be added to the PDF document programmatically. We need to pass two parameters in this method. They are Form Field Type and Properties of Form Field Type. To add form field programmatically, Use the following code. - -{% tabs %} -{% highlight ts tabtitle="index.ts" %} -{% include code-snippet/pdfviewer/javascript-es6/addformfield-cs4/index.ts %} -{% endhighlight %} -{% highlight html tabtitle="index.html" %} -{% include code-snippet/pdfviewer/javascript-es6/addformfield-cs4/index.html %} -{% endhighlight %} -{% endtabs %} - -{% previewsample "Document-Processing/code-snippet/pdfviewer/javascript-es6/addformfield-cs4/index.html" %} - -## Edit/Update form field programmatically - -Using updateFormField method, Form Field can be updated programmatically. We should get the Form Field object/Id from FormFieldCollections property that you would like to edit and pass it as a parameter to updateFormField method. The second parameter should be the properties that you would like to update for Form Field programmatically. We have updated the value and background Color properties of Textbox Form Field. - -{% tabs %} -{% highlight ts tabtitle="index.ts" %} -{% include code-snippet/pdfviewer/javascript-es6/updateformfield-cs4/index.ts %} -{% endhighlight %} -{% highlight html tabtitle="index.html" %} -{% include code-snippet/pdfviewer/javascript-es6/updateformfield-cs4/index.html %} -{% endhighlight %} -{% endtabs %} - -{% previewsample "Document-Processing/code-snippet/pdfviewer/javascript-es6/updateformfield-cs4/index.html" %} - -## Delete form field programmatically - -Using deleteFormField method, the form field can be deleted programmatically. We should retrieve the Form Field object/Id from FormFieldCollections property that you would like to delete and pass it as a parameter to deleteFormField method. To delete a Form Field programmatically, use the following code. - -{% tabs %} -{% highlight ts tabtitle="index.ts" %} -{% include code-snippet/pdfviewer/javascript-es6/deleteformfield-cs4/index.ts %} -{% endhighlight %} -{% highlight html tabtitle="index.html" %} -{% include code-snippet/pdfviewer/javascript-es6/deleteformfield-cs4/index.html %} -{% endhighlight %} -{% endtabs %} - -{% previewsample "Document-Processing/code-snippet/pdfviewer/javascript-es6/deleteformfield-cs4/index.html" %} - -## Saving the form fields - -When the download icon is selected on the toolbar, the Form Fields will be saved in the PDF document and this action will not affect the original document. Refer the below GIF for further reference. - -![Alt text](../images/saveformfield.gif) - -You can invoke download action using following code snippet. - -```ts -import { PdfViewer, Toolbar, Magnification, Navigation, Annotation, LinkAnnotation,ThumbnailView,BookmarkView, TextSelection} from '@syncfusion/ej2-pdfviewer'; - -PdfViewer.Inject(Toolbar,Magnification,Navigation, Annotation, LinkAnnotation,ThumbnailView,BookmarkView, TextSelection); - -let pdfviewer: PdfViewer = new PdfViewer(); -pdfviewer.serviceUrl = 'https://document.syncfusion.com/web-services/pdf-viewer/api/pdfviewer/'; -pdfviewer.appendTo('#PdfViewer'); -pdfviewer.load('PDF_Succinctly.pdf', null); -pdfviewer.download(); - -``` - -## Printing the form fields - -When the print icon is selected on the toolbar, the PDF document will be printed along with the Form Fields added to the pages and this action will not affect the original document. Refer the below GIF for further reference. - -![Alt text](../images/printformfield.gif) - -You can invoke print action using the following code snippet., - -```ts -import { PdfViewer, Toolbar, Magnification, Navigation, Annotation, LinkAnnotation,ThumbnailView,BookmarkView, TextSelection} from '@syncfusion/ej2-pdfviewer'; - -PdfViewer.Inject(Toolbar,Magnification,Navigation, Annotation, LinkAnnotation,ThumbnailView,BookmarkView, TextSelection); - -let pdfviewer: PdfViewer = new PdfViewer(); -pdfviewer.serviceUrl = 'https://document.syncfusion.com/web-services/pdf-viewer/api/pdfviewer/'; -pdfviewer.appendTo('#PdfViewer'); -pdfviewer.load('PDF_Succinctly.pdf', null); -pdfviewer.print.print(); - -``` - -## Open the existing PDF document - -We can open the already saved PDF document contains Form Fields in it by clicking the open icon in the toolbar. Refer the below GIF for further reference. - -![Alt text](../images/openexistingpdf.gif) \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es6/formdesigner/user-interaction-with-form-fields.md b/Document-Processing/PDF/PDF-Viewer/javascript-es6/formdesigner/user-interaction-with-form-fields.md deleted file mode 100644 index 288f1be1b..000000000 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es6/formdesigner/user-interaction-with-form-fields.md +++ /dev/null @@ -1,84 +0,0 @@ ---- -layout: post -title: User interaction with form fields in Typescript Pdfviewer control | Syncfusion -description: Learn here all about User interaction with form fields in Syncfusion Typescript Pdfviewer control of Syncfusion Essential JS 2 and more. -platform: document-processing -control: User interaction with form fields -publishingplatform: Typescript -documentation: ug -domainurl: ##DomainURL## ---- - -# User interaction with form fields in Typescript Pdfviewer control - -The PDF viewer control provides the option for interaction with Form Fields such as Drag and resize. you can draw a Form Field dynamically by clicking the Form Field icon on the toolbar and draw it in the PDF document. The Form Fields type supported by the PDF Viewer Control are: - - * Textbox - * Password - * CheckBox - * RadioButton - * ListBox - * DropDown - * SignatureField - * InitialField - -## Enable or Disable form designer toolbar - -We should inject FormDesigner module and set enableFormDesignerToolbar as true to enable the Form designer icon on the toolbar. By default, enableFormDesignerToolbar is set as true. Use the following code to inject FormDesigner module and to enable the enableFormDesignerToolbar property. - -```ts -import { PdfViewer } from '@syncfusion/ej2-pdfviewer'; -PdfViewer.Inject(FormDesigner); - -let pdfviewer: PdfViewer = new PdfViewer(); -pdfviewer.enableFormDesignerToolbar= true; - -``` - -## Add the form field dynamically - -Click the Form Field icon on the toolbar and then click on to the PDF document to draw a Form Field. Refer the below GIF for further reference. - -![Alt text](../images/addformfield.gif) - -## Drag the form field - -We provide options to drag the Form Field which is currently selected in the PDF document. Refer the below GIF for further reference. - -![Alt text](../images/dragformfield.gif) - -## Resize the form field - -We provide options to resize the Form Field which is currently selected in the PDF document. Refer the below GIF for further reference. - -![Alt text](../images/resizeformfield.gif) - -## Edit or Update the form field dynamically - -The properties of the Form Fields can be edited using the Form Field Properties window. It can be opened by selecting the Properties option in the context menu that appears on the right by clicking the Form Field object. Refer the below image for the properties available to customize the appearance of the Form Field. - -![Alt text](../images/generalproperties.png) - -![Alt text](../images/appearanceproperties.png) - -![Alt text](../images/dropdownproperties.png) - -## Clipboard operation with form field - -The PDF Viewer control supports the clipboard operations such as cut, copy and paste for Form Fields. You can right click on the Form Field object to view the context menu and select to the clipboard options that you would like to perform. Refer the below image for the options in the context menu. - -![Alt text](../images/clipboardformfield.png) - -## Undo and Redo - -We provided support to undo/redo the Form Field actions that are performed at runtime. Use the following code example to perform undo/redo actions. - -```ts -import { PdfViewer } from '@syncfusion/ej2-pdfviewer'; -PdfViewer.Inject(FormDesigner); - -let pdfviewer: PdfViewer = new PdfViewer(); -pdfviewer.undo(); -pdfviewer.redo(); - -``` \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es6/getting-started-with-server-backed.md b/Document-Processing/PDF/PDF-Viewer/javascript-es6/getting-started-with-server-backed.md index cce41ea4e..dcbab9ccb 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es6/getting-started-with-server-backed.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es6/getting-started-with-server-backed.md @@ -1,23 +1,22 @@ --- layout: post -title: Getting started with Typescript PDF Viewer control | Syncfusion -description: Checkout and learn about Getting started with Typescript PDF Viewer control of Syncfusion Essential JS 2 and more details. +title: Getting started with TypeScript PDF Viewer (server-backed) | Syncfusion +description: Learn how to set up and use the Syncfusion TypeScript PDF Viewer in server-backed mode using the EJ2 quickstart, including module injection and web service configuration. platform: document-processing control: PDF Viewer -publishingplatform: Typescript documentation: ug domainurl: ##DomainURL## --- -# Getting started in Typescript PDF Viewer control +# Getting started with TypeScript PDF Viewer (server-backed) -This section briefly explains how to create **PDF Viewer** component and configure its available functionalities in TypeScript using the Essential JS 2 [quickstart](https://github.com/SyncfusionExamples/ej2-quickstart-webpack-) seed repository. +This guide explains how to create the PDF Viewer component and configure its features in TypeScript using the Essential JS 2 [quickstart](https://github.com/SyncfusionExamples/ej2-quickstart-webpack-) seed repository in server-backed mode. -> This application is integrated with the `webpack.config.js` configuration and uses the latest version of the [webpack-cli](https://webpack.js.org/api/cli/#commands). It requires node `v14.15.0` or higher. For more information about webpack and its features, refer to the [webpack documentation](https://webpack.js.org/guides/getting-started/). +> This application is integrated with a webpack configuration (`webpack.config.js`) and uses the latest version of the [webpack-cli](https://webpack.js.org/api/cli/#commands). It requires Node.js `v14.15.0` or higher. For more information, refer to the [webpack getting started guide](https://webpack.js.org/guides/getting-started/). -## Set up development environment +## Set up the development environment -Open the command prompt from the required directory, and run the following command to clone the Syncfusion JavaScript (Essential JS 2) quickstart project from [GitHub](https://github.com/SyncfusionExamples/ej2-quickstart-webpack-). +Open a command prompt in the target directory and run the following command to clone the Syncfusion JavaScript (Essential JS 2) quickstart project from [GitHub](https://github.com/SyncfusionExamples/ej2-quickstart-webpack-). {% tabs %} {% highlight bash tabtitle="CMD" %} @@ -27,7 +26,7 @@ git clone https://github.com/SyncfusionExamples/ej2-quickstart-webpack- ej2-quic {% endhighlight %} {% endtabs %} -After cloning the application in the `ej2-quickstart` folder, run the following command line to navigate to the `ej2-quickstart` folder. +After cloning, run the following command to navigate to the `ej2-quickstart` folder. {% tabs %} {% highlight bash tabtitle="CMD" %} @@ -39,9 +38,9 @@ cd ej2-quickstart ## Add Syncfusion JavaScript packages -Syncfusion JavaScript (Essential JS 2) packages are available on the [npmjs.com](https://www.npmjs.com/~syncfusionorg) public registry. You can install all Syncfusion JavaScript (Essential JS 2) controls in a single [@syncfusion/ej2](https://www.npmjs.com/package/@syncfusion/ej2) package or individual packages for each control. +Syncfusion JavaScript (Essential JS 2) packages are available on the [npmjs.com](https://www.npmjs.com/~syncfusionorg) public registry. Install all EJ2 controls with the [@syncfusion/ej2](https://www.npmjs.com/package/@syncfusion/ej2) meta package or install individual control packages. -The quickstart application is preconfigured with the dependent [@syncfusion/ej2](https://www.npmjs.com/package/@syncfusion/ej2) package in the `~/package.json` file. Use the following command to install the dependent npm packages from the command prompt. +The quickstart application is preconfigured with [@syncfusion/ej2](https://www.npmjs.com/package/@syncfusion/ej2) in `~/package.json`. Use the following command to install dependencies: {% tabs %} {% highlight bash tabtitle="NPM" %} @@ -51,9 +50,9 @@ npm install {% endhighlight %} {% endtabs %} -## Import the Syncfusion CSS styles +## Import Syncfusion CSS styles -Add the components CSS in the `~/src/styles/styles.css` file, as shown below: +Add the component CSS in the `~/src/styles/styles.css` file, as shown below: {% tabs %} {% highlight css tabtitle="style.css" %} @@ -71,9 +70,9 @@ Add the components CSS in the `~/src/styles/styles.css` file, as shown below: {% endhighlight %} {% endtabs %} -## Adding PDF Viewer component +## Add the PDF Viewer component -* Add the PDF Viewer component following code in the `app.ts` +* Add the PDF Viewer component in `app.ts`: {% tabs %} {% highlight ts tabtitle="app.ts" %} @@ -90,9 +89,9 @@ pdfviewer.load('https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', null {% endhighlight %} {% endtabs %} -N> From 23.1 version, it is must to call **pdfviewer.dataBind();** before load function. Refer [here](./troubleshooting/document-loading-issues) for more details. +N> Starting with version 23.1, it is required to call **pdfviewer.dataBind();** before invoking the `load` function. Refer to [document loading issues](./troubleshooting/document-loading-issues) for details. -* Add an HTML div element to act as the PDF Viewer element `index.html` using the following code. +* Add an HTML div element to act as the PDF Viewer element in `index.html`: {% tabs %} {% highlight html tabtitle="index.html" %} @@ -122,7 +121,7 @@ N> From 23.1 version, it is must to call **pdfviewer.dataBind();** before load f ## Run the application -The quickstart project is configured to compile and run the application in the browser. Use the following command to run the application. +The quickstart project is configured to compile and run in the browser. Use the following command to start the application: {% tabs %} {% highlight bash tabtitle="NPM" %} @@ -132,7 +131,7 @@ npm start {% endhighlight %} {% endtabs %} -Output will be displayed as follows. +Output: {% tabs %} {% highlight ts tabtitle="index.ts" %} @@ -143,7 +142,7 @@ Output will be displayed as follows. {% endhighlight %} {% endtabs %} -N> We have provided the support to dynamically change the `serviceURL`. So, after changing the `serviceURL` dynamically, you need invoke the `pdfViewer.dataBind()` method to update the `serviceURL` quickly. This will effectively change the `serviceURL` dynamically. Ensure that this step is performed after version 23.1.36. +N> The `serviceUrl` can be changed dynamically. After updating `serviceUrl`, invoke `pdfViewer.dataBind()` to apply the change, then call `load`. This behavior requires version 23.1.36 or later. document.getElementById('load').addEventListener('click', function () { pdfViewer.serviceUrl = "https://document.syncfusion.com/web-services/pdf-viewer/api/pdfviewer"; pdfViewer.documentPath = "https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf"; @@ -151,55 +150,55 @@ document.getElementById('load').addEventListener('click', function () { pdfViewer.load(pdfViewer.documentPath, null); }); -N> The Web API hosted link https://document.syncfusion.com/web-services/pdf-viewer/api/pdfviewer/ utilized in the PDF viewer's serviceUrl property is intended solely for demonstration and evaluation purposes. For production deployment, please host your own web service with your required server configurations. You can refer and reuse the [GitHub Web Service example](https://github.com/SyncfusionExamples/EJ2-PDFViewer-WebServices) or [Docker image](https://hub.docker.com/r/syncfusion/pdfviewer-server) for hosting your own web service and use for the serviceUrl property. **We strongly recommend using the standalone mode.** +N> The Web API link https://document.syncfusion.com/web-services/pdf-viewer/api/pdfviewer/ used in the `serviceUrl` property is intended for demonstration and evaluation only. For production, host your own web service with the required server configuration. You can reuse the [GitHub web service example](https://github.com/SyncfusionExamples/EJ2-PDFViewer-WebServices) or [Docker image](https://hub.docker.com/r/syncfusion/pdfviewer-server). **Standalone mode is strongly recommended.** {% previewsample "Document-Processing/code-snippet/pdfviewer/javascript-es6/getting-started-cs1/index.html" %} ## Module injection -To create PDF Viewer with additional features, inject the required modules. The following modules are used to extend PdfViewer's basic functionality:- +To enable additional features, inject the required modules. The following modules extend the PDF Viewer's functionality: -* `LinkAnnotation`:- Inject this module to use PDF Viewer link annotation. -* `BookmarkView`:- Inject this module to use bookmark view of the PDF Viewer. -* `Magnification`:- Inject this module to magnify the PDF Document. -* `Navigation`:- Inject this module to use page navigation on PDF Document. -* `TextSelection`:- Inject this module to use text selection with the PDF Document. -* `ThumbnailView`:- Inject this module to use thumbnail view of the PDF Viewer -* `Toolbar`:- Inject this module to enable the user interface for toolbar option in PDF Viewer. -* `Print`:- Inject this module to use pdfviewer print feature. -* `Annotation`:- Inject this module to use pdfviewer annotation feature. -* `TextSearch`:- Inject this module to use pdfviewer text search feature. -* `FormFields`:- Inject this module to use pdfviewer form fields feature. -* `FormDesigner`:- Inject this module to use pdfviewer form designer feature. +* `LinkAnnotation`: Enables hyperlink navigation. +* `BookmarkView`: Displays and navigates document bookmarks. +* `Magnification`: Provides zoom in/out operations. +* `Navigation`: Enables page navigation. +* `TextSelection`: Enables text selection. +* `ThumbnailView`: Displays page thumbnails for navigation. +* `Toolbar`: Enables the built-in toolbar UI. +* `Print`: Enables printing. +* `Annotation`: Enables annotation features. +* `TextSearch`: Enables text search. +* `FormFields`: Enables form field support. +* `FormDesigner`: Enables designing and editing of form fields. -These modules should be injected into the PDF Viewer using `PdfViewer.Inject` method. +Inject modules using the `PdfViewer.Inject` method. -> For PDF Viewer serviceUrl creation, follow the steps provided in the [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/how-to/create-pdfviewer-service) +> To create a PDF Viewer `serviceUrl`, follow the steps in [Create PDF Viewer service](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/how-to/create-pdfviewer-service). -## How to run the PDF Viewer web service +## Run the PDF Viewer web service -1.Download the sample from the [Web service sample in GitHub](https://github.com/SyncfusionExamples/EJ2-PDFViewer-WebServices) link. +1. Download the sample from the [web service sample in GitHub](https://github.com/SyncfusionExamples/EJ2-PDFViewer-WebServices). -2.Navigate to the `ASP.NET Core` folder and open it in the command prompt. +2. Navigate to the `ASP.NET Core` folder and open it in a command prompt. -3.Navigate to the appropriate subfolder based on your .NET version: +3. Navigate to the appropriate subfolder based on your .NET version: - .NET 6.0 → `PdfViewerWebService_6.0` - .NET 8.0 → `PdfViewerWebService_8.0` -4.Use the below command to restore the required packages. +4. Restore packages: ``` dotnet restore ``` -5.Use the below command to run the web service. +5. Run the web service: ``` dotnet run ``` -6.You can see that the PDF Viewer server instance runs in the localhost with the port number `localhost:5001` and navigate to the PDF Viewer Web control `localhost:5001/pdfviewer` which returns the default get response method. We can bind the link to the [serviceUrl](https://ej2.syncfusion.com/documentation/api/pdfviewer/#serviceurl) property of PDF Viewer as below. +6. The PDF Viewer server instance runs at `https://localhost:5001`. Navigate to `https://localhost:5001/pdfviewer` to see the default GET response. Bind this URL to the [serviceUrl](https://ej2.syncfusion.com/documentation/api/pdfviewer/#serviceurl) property of the PDF Viewer as shown below. {% tabs %} {% highlight ts tabtitle="app.ts" %} @@ -212,11 +211,11 @@ pdfviewer.load('PDF_Succinctly.pdf', null); {% endhighlight %} {% endtabs %} -N> When configuring the server-backed PDF viewer, it's essential to understand that there is no need to include the pdfium.js and pdfium.wasm files. Unlike the standalone PDF viewer, which relies on these files for local rendering, the server-backed PDF viewer fetches and renders PDFs directly from the server. Consequently, you can exclude the copy command for deployment process, as they are not required to load and display PDFs in this context. +N> In server-backed mode, do not include `pdfium.js` and `pdfium.wasm`. Unlike standalone mode, the server-backed PDF Viewer renders PDFs on the server. These files and their copy steps are not required for deployment in this context. -> You can refer to our [JavaScript PDF Viewer](https://www.syncfusion.com/pdf-viewer-sdk) feature tour page for its groundbreaking feature representations. You can also explore our [JavaScript PDF Viewer example](https://document.syncfusion.com/demos/pdf-viewer/javascript-es5/#/tailwind3/pdfviewer/default.html) to understand how to explains core features of PDF Viewer. +> Refer to the [JavaScript PDF Viewer feature tour](https://www.syncfusion.com/pdf-viewer-sdk) for an overview of capabilities. Explore the [JavaScript PDF Viewer example](https://document.syncfusion.com/demos/pdf-viewer/javascript-es5/#/tailwind3/pdfviewer/default.html) to see core features in action. -N> For hosting the web service on the Linux platform, ensure to include the [SkiaSharp.NativeAssets.Linux](https://nuget.org/packages/SkiaSharp.NativeAssets.Linux/3.116.1). Additionally, for AWS environments, utilize the following packages: +N> For hosting the web service on Linux, include [SkiaSharp.NativeAssets.Linux](https://nuget.org/packages/SkiaSharp.NativeAssets.Linux/3.116.1). For AWS environments, use the following packages: | **Amazon Web Services (AWS)** |**NuGet package name** | | --- | --- | diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es6/getting-started.md b/Document-Processing/PDF/PDF-Viewer/javascript-es6/getting-started.md index 93be7ac1d..f9882a5ff 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es6/getting-started.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es6/getting-started.md @@ -1,23 +1,22 @@ --- layout: post -title: Getting started with Typescript PDF Viewer control | Syncfusion -description: Checkout and learn about Getting started with Typescript PDF Viewer control of Syncfusion Essential JS 2 and more details. +title: Getting started with TypeScript PDF Viewer (standalone) | Syncfusion +description: Learn how to set up and use the Syncfusion TypeScript PDF Viewer in standalone mode using the EJ2 quickstart, including local resource configuration and module injection. platform: document-processing control: PDF Viewer -publishingplatform: Typescript documentation: ug domainurl: ##DomainURL## --- -# Getting started in Standalone PDF Viewer control +# Getting started with TypeScript PDF Viewer (standalone) -This section briefly explains how to create **PDF Viewer** component and configure its available functionalities in TypeScript using the Essential JS 2 [quickstart](https://github.com/SyncfusionExamples/ej2-quickstart-webpack-) seed repository. +This guide explains how to create the PDF Viewer component and configure its features in TypeScript using the Essential JS 2 [quickstart](https://github.com/SyncfusionExamples/ej2-quickstart-webpack-) seed repository. -> This application is integrated with the `webpack.config.js` configuration and uses the latest version of the [webpack-cli](https://webpack.js.org/api/cli/#commands). It requires node `v14.15.0` or higher. For more information about webpack and its features, refer to the [webpack documentation](https://webpack.js.org/guides/getting-started/). +> This application is integrated with a webpack configuration (`webpack.config.js`) and uses the latest version of the [webpack-cli](https://webpack.js.org/api/cli/#commands). It requires Node.js `v14.15.0` or higher. For more information, refer to the [webpack getting started guide](https://webpack.js.org/guides/getting-started/). -## Set up development environment +## Set up the development environment -Open the command prompt from the required directory, and run the following command to clone the Syncfusion JavaScript (Essential JS 2) quickstart project from [GitHub](https://github.com/SyncfusionExamples/ej2-quickstart-webpack-). +Open a command prompt in the target directory and run the following command to clone the Syncfusion JavaScript (Essential JS 2) quickstart project from [GitHub](https://github.com/SyncfusionExamples/ej2-quickstart-webpack-). {% tabs %} {% highlight bash tabtitle="CMD" %} @@ -27,7 +26,7 @@ git clone https://github.com/SyncfusionExamples/ej2-quickstart-webpack- ej2-quic {% endhighlight %} {% endtabs %} -After cloning the application in the `ej2-quickstart` folder, run the following command line to navigate to the `ej2-quickstart` folder. +After cloning, run the following command to navigate to the `ej2-quickstart` folder. {% tabs %} {% highlight bash tabtitle="CMD" %} @@ -39,9 +38,9 @@ cd ej2-quickstart ## Add Syncfusion JavaScript packages -Syncfusion JavaScript (Essential JS 2) packages are available on the [npmjs.com](https://www.npmjs.com/~syncfusionorg) public registry. You can install all Syncfusion JavaScript (Essential JS 2) controls in a single [@syncfusion/ej2](https://www.npmjs.com/package/@syncfusion/ej2) package or individual packages for each control. +Syncfusion JavaScript (Essential JS 2) packages are available on the [npmjs.com](https://www.npmjs.com/~syncfusionorg) public registry. Install all EJ2 controls with the [@syncfusion/ej2](https://www.npmjs.com/package/@syncfusion/ej2) meta package or install individual control packages. -The quickstart application is preconfigured with the dependent [@syncfusion/ej2](https://www.npmjs.com/package/@syncfusion/ej2) package in the `~/package.json` file. Use the following command to install the dependent npm packages from the command prompt. +The quickstart application is preconfigured with [@syncfusion/ej2](https://www.npmjs.com/package/@syncfusion/ej2) in `~/package.json`. Use the following command to install dependencies: {% tabs %} {% highlight bash tabtitle="NPM" %} @@ -51,9 +50,9 @@ npm install {% endhighlight %} {% endtabs %} -## Import the Syncfusion CSS styles +## Import Syncfusion CSS styles -Add the components CSS in the `~/src/styles/styles.css` file, as shown below: +Add the component CSS in the `~/src/styles/styles.css` file, as shown below: {% tabs %} {% highlight css tabtitle="style.css" %} @@ -71,9 +70,9 @@ Add the components CSS in the `~/src/styles/styles.css` file, as shown below: {% endhighlight %} {% endtabs %} -## Adding PDF Viewer component +## Add the PDF Viewer component -* Add the PDF Viewer component following code in the `app.ts` +* Add the PDF Viewer component in `app.ts`: {% tabs %} {% highlight ts tabtitle="app.ts" %} @@ -83,20 +82,20 @@ PdfViewer.Inject(Toolbar, Magnification, Navigation, Annotation, LinkAnnotation, let pdfviewer: PdfViewer = new PdfViewer(); pdfviewer.documentPath = "https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf"; -pdfviewer.resourceUrl = "https://cdn.syncfusion.com/ej2/26.2.11/dist/ej2-pdfviewer-lib"; +pdfviewer.resourceUrl = "https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib"; pdfviewer.appendTo('#PdfViewer'); {% endhighlight %} {% endtabs %} -### Steps to Load PDF Viewer with Local Resources +### Load PDF Viewer with local resources -To configure the PDF Viewer to use local files for `documentPath` and `resourceUrl` instead of files hosted on a CDN, follow these steps: +To configure the PDF Viewer to use local files for `documentPath` and `resourceUrl` instead of CDN-hosted files, follow these steps: -**Step 1:** Ensure that your application includes the `ej2-pdfviewer-lib` folder. This folder must contain the `pdfium.js`, `pdfium.wasm` files, and the PDF file that you intend to display. Place these files in your project's `dist` directory. +**Step 1:** Ensure the application includes the `ej2-pdfviewer-lib` folder. This folder must contain the `pdfium.js`, `pdfium.wasm` files, and the PDF file to display. Place these files in the project's `dist` directory. -**Step 2:** Assign local file paths to the `documentPath` and `resourceUrl` properties within the PDF Viewer setup. The `documentPath` should refer to your PDF file, while the `resourceUrl` should point to the directory containing the supporting resources. +**Step 2:** Assign local file paths to the `documentPath` and `resourceUrl` properties. The `documentPath` should refer to the PDF file, and the `resourceUrl` should point to the directory containing the supporting resources. -By following these steps, you will configure your PDF Viewer to load the required resources locally. See the code snippet below for reference. +The following example shows how to load resources locally: {% tabs %} {% highlight ts tabtitle="app.ts" %} @@ -109,7 +108,7 @@ pdfviewer.resourceUrl = window.location.origin + "/ej2-pdfviewer-lib"; View the sample in GitHub to [load PDF Viewer with local resources](https://github.com/SyncfusionExamples/typescript-pdf-viewer-examples/tree/master/How%20to/Refer%20resource%20url%20locally) -* Add an HTML div element to act as the PDF Viewer element `index.html` using the following code. +* Add an HTML div element to act as the PDF Viewer element in `index.html`: {% tabs %} {% highlight html tabtitle="index.html" %} @@ -137,7 +136,7 @@ View the sample in GitHub to [load PDF Viewer with local resources](https://gith ## Run the application -The quickstart project is configured to compile and run the application in the browser. Use the following command to run the application. +The quickstart project is configured to compile and run in the browser. Use the following command to start the application: {% tabs %} {% highlight bash tabtitle="NPM" %} @@ -147,7 +146,7 @@ npm start {% endhighlight %} {% endtabs %} -Output will be displayed as follows. +Output: {% tabs %} {% highlight ts tabtitle="index.ts" %} @@ -159,7 +158,7 @@ PdfViewer.Inject( Toolbar, Magnification, Navigation, Annotation, LinkAnnotation let pdfviewer: PdfViewer = new PdfViewer(); pdfviewer.documentPath = "https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf"; -pdfviewer.resourceUrl="https://cdn.syncfusion.com/ej2/26.2.11/dist/ej2-pdfviewer-lib"; +pdfviewer.resourceUrl="https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib"; pdfviewer.appendTo('#PdfViewer'); {% endhighlight %} {% highlight html tabtitle="index.html" %} @@ -170,19 +169,10 @@ pdfviewer.appendTo('#PdfViewer'); EJ2 PDF Viewer - + - - - - - - - - - - + @@ -201,21 +191,21 @@ pdfviewer.appendTo('#PdfViewer'); ## Module injection -To create PDF Viewer with additional features, inject the required modules. The following modules are used to extend PDF Viewer's basic functionality:- +To enable additional features, inject the required modules. The following modules extend the PDF Viewer's functionality: -* `LinkAnnotation`:- Inject this module to use PDF Viewer link annotation. -* `BookmarkView`:- Inject this module to use bookmark view of the PDF Viewer. -* `Magnification`:- Inject this module to magnify the PDF Document. -* `Navigation`:- Inject this module to use page navigation on PDF Document. -* `TextSelection`:- Inject this module to use text selection with the PDF Document. -* `ThumbnailView`:- Inject this module to use thumbnail view of the PDF Viewer -* `Toolbar`:- Inject this module to enable the user interface for toolbar option in PDF Viewer. -* `Print`:- Inject this module to use pdfviewer print feature. -* `Annotation`:- Inject this module to use pdfviewer annotation feature. -* `TextSearch`:- Inject this module to use pdfviewer text search feature. -* `FormFields`:- Inject this module to use pdfviewer form fields feature. -* `FormDesigner`:- Inject this module to use pdfviewer form designer feature. +* `LinkAnnotation`: Enables hyperlink navigation. +* `BookmarkView`: Displays and navigates document bookmarks. +* `Magnification`: Provides zoom in/out operations. +* `Navigation`: Enables page navigation. +* `TextSelection`: Enables text selection. +* `ThumbnailView`: Displays page thumbnails for navigation. +* `Toolbar`: Enables the built-in toolbar UI. +* `Print`: Enables printing. +* `Annotation`: Enables annotation features. +* `TextSearch`: Enables text search. +* `FormFields`: Enables form field support. +* `FormDesigner`: Enables designing and editing of form fields. -These modules should be injected into the PDF Viewer using `PdfViewer.Inject` method. +Inject modules using the `PdfViewer.Inject` method. -> You can refer to our [JavaScript PDF Viewer](https://www.syncfusion.com/pdf-viewer-sdk) feature tour page for its groundbreaking feature representations. You can also explore our [JavaScript PDF Viewer example](https://document.syncfusion.com/demos/pdf-viewer/javascript/#/tailwind3/pdfviewer/default.html) to understand how to explains core features of PDF Viewer. +> Refer to the [JavaScript PDF Viewer feature tour](https://www.syncfusion.com/pdf-viewer-sdk) for an overview of capabilities. Explore the [JavaScript PDF Viewer example](https://document.syncfusion.com/demos/pdf-viewer/javascript/#/tailwind3/pdfviewer/default.html) to see core features in action. diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es6/globalization.md b/Document-Processing/PDF/PDF-Viewer/javascript-es6/globalization.md index 67d3ae712..80a309189 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es6/globalization.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es6/globalization.md @@ -1,19 +1,18 @@ --- layout: post -title: Globalization in Typescript Pdfviewer control | Syncfusion -description: Learn here all about Globalization in Syncfusion Typescript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Globalization in TypeScript PDF Viewer | Syncfusion +description: Learn how to localize the Syncfusion TypeScript PDF Viewer using culture-specific strings, configure the locale property, and load translations with L10n. platform: document-processing -control: Globalization -publishingplatform: Typescript +control: PDF Viewer documentation: ug domainurl: ##DomainURL## --- -# Globalization in Typescript Pdfviewer control +# Globalization in TypeScript PDF Viewer -The text contents provided in the PDF Viewer can be localized using the collection of localized strings for different cultures. By default, the PDF Viewer is localized in “__en-US__”. +The PDF Viewer supports localization using culture-specific string collections. By default, the component uses the "en-US" culture. -The following table shows the default text values used in PDF Viewer in 'en-US' culture: +The following table lists the default text values used by the PDF Viewer in the "en-US" culture: |Keywords|Values| |---|---| @@ -267,7 +266,7 @@ The following table shows the default text values used in PDF Viewer in 'en-US' |Exact Matches|EXACT MATCHES| |Total Matches|TOTAL MATCHES| -The different locale value for the PDF Viewer can be specified using the locale property. +Set the locale for the PDF Viewer using the `locale` property. ```html @@ -324,7 +323,7 @@ pdfviewer.load('https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', null {% endhighlight %} {% endtabs %} -You have to map the text content based on locale like following script in sample level., +Provide localized text for each culture using `ej.base.L10n.load` at the application level, as shown below: ``` + + + + + +
    + + + +``` + +You can enable/disable page navigation option in PDF Viewer using the following code snippet., + +{% tabs %} +{% highlight ts tabtitle="Standalone" %} + + +import { PdfViewer, Toolbar, Magnification, Navigation, LinkAnnotation,ThumbnailView,BookmarkView, TextSelection} from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject(Toolbar,Magnification,Navigation, LinkAnnotation,ThumbnailView,BookmarkView, TextSelection); + +let pdfviewer: PdfViewer = new PdfViewer({enableNavigation: true, documentPath:'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf'}); +pdfviewer.appendTo('#PdfViewer'); + +{% endhighlight %} +{% highlight ts tabtitle="Server-Backed" %} + + +import { PdfViewer, Toolbar, Magnification, Navigation, LinkAnnotation,ThumbnailView,BookmarkView, TextSelection} from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject(Toolbar,Magnification,Navigation, LinkAnnotation,ThumbnailView,BookmarkView, TextSelection); + +let pdfviewer: PdfViewer = new PdfViewer({enableNavigation: true, documentPath:'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf'}); +pdfviewer.serviceUrl = 'https://document.syncfusion.com/web-services/pdf-viewer/api/pdfviewer/'; +pdfviewer.appendTo('#PdfViewer'); + +{% endhighlight %} +{% endtabs %} + +![Alt text](../images/navigation.png) + +Also, you can programmatically perform page navigation options as follows. + +```html + + + + + Essential JS 2 + + + + + + + + + + + + + + + + + + + + + + +
    + + + +``` + +{% tabs %} +{% highlight ts tabtitle="Standalone" %} + +import {PdfViewer, Toolbar, Magnification, Navigation, LinkAnnotation, BookmarkView, ThumbnailView, Print TextSelection, TextSearch, Annotation, FormFields } from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject(Toolbar,Magnification,Navigation, LinkAnnotation,ThumbnailView,BookmarkView, TextSelection, TextSearch, Annotation, FormFields ); + +let viewer: PdfViewer = new PdfViewer(); +viewer.appendTo('#pdfViewer'); +viewer.load('https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', null); + +// Go To First Page +document.getElementById('goToFirstPage').addEventListener('click', () => { + viewer.navigation.goToFirstPage(); +}); +// Go To Last Page +document.getElementById('goToLastPage').addEventListener('click', () => { + viewer.navigation.goToLastPage(); +}); +// Go To Next Page +document.getElementById('goToNextPage').addEventListener('click', () => { + viewer.navigation.goToNextPage(); +}); +// Go To Page +document.getElementById('goToPage').addEventListener('click', () => { + viewer.navigation.goToPage(4); +}); +// Go To Previous Page +document.getElementById('goToPreviousPage').addEventListener('click', () => { + viewer.navigation.goToPreviousPage(); +}); + +{% endhighlight %} +{% highlight ts tabtitle="Server-Backed" %} + +import {PdfViewer, Toolbar, Magnification, Navigation, LinkAnnotation, BookmarkView, ThumbnailView, Print TextSelection, TextSearch, Annotation, FormFields } from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject(Toolbar,Magnification,Navigation, LinkAnnotation,ThumbnailView,BookmarkView, TextSelection, TextSearch, Annotation, FormFields ); + +let viewer: PdfViewer = new PdfViewer(); +viewer.serviceUrl = + 'https://document.syncfusion.com/web-services/pdf-viewer/api/pdfviewer/'; +viewer.appendTo('#pdfViewer'); +viewer.load('https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', null); + +// Go To First Page +document.getElementById('goToFirstPage').addEventListener('click', () => { + viewer.navigation.goToFirstPage(); +}); +// Go To Last Page +document.getElementById('goToLastPage').addEventListener('click', () => { + viewer.navigation.goToLastPage(); +}); +// Go To Next Page +document.getElementById('goToNextPage').addEventListener('click', () => { + viewer.navigation.goToNextPage(); +}); +// Go To Page +document.getElementById('goToPage').addEventListener('click', () => { + viewer.navigation.goToPage(4); +}); +// Go To Previous Page +document.getElementById('goToPreviousPage').addEventListener('click', () => { + viewer.navigation.goToPreviousPage(); +}); + +{% endhighlight %} +{% endtabs %} + +Find the [here](https://stackblitz.com/edit/5dqbkd?file=index.ts) to perform the page navigation options programmatically. + +## See also + +* [Toolbar items](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/toolbar) +* [Feature Modules](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/feature-module) \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es6/interactive-pdf-navigation/page-thumbnail-navigation.md b/Document-Processing/PDF/PDF-Viewer/javascript-es6/interactive-pdf-navigation/page-thumbnail-navigation.md new file mode 100644 index 000000000..7da72932f --- /dev/null +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es6/interactive-pdf-navigation/page-thumbnail-navigation.md @@ -0,0 +1,47 @@ +--- +layout: post +title: Thumbnail Navigation in TypeScript PDF Viewer | Syncfusion +description: Discover how to navigate PDF pages using thumbnails in the Syncfusion TypeScript PDF Viewer control for a visual and intuitive experience. +platform: document-processing +control: PDF Viewer +documentation: ug +domainurl: ##DomainURL## +--- + +# Page Thumbnail navigation in TypeScript PDF Viewer control + +Thumbnails is the miniature representation of actual pages in PDF files. This feature displays thumbnails of the pages and allows navigation. +You can enable/disable thumbnail navigation by using the following code snippet., + +{% tabs %} +{% highlight ts tabtitle="Standalone" %} + +import { PdfViewer, Toolbar, Magnification, Navigation, Annotation, LinkAnnotation,ThumbnailView,BookmarkView, TextSelection} from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject(Toolbar,Magnification,Navigation, Annotation, LinkAnnotation,ThumbnailView,BookmarkView, TextSelection); + +let pdfviewer: PdfViewer = new PdfViewer({enableThumbnail: true, documentPath:'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf'}); +pdfviewer.appendTo('#PdfViewer'); + +{% endhighlight %} +{% highlight ts tabtitle="Server-Backed" %} + + +import { PdfViewer, Toolbar, Magnification, Navigation, Annotation, LinkAnnotation,ThumbnailView,BookmarkView, TextSelection} from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject(Toolbar,Magnification,Navigation, Annotation, LinkAnnotation,ThumbnailView,BookmarkView, TextSelection); + +let pdfviewer: PdfViewer = new PdfViewer({enableThumbnail: true, documentPath:'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf'}); +pdfviewer.serviceUrl = 'https://document.syncfusion.com/web-services/pdf-viewer/api/pdfviewer/'; +pdfviewer.appendTo('#PdfViewer'); + +{% endhighlight %} +{% endtabs %} + +![Alt text](../images/thumbnail.png) + + +## See also + +* [Toolbar items](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/toolbar) +* [Feature Modules](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/feature-module) \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es6/magnification.md b/Document-Processing/PDF/PDF-Viewer/javascript-es6/magnification.md index 035663ae7..7f736f18b 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es6/magnification.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es6/magnification.md @@ -1,19 +1,18 @@ --- layout: post -title: Magnification in Typescript Pdfviewer control | Syncfusion -description: Learn here all about Magnification in Syncfusion Typescript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Magnification in TypeScript PDF Viewer | Syncfusion +description: Learn how to enable and use magnification in the Syncfusion TypeScript PDF Viewer, including Zoom In, Zoom Out, Fit to Page, and Fit to Width options. platform: document-processing -control: Magnification -publishingplatform: Typescript +control: PDF Viewer documentation: ug domainurl: ##DomainURL## --- -# Magnification in Typescript Pdfviewer control +# Magnification in TypeScript PDF Viewer -The magnification tools of the PDF Viewer contains ZoomIn, ZoomOut, Zoom, FitPage, and FitWidth tools in the default toolbar. The PDF Viewer also has an option to show or hide the magnification tools in the default toolbar. +The PDF Viewer includes magnification tools in the default toolbar: Zoom In, Zoom Out, Zoom (to a specific value), Fit to Page, and Fit to Width. The toolbar can be configured to show or hide these tools. -The following code snippet describes how to enable the magnification in PDF Viewer. +Use the following configuration to enable magnification in the PDF Viewer: ```html @@ -77,11 +76,11 @@ The following magnification options are available in the default toolbar of PDF * [**FitPage**](https://ej2.syncfusion.com/documentation/api/pdfviewer/magnification/#fittopage):- Fits the page width with in the available view port size. * [**FitWidth**](https://ej2.syncfusion.com/documentation/api/pdfviewer/magnification/#fittowidth):- Fits the view port width based on the page content size. -![Alt text ](./images/zoom.png) +![Magnification tools in PDF Viewer](./images/zoom.png) ->PDF Viewer can support the zoom value ranges from 10 to 400. +> The PDF Viewer supports zoom values from 10% to 400%. ## See also * [Toolbar items](./toolbar) -* [Feature Modules](./feature-module) +* [Feature modules](./feature-module) diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es6/navigation.md b/Document-Processing/PDF/PDF-Viewer/javascript-es6/navigation.md index 67c84344b..f7d888c87 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es6/navigation.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es6/navigation.md @@ -1,21 +1,20 @@ --- layout: post -title: Navigation in Typescript Pdfviewer control | Syncfusion -description: Learn here all about Navigation in Syncfusion Typescript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Navigation in TypeScript PDF Viewer | Syncfusion +description: Learn how to navigate PDF documents using the Syncfusion TypeScript PDF Viewer, including toolbar controls, programmatic navigation, bookmarks, thumbnails, hyperlinks, and table of contents. platform: document-processing -control: Navigation -publishingplatform: Typescript +control: PDF Viewer documentation: ug domainurl: ##DomainURL## --- -# Navigation in Typescript Pdfviewer control +# Navigation in TypeScript PDF Viewer -The ASP.NET Core PDF Viewer supports different internal and external navigations. +The TypeScript PDF Viewer supports multiple navigation options, including toolbar controls, programmatic commands, bookmarks, thumbnails, hyperlinks, and table of contents. ## Toolbar page navigation option -The default toolbar of PDF Viewer contains the following navigation options +The default toolbar includes the following navigation options: * [**Go to page**](https://ej2.syncfusion.com/documentation/api/pdfviewer/navigation/#gotopage):- Navigates to the specific page of a PDF document. * [**Show next page**](https://ej2.syncfusion.com/documentation/api/pdfviewer/navigation/#gotonextpage):- Navigates to the next page of PDF a document. @@ -52,7 +51,7 @@ The default toolbar of PDF Viewer contains the following navigation options ``` -You can enable/disable page navigation option in PDF Viewer using the following code snippet., +Enable or disable page navigation using the following configuration: {% tabs %} {% highlight ts tabtitle="Standalone" %} @@ -80,9 +79,9 @@ pdfviewer.appendTo('#PdfViewer'); {% endhighlight %} {% endtabs %} -![Alt text](./images/navigation.png) +![PDF Viewer toolbar navigation controls](./images/navigation.png) -Also, you can programmatically perform page navigation options as follows. +You can also perform page navigation programmatically: ```html @@ -187,12 +186,11 @@ document.getElementById('goToPreviousPage').addEventListener('click', () => { {% endhighlight %} {% endtabs %} -Find the [here](https://stackblitz.com/edit/5dqbkd?file=index.ts) to perform the page navigation options programmatically. +View the [programmatic navigation sample](https://stackblitz.com/edit/5dqbkd?file=index.ts) for a working example. ## Bookmark navigation -The Bookmarks saved in PDF files are loaded and made ready for easy navigation. -You can enable/disable bookmark navigation by using the following code snippet., +Bookmarks saved in PDF files provide quick navigation. Enable or disable bookmark navigation using the following configuration: {% tabs %} {% highlight ts tabtitle="Standalone" %} @@ -219,11 +217,11 @@ pdfviewer.appendTo('#PdfViewer'); {% endhighlight %} {% endtabs %} -![Alt text](./images/bookmark.png) +![PDF Viewer bookmark panel](./images/bookmark.png) -To perform bookmark navigation, you can use the **goToBookmark** method. It's important to note that the **goToBookmark** method will throw an error if the specified bookmark does not exist in the PDF document. +Use the **goToBookmark** method to navigate to a specific bookmark. The method throws an error if the bookmark does not exist in the document. -Here is an example of how to use the **goToBookmark** method: +Example: ``` @@ -239,9 +237,9 @@ x - Specifies the pageIndex for Navigate. y - Specifies the Y coordinates value of the Page. -Also, you can use the **getBookmarks** method to retrieve a list of all the bookmarks in a PDF document. This method returns a List of Bookmark objects, which contain information about each bookmark. +Use the **getBookmarks** method to retrieve all bookmarks. The method returns a list of bookmark objects that include metadata for each entry. -Here is an example of how to use the getBookmarks method: +Example: ``` @@ -256,8 +254,7 @@ document.getElementById('getBookmarks').addEventListener('click', () => { ## Thumbnail navigation -Thumbnails is the miniature representation of actual pages in PDF files. This feature displays thumbnails of the pages and allows navigation. -You can enable/disable thumbnail navigation by using the following code snippet., +Thumbnails provide miniature representations of PDF pages for quick navigation. Enable or disable thumbnail navigation using the following configuration: {% tabs %} {% highlight ts tabtitle="Standalone" %} @@ -284,19 +281,19 @@ pdfviewer.appendTo('#PdfViewer'); {% endhighlight %} {% endtabs %} -![Alt text](./images/thumbnail.png) +![PDF Viewer thumbnail pane](./images/thumbnail.png) ## Hyperlink navigation -Hyperlink navigation features enables navigation to the URLs (website links) in a PDF file. +Hyperlink navigation enables users to open URLs embedded in the PDF. -![Alt text](./images/link.png) +![PDF Viewer hyperlink navigation](./images/link.png) ## Table of content navigation -Table of contents navigation allows users to navigate to different parts of a PDF file that are listed in the table of contents section. +Table of contents navigation allows users to jump to sections defined in the document outline. -You can enable/disable link navigation by using the following code snippet., +Enable or disable table of contents navigation using the following configuration: {% tabs %} {% highlight ts tabtitle="Standalone" %} @@ -323,7 +320,7 @@ pdfviewer.appendTo('#PdfViewer'); {% endhighlight %} {% endtabs %} -You can change the open state of the hyperlink in the PDF Viewer by using the following code snippet, +Change the hyperlink open state using the following configuration: {% tabs %} {% highlight ts tabtitle="Standalone" %} @@ -351,9 +348,9 @@ pdfviewer.appendTo('#PdfViewer'); {% endhighlight %} {% endtabs %} -![Alt text](./images/toc.png) +![PDF Viewer table of contents panel](./images/toc.png) ## See also -* [Toolbar items](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/toolbar/) -* [Feature Modules](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/feature-module/) \ No newline at end of file +* [Toolbar items](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/toolbar) +* [Feature modules](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/feature-module) \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es6/open-pdf-file/from-amazon-s3.md b/Document-Processing/PDF/PDF-Viewer/javascript-es6/open-pdf-file/from-amazon-s3.md index 4f1ddff04..9fe67cadd 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es6/open-pdf-file/from-amazon-s3.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es6/open-pdf-file/from-amazon-s3.md @@ -1,25 +1,23 @@ --- layout: post -title: Open PDF files from AWS S3 in Typescript Pdfviewer control | Syncfusion -description: Learn here all about Open PDF files from AWS S3 in Syncfusion Typescript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Open PDF from AWS S3 in TypeScript PDF Viewer | Syncfusion +description: Learn how to load PDFs from AWS S3 in the Syncfusion TypeScript PDF Viewer component using standalone and server-backed approaches. platform: document-processing -control: Open PDF files from AWS S3 -publishingplatform: Typescript +control: PDF Viewer documentation: ug -domainurl: ##DomainURL## --- -# Open PDF file from AWS S3 +# Open PDF from AWS S3 -PDF Viewer allows to load PDF file from AWS S3 using either the Standalone or Server-backed PDF Viewer. Below are the steps and a sample to demonstrate how to open a PDF from AWS S3. +The TypeScript PDF Viewer component supports loading PDF files from AWS S3 using either the standalone or the server-backed PDF Viewer. The following steps demonstrate both approaches. -## Using Standalone PDF Viewer +## Using the standalone PDF Viewer -To load a PDF file from AWS S3 in a PDF Viewer, you can follow the steps below. +Follow these steps to load a PDF from AWS S3 in the standalone PDF Viewer. **Step 1:** Create a PDF Viewer sample in TypeScript -Follow the instructions provided in this [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/getting-started) to create a simple PDF Viewer sample in typescript. This will set up the basic structure of your PDF Viewer application. +Follow the instructions in the getting started guide (TypeScript) to create a basic PDF Viewer sample: https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/getting-started **Step 2:** Modify the `src/app/app.ts` File in the TypeScript Project @@ -29,7 +27,7 @@ Follow the instructions provided in this [link](https://help.syncfusion.com/docu import * as AWS from 'aws-sdk'; ``` -2. Configures AWS SDK with the region, access key, and secret access key. This configuration allows the application to interact with AWS services like S3. +2. Configure the AWS SDK with the region, access key, and secret access key so the application can interact with S3. N> Replace **Your Region** with the actual Region of your AWS S3 account and **Your Access Key** with the actual Access Key of your AWS S3 account and **Your Security Access Key** with the actual Security Access Key of your AWS S3 account. @@ -41,7 +39,7 @@ AWS.config.update({ }); ``` -3. Sets the parameters for fetching the PDF document from S3, including the bucket name and file key. Then Uses the getObject method of the S3 instance to retrieve the document. Converts the document data to a Base64 string and loads it into the Syncfusion PDF Viewer then load Base64 string generated into the viewer.load method. +3. Set parameters for fetching the PDF (bucket name and file key). Use S3.getObject to retrieve the document, convert it to a Base64 string, and pass it to viewer.load. N> Replace **Your Bucket Name** with the actual Bucket name of your AWS S3 account and **Your Key** with the actual File Key of your AWS S3 account. @@ -75,13 +73,13 @@ N> The **npm install aws-sdk** package must be installed in your application to [View sample in GitHub](https://github.com/SyncfusionExamples/open-save-pdf-documents-in-aws-s3/tree/master/Open%20and%20Save%20PDF%20in%20AWS%20S3%20using%20Standalone). -## Using Server-Backed PDF Viewer +## Using the server-backed PDF Viewer -To load a PDF file from AWS S3 in a PDF Viewer, you can follow the steps below +Follow these steps to load a PDF from AWS S3 using the server-backed PDF Viewer. -**Step 1:** Create a Simple PDF Viewer Sample in Typescript +**Step 1:** Create a PDF Viewer sample in TypeScript -Start by following the steps provided in this [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/getting-started) to create a simple PDF viewer sample in Typescript. This will give you a basic setup of the PDF viewer component. +Create a basic PDF Viewer sample by following the getting started guide: https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/getting-started **Step 2:** Modify the `PdfViewerController.cs` File in the Web Service Project @@ -123,7 +121,7 @@ public PdfViewerController(IWebHostEnvironment hostingEnvironment, IMemoryCache public async Task Load([FromBody] Dictionary jsonObject) { - // Initialize the PDF viewer object with memory cache object + // Initialize the PDF Viewer object with memory cache object PdfRenderer pdfviewer = new PdfRenderer(_cache); MemoryStream stream = new MemoryStream(); object jsonResult = new object(); @@ -176,11 +174,11 @@ public async Task Load([FromBody] Dictionary json } ``` -N> Replace **Your Access Key from AWS S3**, **Your Secret Key from AWS S3**, and **Your Bucket name from AWS S3** with your actual AWS access key, secret key and bucket name +N> Replace the placeholders with your actual AWS credentials and bucket name: Access Key, Secret Key, and Bucket Name. -**Step 3:** Set the PDF Viewer Properties in Typescript PDF viewer component +**Step 3:** Configure the PDF Viewer component -Modify the [serviceUrl](https://ej2.syncfusion.com/documentation/api/pdfviewer/#serviceurl) property of the PDF viewer component with the accurate URL of your web service project, replacing `https://localhost:44396/pdfviewer` with the actual URL of your server. Set the `documentPath` property of the PDF viewer component to the desired name of the PDF file you wish to load from AWS S3. Ensure that you correctly pass the document name from the files available in your AWS S3 bucket to the documentPath property. +Set the [serviceUrl](https://ej2.syncfusion.com/documentation/api/pdfviewer/#serviceurl) to your web service endpoint (replace the localhost URL with your server URL). Set documentPath to the PDF file name to load from AWS S3. Ensure the document name matches an object in your bucket. ```typescript diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es6/open-pdf-file/from-azure-active-directory.md b/Document-Processing/PDF/PDF-Viewer/javascript-es6/open-pdf-file/from-azure-active-directory.md index c124e6235..64986f739 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es6/open-pdf-file/from-azure-active-directory.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es6/open-pdf-file/from-azure-active-directory.md @@ -1,25 +1,23 @@ --- layout: post -title: Open PDF From AAD in Typescript Pdfviewer control | Syncfusion -description: Learn how to Open PDF From AAD in Syncfusion Typescript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Open PDF from Azure Active Directory in TypeScript PDF Viewer | Syncfusion +description: Learn how to load and save PDFs using Azure Active Directory (AAD) with the Syncfusion TypeScript PDF Viewer component. platform: document-processing control: PDF Viewer -publishingplatform: Typescript documentation: ug -domainurl: ##DomainURL## --- -# Open PDF From Azure Active Directory in Viewer +# Open PDF from Azure Active Directory -### **Overview** +### Overview -The Syncfusion PDF Viewer allows you to load and save PDF files directly from Azure Active Directory (AAD). Below are the steps to securely load and store PDF documents from and to AAD using the PDF Viewer. +The TypeScript PDF Viewer component supports loading and saving PDF files with Azure Active Directory (AAD). The following steps explain how to securely load and store PDFs using AAD. -### **Steps to Open the PDF File from Azure Active Directory** +### Steps to open a PDF from Azure Active Directory --- -### **Step 1: Register an Application in Azure Active Directory (AAD)** +### Step 1: Register an application in Azure Active Directory (AAD) 1. **Go to the Azure Portal**: - Navigate to [Azure Portal](https://portal.azure.com). @@ -41,7 +39,7 @@ The Syncfusion PDF Viewer allows you to load and save PDF files directly from Az --- -### **Step 2: Create the Azure Storage Account** +### Step 2: Create the Azure Storage account 1. **Create a Storage Account**: - In the Azure portal, use the search bar to search for **Storage accounts**. @@ -51,7 +49,7 @@ The Syncfusion PDF Viewer allows you to load and save PDF files directly from Az --- -### **Step 3: Assign Role to the Application** +### Step 3: Assign a role to the application 1. **Go to your Storage Account**: - Navigate to **Access control (IAM)** > **Add role assignment** in your Azure Storage Account. @@ -66,7 +64,7 @@ The Syncfusion PDF Viewer allows you to load and save PDF files directly from Az ![add-role](../images/add-role.png) --- -### **Step 4: Upload the PDF Document to the Azure Storage Account** +### Step 4: Upload the PDF to Azure Storage 1. **Navigate to Data Storage**: - In the Azure portal, go to **Data storage** > **Containers**. @@ -77,7 +75,7 @@ The Syncfusion PDF Viewer allows you to load and save PDF files directly from Az ![upload-pdf](../images/upload-pdf.png) --- -### **Step 5: Server-Side Configuration** +### Step 5: Server-side configuration 1. **Configure Server-Side Code**: - Open the server-side application (e.g., ASP.NET Core) and configure the following details in the `PdfViewerController` file: @@ -92,10 +90,10 @@ The Syncfusion PDF Viewer allows you to load and save PDF files directly from Az --- -### **Step 6: Client-Side Configuration** +### Step 6: Client-side configuration -1. **Run the TS Sample**: - - Start the TS sample that includes the Syncfusion PDF Viewer. +1. **Run the TypeScript Sample**: + - Start the TypeScript sample that includes the Syncfusion PDF Viewer. 2. **Load PDF from AAD**: - When the user clicks the **Load from AAD** button, the JS client will make an HTTP request to the server-side API to fetch the PDF from Azure Blob Storage. @@ -106,7 +104,7 @@ The Syncfusion PDF Viewer allows you to load and save PDF files directly from Az --- -### **Step 7: Save the PDF Document to Azure** +### Step 7: Save the PDF to Azure 1. **Save PDF to AAD**: - The user can click the **Save to AAD** button to upload any modifications to the PDF back to Azure Blob Storage. @@ -114,7 +112,7 @@ The Syncfusion PDF Viewer allows you to load and save PDF files directly from Az --- -### **Server-Side Code Snippets** +### Server-side code ```cs string tenantId = "Provide the tenant id here"; string clientId = "Provide the clientid here"; @@ -170,7 +168,7 @@ public async Task SaveToAAD([FromBody] Dictionary -### **Client-side Code Snippets** +### Client-side code ```ts import { PdfViewer, Toolbar, TextSelection, TextSearch, Print, Navigation, Magnification, Annotation, FormDesigner, FormFields, CustomToolbarItemModel } from '@syncfusion/ej2-pdfviewer'; diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es6/open-pdf-file/from-azure-blob-storage.md b/Document-Processing/PDF/PDF-Viewer/javascript-es6/open-pdf-file/from-azure-blob-storage.md index cf0f2a2b8..7460d1327 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es6/open-pdf-file/from-azure-blob-storage.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es6/open-pdf-file/from-azure-blob-storage.md @@ -1,27 +1,25 @@ --- layout: post -title: Open PDF from Azure Blob Storage in Typescript Pdfviewer | Syncfusion -description: Learn here all about Open PDF files from Azure Blob Storage in Syncfusion Typescript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Open PDF from Azure Blob Storage in TypeScript PDF Viewer | Syncfusion +description: Learn how to load PDFs from Azure Blob Storage in the Syncfusion TypeScript PDF Viewer component using standalone and server-backed approaches. platform: document-processing -control: Open PDF files from Azure Blob Storage -publishingplatform: Typescript +control: PDF Viewer documentation: ug -domainurl: ##DomainURL## --- -# Open PDF file from Azure Blob Storage +# Open PDF from Azure Blob Storage -PDF Viewer allows to load PDF file from Azure Blob Storage using either the Standalone or Server-backed PDF Viewer. Below are the steps and a sample to demonstrate how to open a PDF from Azure Blob Storage. +The TypeScript PDF Viewer component supports loading PDF files from Azure Blob Storage using either the standalone or the server-backed PDF Viewer. The following steps demonstrate both approaches. -## Using Standalone PDF Viewer +## Using the standalone PDF Viewer -To load a PDF file from Azure Blob Storage in a PDF Viewer, you can follow the steps below +Follow these steps to load a PDF from Azure Blob Storage in the standalone PDF Viewer. -**Step 1:** Create a Simple PDF Viewer Sample in Typescript +**Step 1:** Create a PDF Viewer sample in TypeScript -Start by following the steps provided in this [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/getting-started) to create a simple PDF viewer sample in Typescript. This will give you a basic setup of the PDF viewer component. +Start by following the steps provided in this [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/getting-started) to create a simple PDF Viewer sample in TypeScript. This will give you a basic setup of the PDF Viewer component. -**Step 2:** Modify the `src/app/app.ts` File in the Angular Project +**Step 2:** Modify the src/app/app.ts file in the TypeScript project 1. Add the following private properties to the `app.ts`, and assign the values from the configuration to the corresponding properties @@ -33,7 +31,7 @@ private containerName: string = "*Your container name in Azure*"; private blobName: string = "*Your Blob name in Azure*"; ``` -2. Constructs the URL to the PDF in Azure Blob Storage. Calls fetchAndConvertToBase64 to fetch the PDF and convert it to a base64 string. Then Loads the base64 string into the PDF Viewer. +2. Construct the URL to the PDF in Azure Blob Storage. Call fetchAndConvertToBase64 to fetch the PDF and convert it to a base64 string. Then load the base64 string into the PDF Viewer. ```typescript pdfviewer.created = function () { @@ -50,7 +48,7 @@ pdfviewer.created = function () { } ``` -3. Then it retrieves the PDF file from the given URL and converts the fetched Blob to a base64 string using blobToBase64. +3. Retrieve the PDF from the URL and convert the fetched Blob to a base64 string using blobToBase64. ```typescript function fetchAndConvertToBase64(url : any) { @@ -72,7 +70,7 @@ function fetchAndConvertToBase64(url : any) { } ``` -4. Uses FileReader to convert a Blob to a base64 string. Resolves the promise with the base64 string or rejects it in case of an error. +4. Use FileReader to convert a Blob to a base64 string. Resolve the promise with the base64 string or reject it in case of an error. ```typescript function blobToBase64(blob : any) { @@ -92,13 +90,13 @@ function blobToBase64(blob : any) { [View sample in GitHub](https://github.com/SyncfusionExamples/open-save-pdf-documents-in-azure-blob-storage/tree/master/Open%20and%20Save%20PDF%20in%20Azure%20Blob%20Storage%20using%20Standalone). -## Using Server-Backed PDF Viewer +## Using the server-backed PDF Viewer -To load a PDF file from Azure Blob Storage in a PDF Viewer, you can follow the steps below +Follow these steps to load a PDF from Azure Blob Storage using the server-backed PDF Viewer. -**Step 1:** Create a Simple PDF Viewer Sample in Typescript +**Step 1:** Create a PDF Viewer sample in TypeScript -Start by following the steps provided in this [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/getting-started) to create a simple PDF viewer sample in Typescript. This will give you a basic setup of the PDF viewer component. +Start by following the steps provided in this [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/getting-started) to create a simple PDF Viewer sample in TypeScript. This will give you a basic setup of the PDF Viewer component. **Step 2:** Modify the `PdfViewerController.cs` File in the Web Service Project @@ -129,7 +127,7 @@ public PdfViewerController(IConfiguration configuration, ILogger jsonObject) } ``` -N> Replace **Your Connection string from Azure** with the actual connection string for your Azure Blob Storage account and **Your container name in Azure** with the actual container name +N> Replace the placeholders with your actual values: Azure storage connection string and container name. -**Step 3:** Set the PDF Viewer Properties in Typescript PDF viewer component +**Step 3:** Configure the PDF Viewer component -Modify the [serviceUrl](https://ej2.syncfusion.com/documentation/api/pdfviewer/#serviceurl) property of the PDF viewer component with the accurate URL of your web service project, replacing `https://localhost:44396/pdfviewer` with the actual URL of your server. Set the `documentPath` property of the PDF viewer component to the desired name of the PDF file you wish to load from Azure Blob Storage. Ensure that you correctly pass the document name from the files available in your azure contanier to the documentPath property. +Set the [serviceUrl](https://ej2.syncfusion.com/documentation/api/pdfviewer/#serviceurl) to your web service endpoint (replace the localhost URL with your server URL). Set documentPath to the PDF file name to load from Azure Blob Storage. Ensure the document name exists in your Azure container. ```typescript diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es6/open-pdf-file/from-box-cloud-file-storage.md b/Document-Processing/PDF/PDF-Viewer/javascript-es6/open-pdf-file/from-box-cloud-file-storage.md index a5b127ee3..bef4c7c12 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es6/open-pdf-file/from-box-cloud-file-storage.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es6/open-pdf-file/from-box-cloud-file-storage.md @@ -1,27 +1,25 @@ --- layout: post -title: Open PDF files from Box cloud file storage in Typescript Pdfviewer control | Syncfusion -description: Learn here all about Open PDF files from Box cloud file storage in Syncfusion Typescript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Open PDF from Box cloud storage in TypeScript PDF Viewer | Syncfusion +description: Learn how to load PDFs from Box cloud storage in the Syncfusion TypeScript PDF Viewer component using a server-backed approach. platform: document-processing -control: Open PDF files from Box cloud file storage -publishingplatform: Typescript +control: PDF Viewer documentation: ug -domainurl: ##DomainURL## --- -# Open PDF file from Box cloud file storage +# Open PDF from Box cloud storage -To load a PDF file from Box cloud file storage in a PDF Viewer, you can follow the steps below +Follow these steps to load a PDF from Box cloud storage using the server-backed PDF Viewer. -**Step 1** Set up a Box developer account and create a Box application +**Step 1:** Set up a Box developer account and create a Box application -To access Box storage programmatically, you'll need a developer account with Box. Go to the [Box Developer Console](https://developer.box.com/), sign in or create a new account, and then create a new Box application. This application will provide you with the necessary credentials Client ID and Client Secret to authenticate and access Box APIs. Before accessing files, you need to authenticate your application to access your Box account. Box API supports `OAuth 2.0 authentication` for this purpose. +Create a developer account and Box application in the [Box Developer Console](https://developer.box.com/). Note the Client ID and Client Secret. Use OAuth 2.0 to authenticate the application. -**Step 2:** Create a Simple PDF Viewer Sample in Typescript +**Step 2:** Create a PDF Viewer sample in TypeScript -Start by following the steps provided in this [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/getting-started) to create a simple PDF viewer sample in Typescript. This will give you a basic setup of the PDF viewer component. +Start by following the steps provided in this [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/getting-started) to create a simple PDF Viewer sample in TypeScript. This will give you a basic setup of the PDF Viewer component. -**Step 3:** Modify the `PdfViewerController.cs` File in the Web Service Project +**Step 3:** Modify the PdfViewerController.cs file in the web service project 1. Create a web service project in .NET Core 3.0 or above. You can refer to this [link](https://www.syncfusion.com/kb/11063/how-to-create-pdf-viewer-web-service-in-net-core-3-0-and-above) for instructions on how to create a web service project. @@ -36,7 +34,7 @@ using Box.V2.Config; using Box.V2.Models; ``` -4. Add the following private fields and constructor parameters to the `PdfViewerController` class, In the constructor, assign the values from the configuration to the corresponding fields +4. Add the following private fields and constructor parameters to PdfViewerController. In the constructor, assign values from configuration to the corresponding fields. ```csharp private IConfiguration _configuration; @@ -57,7 +55,7 @@ public PdfViewerController(IWebHostEnvironment hostingEnvironment, IMemoryCache } ``` -5. Modify the [Load()](https://ej2.syncfusion.com/documentation/api/pdfviewer/#load) method to load the PDF files from Box cloud file storage. +5. Modify the [Load()](https://ej2.syncfusion.com/documentation/api/pdfviewer/#load) method to load PDF files from Box cloud storage. ```csharp [HttpPost("Load")] @@ -68,7 +66,7 @@ public PdfViewerController(IWebHostEnvironment hostingEnvironment, IMemoryCache public async Task Load([FromBody] Dictionary jsonObject) { - //Initialize the PDF viewer object with memory cache object + //Initialize the PDF Viewer object with memory cache object PdfRenderer pdfviewer = new PdfRenderer(_cache); MemoryStream stream = new MemoryStream(); @@ -128,11 +126,11 @@ public async Task Load([FromBody] Dictionary json } ``` -N> replace **Your_Box_Storage_Access_Token** with your actual box access token, and **Your_Folder_ID** with the ID of the folder in your box storage where you want to perform specific operations. Remember to use your valid box API credentials, as **Your_Box_Storage_ClientID** and **Your_Box_Storage_ClientSecret"** are placeholders for your application's API key and secret. +N> Replace the placeholders with your actual Box values: Access Token, Folder ID, Client ID, and Client Secret. -**Step 4:** Set the PDF Viewer Properties in Typescript PDF viewer component +**Step 4:** Configure the PDF Viewer component -Modify the `serviceUrl` property of the PDF viewer component with the accurate URL of your web service project, replacing `https://localhost:44396/pdfviewer` with the actual URL of your server. Set the `documentPath` property of the PDF viewer component to the desired name of the PDF file you wish to load from Box cloud file storage. Ensure that you correctly pass the document name from the files available in your box folder to the documentPath property. +Set the [serviceUrl](https://ej2.syncfusion.com/documentation/api/pdfviewer/#serviceurl) to your web service endpoint (replace the localhost URL with your server URL). Set documentPath to the PDF file name to load from Box cloud storage. Ensure the document name exists in your Box folder. ```typescript @@ -152,6 +150,6 @@ viewer.load('PDF_Succinctly.pdf', null); N> The **Box.V2.Core** NuGet package must be installed in your application to use the previous code example. -N> Replace `PDF_Succinctly.pdf` with the actual document name that you want to load from Box cloud file storage. Make sure to pass the document name from the box folder to the `documentPath` property of the PDF viewer component +N> Replace `PDF_Succinctly.pdf` with the actual document name that you want to load from Box cloud file storage. Make sure to pass the document name from the box folder to the `documentPath` property of the PDF Viewer component [View sample in GitHub](https://github.com/SyncfusionExamples/open-save-pdf-documents-in-box-cloud-file-storage) \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es6/open-pdf-file/from-dropbox-cloud-file-storage.md b/Document-Processing/PDF/PDF-Viewer/javascript-es6/open-pdf-file/from-dropbox-cloud-file-storage.md index eaa2b7f20..cca2ad471 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es6/open-pdf-file/from-dropbox-cloud-file-storage.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es6/open-pdf-file/from-dropbox-cloud-file-storage.md @@ -1,17 +1,15 @@ --- layout: post -title: Open PDF from Dropbox cloud storage in Typescript Pdfviewer | Syncfusion -description: Learn here all about Open PDF files from Dropbox cloud file storage in Syncfusion Typescript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Open PDF from Dropbox cloud storage in TypeScript PDF Viewer | Syncfusion +description: Learn how to load PDFs from Dropbox cloud storage in the Syncfusion TypeScript PDF Viewer component using standalone and server-backed approaches. platform: document-processing -control: Open PDF files from Dropbox cloud file storage -publishingplatform: Typescript +control: PDF Viewer documentation: ug -domainurl: ##DomainURL## --- -# Open PDF file from Dropbox cloud file storage +# Open PDF from Dropbox cloud storage -PDF Viewer allows to load PDF file from Drop Box using either the Standalone or Server-backed PDF Viewer. Below are the steps and a sample to demonstrate how to open a PDF from Drop Box. +The TypeScript PDF Viewer component supports loading PDF files from Dropbox using either the standalone or the server-backed PDF Viewer. The following steps demonstrate both approaches. ## Using Standalone PDF Viewer @@ -19,13 +17,13 @@ To load a PDF file from Dropbox cloud file storage in a PDF Viewer, you can foll **Step 1** Create a Dropbox API -To create a Dropbox API App, you should follow the official documentation provided by Dropbox [link](https://www.dropbox.com/developers/documentation/dotnet#tutorial). The process involves visiting the Dropbox Developer website and using their App Console to set up your API app. This app will allow you to interact with Dropbox programmatically, enabling secure access to files and data. +Follow the Dropbox documentation to create an API app: https://www.dropbox.com/developers/documentation/dotnet#tutorial. This enables programmatic access with secure credentials. -**Step 2:** Create a Simple PDF Viewer Sample in Typescript +**Step 2:** Create a Simple PDF Viewer Sample in TypeScript -Start by following the steps provided in this [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/getting-started) to create a simple PDF viewer sample in Typescript. This will give you a basic setup of the PDF viewer component. +Start by following the steps provided in this [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/getting-started) to create a simple PDF Viewer sample in TypeScript. This will give you a basic setup of the PDF Viewer component. -**Step 3:** Modify the `src/app/app.ts` File in the Angular Project +**Step 3:** Modify the src/app/app.ts file in the TypeScript project 1. Import the required namespaces at the top of the file: @@ -33,9 +31,9 @@ Start by following the steps provided in this [link](https://help.syncfusion.com import { Dropbox } from 'dropbox'; ``` -2. Create an instance of the Dropbox class using an access token for authentication. Next, call the filesDownload method of this Dropbox instance to download the file located at /PDF_Succinctly.pdf. Upon successfully downloading the file, extract the file blob from the response. Convert this file blob to a Base64 string using the blobToBase64 method. Finally, load the Base64 string into a PDF viewer control. +2. Create an instance of the Dropbox class using an access token for authentication. Next, call the filesDownload method of this Dropbox instance to download the file located at /PDF_Succinctly.pdf. Upon successfully downloading the file, extract the file blob from the response. Convert this file blob to a Base64 string using the blobToBase64 method. Finally, load the Base64 string into a PDF Viewer control. -N> Replace **Your Access Token** with the actual Access Token of your Drop Box account. +N> Replace the placeholder with your actual Dropbox access token. ```typescript pdfviewer.created = function () { @@ -64,19 +62,19 @@ N> The **npm install dropbox** package must be installed in your application to [View sample in GitHub](https://github.com/SyncfusionExamples/open-save-pdf-documents-in-dropbox-cloud-file-storage/tree/master/Open%20and%20Save%20PDF%20in%20Drop%20Box%20using%20Standalone) -## Using Server-Backed PDF Viewer +## Using the server-backed PDF Viewer To load a PDF file from Dropbox cloud file storage in a PDF Viewer, you can follow the steps below -**Step 1** Create a Dropbox API +**Step 1:** Create a Dropbox API app To create a Dropbox API App, you should follow the official documentation provided by Dropbox [link](https://www.dropbox.com/developers/documentation/dotnet#tutorial). The process involves visiting the Dropbox Developer website and using their App Console to set up your API app. This app will allow you to interact with Dropbox programmatically, enabling secure access to files and data. -**Step 2:** Create a Simple PDF Viewer Sample in Typescript +**Step 2:** Create a PDF Viewer sample in TypeScript -Start by following the steps provided in this [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/getting-started) to create a simple PDF viewer sample in Typescript. This will give you a basic setup of the PDF viewer component. +Start by following the steps provided in this [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/getting-started) to create a simple PDF Viewer sample in TypeScript. This will give you a basic setup of the PDF Viewer component. -**Step 3:** Modify the `PdfViewerController.cs` File in the Web Service Project +**Step 3:** Modify the PdfViewerController.cs file in the web service project 1. Create a web service project in .NET Core 3.0 or above. You can refer to this [link](https://www.syncfusion.com/kb/11063/how-to-create-pdf-viewer-web-service-in-net-core-3-0-and-above) for instructions on how to create a web service project. @@ -117,7 +115,7 @@ public PdfViewerController(IWebHostEnvironment hostingEnvironment, IMemoryCache public async Task Load([FromBody] Dictionary jsonObject) { - //Initialize the PDF viewer object with memory cache object + //Initialize the PDF Viewer object with memory cache object PdfRenderer pdfviewer = new PdfRenderer(_cache); MemoryStream stream = new MemoryStream(); object jsonResult = new object(); @@ -134,7 +132,7 @@ public async Task Load([FromBody] Dictionary json { var byteArray = await response.GetContentAsByteArrayAsync(); - // Load the PDF file into the PDF viewer + // Load the PDF file into the PDF Viewer stream = new MemoryStream(byteArray); } } @@ -166,11 +164,11 @@ public async Task Load([FromBody] Dictionary json } ``` -N> Replace **Your_Dropbox_Access_Token** with your actual Dropbox access token and **Your_Folder_Name** with your folder name. +N> Replace the placeholders with your actual Dropbox values: Access Token and Folder Name. -**Step 4:** Set the PDF Viewer Properties in Typescript PDF viewer component +**Step 4:** Configure the PDF Viewer component -Modify the [serviceUrl](https://ej2.syncfusion.com/documentation/api/pdfviewer/#serviceurl) property of the PDF viewer component with the accurate URL of your web service project, replacing `https://localhost:44396/pdfviewer` with the actual URL of your server. Set the `documentPath` property of the PDF viewer component to the desired name of the PDF file you wish to load from Dropbox cloud file storage. Ensure that you correctly pass the document name from the files available in your dropbox folder to the documentPath property. +Set the [serviceUrl](https://ej2.syncfusion.com/documentation/api/pdfviewer/#serviceurl) to your web service endpoint (replace the localhost URL with your server URL). Set documentPath to the PDF file name to load from Dropbox. Ensure the document name exists in your Dropbox folder. ```typescript diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es6/open-pdf-file/from-google-cloud-storage.md b/Document-Processing/PDF/PDF-Viewer/javascript-es6/open-pdf-file/from-google-cloud-storage.md index ea37190c3..bd5119b23 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es6/open-pdf-file/from-google-cloud-storage.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es6/open-pdf-file/from-google-cloud-storage.md @@ -1,23 +1,21 @@ --- layout: post -title: Open PDF files from Google Cloud Storage in Typescript Pdfviewer control | Syncfusion -description: Learn here all about Open PDF files from Google Cloud Storage in Syncfusion Typescript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Open PDF from Google Cloud Storage in TypeScript PDF Viewer | Syncfusion +description: Learn how to load PDFs from Google Cloud Storage in the Syncfusion TypeScript PDF Viewer component using a server-backed approach. platform: document-processing -control: Open PDF files from Google Cloud Storage -publishingplatform: Typescript +control: PDF Viewer documentation: ug -domainurl: ##DomainURL## --- -# Open PDF file from Google Cloud Storage +# Open PDF from Google Cloud Storage -To load a PDF file from Google Cloud Storage in a PDF Viewer, you can follow the steps below +Follow these steps to load a PDF from Google Cloud Storage using the server-backed PDF Viewer. -**Step 1:** Create a Simple PDF Viewer Sample in Typescript +**Step 1:** Create a Simple PDF Viewer Sample in TypeScript -Start by following the steps provided in this [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/getting-started) to create a simple PDF viewer sample in Typescript. This will give you a basic setup of the PDF viewer component. +Start by following the steps provided in this [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/getting-started) to create a simple PDF Viewer sample in TypeScript. This will give you a basic setup of the PDF Viewer component. -**Step 2:** Modify the `PdfViewerController.cs` File in the Web Service Project +**Step 2:** Modify the PdfViewerController.cs file in the web service project 1. Create a web service project in .NET Core 3.0 or above. You can refer to this [link](https://www.syncfusion.com/kb/11063/how-to-create-pdf-viewer-web-service-in-net-core-3-0-and-above) for instructions on how to create a web service project. @@ -31,7 +29,7 @@ using Google.Cloud.Storage.V1; using Google.Apis.Auth.OAuth2; ``` -4. Add the following private fields and constructor parameters to the `PdfViewerController` class, In the constructor, assign the values from the configuration to the corresponding fields +4. Add the following private fields and constructor parameters to PdfViewerController. In the constructor, assign values from configuration to the corresponding fields. ```csharp // Private readonly object _storageClient @@ -94,7 +92,7 @@ public IActionResult Load([FromBody] Dictionary jsonObject) } ``` -6. Open the `appsettings.json` file in your web service project, Add the following lines below the existing `"AllowedHosts"` configuration +6. Open appsettings.json in the web service project and add the following keys below the existing AllowedHosts configuration ```json { @@ -109,13 +107,13 @@ public IActionResult Load([FromBody] Dictionary jsonObject) } ``` -N> Replace **Your Bucket name from Google Cloud Storage** with the actual name of your Google Cloud Storage bucket +N> Replace the placeholder with the actual Google Cloud Storage bucket name. -N> Replace **path/to/service-account-key.json** with the actual file path to your service account key JSON file. Make sure to provide the correct path and filename. +N> Replace path/to/service-account-key.json with the actual file path to your service account key JSON file. -**Step 3:** Set the PDF Viewer Properties in Typescript PDF viewer component +**Step 3:** Configure the PDF Viewer component -Modify the [serviceUrl](https://ej2.syncfusion.com/documentation/api/pdfviewer/#serviceurl) property of the PDF viewer component with the accurate URL of your web service project, replacing `https://localhost:44396/pdfviewer` with the actual URL of your server. Set the `documentPath` property of the PDF viewer component to the desired name of the PDF file you wish to load from Google Cloud Storage. Ensure that you correctly pass the document name from the files available in your bucket to the documentPath property. +Set the [serviceUrl](https://ej2.syncfusion.com/documentation/api/pdfviewer/#serviceurl) to your web service endpoint (replace the localhost URL with your server URL). Set documentPath to the PDF file name to load from Google Cloud Storage. Ensure the document name exists in your bucket. ```typescript diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es6/open-pdf-file/from-google-drive.md b/Document-Processing/PDF/PDF-Viewer/javascript-es6/open-pdf-file/from-google-drive.md index 681803fa7..dbf0e5610 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es6/open-pdf-file/from-google-drive.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es6/open-pdf-file/from-google-drive.md @@ -1,27 +1,25 @@ --- layout: post -title: Open PDF files from Google Drive in Typescript Pdfviewer control | Syncfusion -description: Learn here all about Open PDF files from Google Drive in Syncfusion Typescript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Open PDF from Google Drive in TypeScript PDF Viewer | Syncfusion +description: Learn how to load PDFs from Google Drive in the Syncfusion TypeScript PDF Viewer component using a server-backed approach. platform: document-processing -control: Open PDF files from Google Drive -publishingplatform: Typescript +control: PDF Viewer documentation: ug -domainurl: ##DomainURL## --- -# Open PDF file from Google Drive +# Open PDF from Google Drive -To load a PDF file from Google Drive in a PDF Viewer, you can follow the steps below +Follow these steps to load a PDF from Google Drive using the server-backed PDF Viewer. **Step 1** Set up Google Drive API You must set up a project in the Google Developers Console and enable the Google Drive API. Obtain the necessary credentials to access the API. For more information, view the official [link](https://developers.google.com/drive/api/guides/enable-sdk). -**Step 2:** Create a Simple PDF Viewer Sample in Typescript +**Step 2:** Create a Simple PDF Viewer Sample in TypeScript -Start by following the steps provided in this [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/getting-started) to create a simple PDF viewer sample in Typescript. This will give you a basic setup of the PDF viewer component. +Start by following the steps provided in this [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/getting-started) to create a simple PDF Viewer sample in TypeScript. This will give you a basic setup of the PDF Viewer component. -**Step 3:** Modify the `PdfViewerController.cs` File in the Web Service Project +**Step 3:** Modify the PdfViewerController.cs file in the web service project 1. Create a web service project in .NET Core 3.0 or above. You can refer to this [link](https://www.syncfusion.com/kb/11063/how-to-create-pdf-viewer-web-service-in-net-core-3-0-and-above) for instructions on how to create a web service project. @@ -35,7 +33,7 @@ using Google.Apis.Drive.v3; using Google.Apis.Util.Store; ``` -4. Add the following private fields and constructor parameters to the `PdfViewerController` class, In the constructor, assign the values from the configuration to the corresponding fields +4. Add the following private fields and constructor parameters to PdfViewerController. In the constructor, assign values from configuration to the corresponding fields. ```csharp private IConfiguration _configuration; @@ -64,7 +62,7 @@ public PdfViewerController(IWebHostEnvironment hostingEnvironment, IMemoryCache //Post action for Loading the PDF documents  public async Task Load([FromBody] Dictionary jsonObject) { - //Initialize the PDF viewer object with memory cache object + //Initialize the PDF Viewer object with memory cache object PdfRenderer pdfviewer = new PdfRenderer(_cache); MemoryStream stream = new MemoryStream(); object jsonResult = new object(); @@ -126,7 +124,7 @@ public async Task Load([FromBody] Dictionary json } ``` -6. Open the `appsettings.json` file in your web service project, Add the following lines below the existing `"AllowedHosts"` configuration +6. Open appsettings.json in the web service project and add the following keys below the existing AllowedHosts configuration ```json { @@ -143,13 +141,13 @@ public async Task Load([FromBody] Dictionary json } ``` -N> Replace **Your Google Drive Folder ID**, **Your Application name**, and **Your Path to the OAuth 2.0 Client IDs json file** with your actual Google drive folder ID , Your name for your application and the path for the JSON file. +N> Replace the placeholders with your actual values: Google Drive Folder ID, Application name, and the path to the OAuth 2.0 client IDs JSON file. N> The **FolderId** part is the unique identifier for the folder. For example, if your folder URL is: `https://drive.google.com/drive/folders/abc123xyz456`, then the folder ID is `abc123xyz456`. -**Step 4:** Set the PDF Viewer Properties in Typescript PDF viewer component +**Step 4:** Configure the PDF Viewer component -Modify the [serviceUrl](https://ej2.syncfusion.com/documentation/api/pdfviewer/#serviceurl) property of the PDF viewer component with the accurate URL of your web service project, replacing `https://localhost:44396/pdfviewer` with the actual URL of your server. Set the `documentPath` property of the PDF viewer component to the desired name of the PDF file you wish to load from Google Drive. Ensure that you correctly pass the document name from the files available in your drive folder to the documentPath property. +Set the [serviceUrl](https://ej2.syncfusion.com/documentation/api/pdfviewer/#serviceurl) to your web service endpoint (replace the localhost URL with your server URL). Set documentPath to the PDF file name to load from Google Drive. Ensure the document name exists in your Drive folder. ```typescript diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es6/open-pdf-file/from-one-drive.md b/Document-Processing/PDF/PDF-Viewer/javascript-es6/open-pdf-file/from-one-drive.md index 3e0c33370..10e7a03db 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es6/open-pdf-file/from-one-drive.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es6/open-pdf-file/from-one-drive.md @@ -1,27 +1,25 @@ --- layout: post -title: Open PDF files from One Drive in Typescript Pdfviewer control | Syncfusion -description: Learn here all about Open PDF files from One Drive in Syncfusion Typescript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Open PDF from OneDrive in TypeScript PDF Viewer | Syncfusion +description: Learn how to load PDFs from OneDrive in the Syncfusion TypeScript PDF Viewer component using a server-backed approach. platform: document-processing -control: Open PDF files from One Drive -publishingplatform: Typescript +control: PDF Viewer documentation: ug -domainurl: ##DomainURL## --- -# Open PDF file from One Drive +# Open PDF from OneDrive -To load a PDF file from One Drive in a PDF Viewer, you can follow the steps below +Follow these steps to load a PDF from OneDrive using the server-backed PDF Viewer. -**Step 1** Create the Microsoft graph API. +**Step 1:** Create a Microsoft Graph API application -Need to create a Microsoft Graph API application and obtain the necessary credentials, namely the application ID and tenant ID. Follow the steps provided in the [link](https://learn.microsoft.com/en-us/training/modules/msgraph-access-file-data/3-exercise-access-files-onedrive) to create the application and obtain the required IDs. +Create a Microsoft Graph API application and obtain the application ID and tenant ID. Follow this guide: https://learn.microsoft.com/en-us/training/modules/msgraph-access-file-data/3-exercise-access-files-onedrive -**Step 2:** Create a Simple PDF Viewer Sample in Typescript +**Step 2:** Create a Simple PDF Viewer Sample in TypeScript -Start by following the steps provided in this [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/getting-started) to create a simple PDF viewer sample in Typescript. This will give you a basic setup of the PDF viewer component. +Start by following the steps provided in this [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/getting-started) to create a simple PDF Viewer sample in TypeScript. This will give you a basic setup of the PDF Viewer component. -**Step 3:** Modify the `PdfViewerController.cs` File in the Web Service Project +**Step 3:** Modify the PdfViewerController.cs file in the web service project 1. Create a web service project in .NET Core 3.0 or above. You can refer to this [link](https://www.syncfusion.com/kb/11063/how-to-create-pdf-viewer-web-service-in-net-core-3-0-and-above) for instructions on how to create a web service project. @@ -36,7 +34,7 @@ using Microsoft.Identity.Client; using Helpers; ``` -4. Add the following private fields and constructor parameters to the `PdfViewerController` class, In the constructor, assign the values from the configuration to the corresponding fields +4. Add the following private fields and constructor parameters to PdfViewerController. In the constructor, assign values from configuration to the corresponding fields. ```csharp private IConfiguration _configuration; @@ -64,7 +62,7 @@ public PdfViewerController(IWebHostEnvironment hostingEnvironment, IMemoryCache //Post action for Loading the PDF documents  public async Task Load([FromBody] Dictionary jsonObject) { - // Initialize the PDF viewer object with memory cache object + // Initialize the PDF Viewer object with memory cache object PdfRenderer pdfviewer = new PdfRenderer(_cache); MemoryStream stream = new MemoryStream(); object jsonResult = new object(); @@ -121,7 +119,7 @@ public async Task Load([FromBody] Dictionary json } ``` -6. Open the `appsettings.json` file in your web service project, Add the following lines below the existing `"AllowedHosts"` configuration +6. Open appsettings.json in the web service project and add the following keys below the existing AllowedHosts configuration ```json { @@ -139,11 +137,11 @@ public async Task Load([FromBody] Dictionary json ``` -N> Replace **Your_Tenent_ID**, **Your_Application_ID**, and **Your_Folder_Name_To_Access_The_Files_In_Onedrive** with your actual tenant ID, application ID, and folder name. +N> Replace the placeholders with your actual values: Tenant ID, Application ID, and OneDrive folder name. -**Step 4:** Set the PDF Viewer Properties in Typescript PDF viewer component +**Step 4:** Configure the PDF Viewer component -Modify the [serviceUrl](https://ej2.syncfusion.com/documentation/api/pdfviewer/#serviceurl) property of the PDF viewer component with the accurate URL of your web service project, replacing `https://localhost:44396/pdfviewer` with the actual URL of your server. Set the `documentPath` property of the PDF viewer component to the desired name of the PDF file you wish to load from One Drive. Ensure that you correctly pass the document name from the files available in your drive folder to the documentPath property. +Set the [serviceUrl](https://ej2.syncfusion.com/documentation/api/pdfviewer/#serviceurl) to your web service endpoint (replace the localhost URL with your server URL). Set documentPath to the PDF file name to load from OneDrive. Ensure the document name exists in your OneDrive folder. ```typescript diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es6/open-pdf-files.md b/Document-Processing/PDF/PDF-Viewer/javascript-es6/open-pdf-files.md index 457125e41..8a8652018 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es6/open-pdf-files.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es6/open-pdf-files.md @@ -1,39 +1,36 @@ --- layout: post -title: Open PDF files Typescript Pdfviewer control | Syncfusion -description: This page helps you to learn about how to load PDF files from various locations in Syncfusion Typescript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Open PDF files in TypeScript PDF Viewer | Syncfusion +description: Learn how to load PDF files in the Syncfusion TypeScript PDF Viewer from URLs, base64 strings, and databases by configuring the required server-backed services. platform: document-processing -control: Open PDF files -publishingplatform: Typescript +control: PDF Viewer documentation: ug domainurl: ##DomainURL## --- -# Open PDF files +# Open PDF files in TypeScript PDF Viewer -You might need to open and view the PDF files from various location. In this section, you can find the information about how to open PDF files from URL, database and as base64 string. +Load documents into the PDF Viewer from hosted URLs, base64 strings, or database storage. The following sections outline each scenario and the configuration required for server-backed viewing. -## Opening a PDF from URL +## Open a PDF from a URL -If you have your PDF files in the web, you can open it in the viewer using URL. +Use this approach when the PDF file is hosted on a web server. -**Step 1:** Create a Simple PDF Viewer Sample in Typescript +**Step 1:** Create a TypeScript PDF Viewer sample -Start by following the steps provided in this [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/getting-started) to create a simple PDF viewer sample in Typescript. This will give you a basic setup of the PDF viewer component. +Follow the [TypeScript getting started guide](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/getting-started) to scaffold a basic PDF Viewer application. -**Step 2:** Modify the `PdfViewerController.cs` File in the Web Service Project +**Step 2:** Update the `PdfViewerController.cs` file in the web service project -1. Create a web service project in .NET Core 3.0 or above. You can refer to this [link](https://www.syncfusion.com/kb/11063/how-to-create-pdf-viewer-web-service-in-net-core-3-0-and-above) for instructions on how to create a web service project. - -2. Open the `PdfViewerController.cs` file in your web service project. - -3. Modify the [Load()](https://ej2.syncfusion.com/documentation/api/pdfviewer/#load) method to open it in the viewer using URL +1. Create a web service project in .NET Core 3.0 or later. Refer to [How to create a PDF Viewer web service in .NET Core](https://www.syncfusion.com/kb/11063/how-to-create-pdf-viewer-web-service-in-net-core-3-0-and-above) for guidance. +2. Open the `PdfViewerController.cs` file. +3. Modify the [Load](https://ej2.syncfusion.com/documentation/api/pdfviewer/#load) method to resolve remote URLs when `isFileName` is `true`. ```csharp public IActionResult Load([FromBody] Dictionary jsonData) { - // Initialize the PDF viewer object with memory cache object + // Initialize the PDF Viewer object with memory cache object PdfRenderer pdfviewer = new PdfRenderer(_cache); MemoryStream stream = new MemoryStream(); object jsonResult = new object(); @@ -75,9 +72,9 @@ public IActionResult Load([FromBody] Dictionary jsonData) ``` -**Step 3:** Set the PDF Viewer Properties in React PDF viewer component +**Step 3:** Configure the PDF Viewer in the TypeScript application -Modify the [serviceUrl](https://ej2.syncfusion.com/documentation/api/pdfviewer/#serviceurl) property of the PDF viewer component with the accurate URL of your web service project, replacing `https://localhost:44396/pdfviewer` with the actual URL of your server.Modify the documentPath with the correct PDF Document URL want to load. +Update the [serviceUrl](https://ej2.syncfusion.com/documentation/api/pdfviewer/#serviceurl) with the hosted web service endpoint (replace `https://localhost:44396/pdfviewer` with your server URL) and set `documentPath` to the PDF file to load. ```typescript @@ -98,15 +95,15 @@ viewer.appendTo('#pdfViewer'); [View sample in GitHub](https://github.com/SyncfusionExamples/typescript-pdf-viewer-examples/tree/master/Save%20and%20Load/Load%20PDF%20file%20from%20URL) -## Opening a PDF from base64 data +## Open a PDF from base64 data -The following code steps how the PDF file can be loaded in PDF Viewer as base64 string. +Convert PDFs to base64 strings when you need to stream content directly from an API response or store it inline. -**Step 1:** Create a Simple PDF Viewer Sample in Angular +**Step 1:** Create a TypeScript PDF Viewer sample -Start by following the steps provided in this [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/angular/getting-started) to create a simple PDF viewer sample in Angular. This will give you a basic setup of the PDF viewer component. +Use the [TypeScript getting started guide](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/getting-started) to initialize the PDF Viewer project. -**Step 2:** Use the following code snippet to load PDF document using base64 string. +**Step 2:** Load the document by passing a base64 string to the `load` method. ``` @@ -122,20 +119,18 @@ document.getElementById('load').addEventListener('click', () => { [View sample in GitHub](https://github.com/SyncfusionExamples/typescript-pdf-viewer-examples/tree/master/Save%20and%20Load/Load%20PDF%20file%20from%20base64%20string) -## Opening a PDF from database - -To load a PDF file from SQL Server database in a PDF Viewer, you can follow the steps below - -**Step 1:** Create a Simple PDF Viewer Sample in Typescript +## Open a PDF from a database -Start by following the steps provided in this [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/getting-started) to create a simple PDF viewer sample in Typescript. This will give you a basic setup of the PDF viewer component. +Retrieve PDF files stored in SQL Server by extending the server-backed web service. -**Step 2:** Modify the `PdfViewerController.cs` File in the Web Service Project +**Step 1:** Create a TypeScript PDF Viewer sample -1. Create a web service project in .NET Core 3.0 or above. You can refer to this [link](https://www.syncfusion.com/kb/11063/how-to-create-pdf-viewer-web-service-in-net-core-3-0-and-above) for instructions on how to create a web service project. +Follow the [TypeScript getting started guide](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/getting-started) to configure the client application. -2. Open the `PdfViewerController.cs` file in your web service project. +**Step 2:** Update the `PdfViewerController.cs` file in the web service project +1. Create a web service project in .NET Core 3.0 or later. Refer to [How to create a PDF Viewer web service in .NET Core](https://www.syncfusion.com/kb/11063/how-to-create-pdf-viewer-web-service-in-net-core-3-0-and-above) for detailed steps. +2. Open the `PdfViewerController.cs` file. 3. Import the required namespaces at the top of the file: ```csharp @@ -143,7 +138,7 @@ using System.IO; using System.Data.SqlClient; ``` -4. Add the following private fields and constructor parameters to the `PdfViewerController` class, In the constructor, assign the values from the configuration to the corresponding fields +4. Add the following private fields and constructor parameters to the `PdfViewerController` class. In the constructor, assign configuration values to these fields. ```csharp private IConfiguration _configuration; @@ -158,13 +153,13 @@ public PdfViewerController(IWebHostEnvironment hostingEnvironment, IMemoryCache } ``` -5. Modify the [Load()](https://ej2.syncfusion.com/documentation/api/pdfviewer/#load) method to open it in the viewer using URL +5. Modify the [Load](https://ej2.syncfusion.com/documentation/api/pdfviewer/#load) method to stream the PDF from SQL Server when `isFileName` is `true`. ```csharp public IActionResult Load([FromBody] Dictionary jsonData) { - // Initialize the PDF viewer object with memory cache object + // Initialize the PDF Viewer object with memory cache object PdfRenderer pdfviewer = new PdfRenderer(_cache); MemoryStream stream = new MemoryStream(); object jsonResult = new object(); @@ -225,8 +220,8 @@ public IActionResult Load([FromBody] Dictionary jsonData) } ``` -N> Replace **Your Connection string from SQL server** with the actual connection string for your SQL Server database +N> Replace **Your connection string for SQL server** with the actual connection string for your SQL Server database. -N> The **System.Data.SqlClient** package must be installed in your application to use the previous code example. You need to modify the connectionString variable in the previous code example as per the connection string of your database. +N> Install the **System.Data.SqlClient** package and update the `connectionString` value to match your environment before running the sample. [View sample in GitHub](https://github.com/SyncfusionExamples/open-save-pdf-documents-in-database) \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es6/organize-pdf-overview.md b/Document-Processing/PDF/PDF-Viewer/javascript-es6/organize-pdf-overview.md new file mode 100644 index 000000000..547067c80 --- /dev/null +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es6/organize-pdf-overview.md @@ -0,0 +1,28 @@ +--- +layout: post +title: Organize pages in TypeScript PDF Viewer | Syncfusion +description: Learn how to reorder, rotate, insert, delete, and save pages with the Syncfusion TypeScript PDF Viewer component. +platform: document-processing +control: PDF Viewer +documentation: ug +domainurl: ##DomainURL## +--- + +# Organize pages in TypeScript PDF Viewer + +The TypeScript PDF Viewer component provides an Organize Pages panel that helps you prepare documents before sharing them. Use it to tidy scanned files, move pages into the right order, and duplicate important content without leaving the viewer. + +To open the Organize Pages panel, load a document, ensure that the Organize Pages toolbar item is enabled, and choose **Organize Pages** from the left vertical toolbar. The document must allow page-level edits; otherwise, the toolbar item is hidden. + +The Organize Pages panel supports the following actions: + +* **Rotate pages**: Fix page orientation in 90-degree increments to correct scanned pages. +* **Rearrange pages**: Drag and drop thumbnails to update the reading order. +* **Insert new pages**: Add blank pages at the required position. +* **Delete pages**: Remove pages that are no longer needed. +* **Copy pages**: Duplicate selected pages to reuse content elsewhere in the document. +* **Import a PDF document**: Merge the current document with pages from another PDF file. +* **Select all pages**: Apply bulk actions, such as rotation or deletion, to every page. +* **Save updates**: Review changes in real time and use **Save** or **Save As** to download the revised document. + +After completing the changes, apply them by selecting **Save** to overwrite the current document or **Save As** to download a new copy that retains the updated page order. diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es6/organize-pdf.md b/Document-Processing/PDF/PDF-Viewer/javascript-es6/organize-pdf.md index a229710bb..fd39dfaf5 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es6/organize-pdf.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es6/organize-pdf.md @@ -198,31 +198,21 @@ document.getElementById('openPageOrganizer').addEventListener('click', function viewer.pageOrganizer.openPageOrganizer(); } ``` - **closePageOrganizer:** This API closes the currently open page organizer dialog within the PDF Viewer, if it is present. It allows users to dismiss the dialog when done with page organization tasks. - ```html ``` - ```ts document.getElementById('closePageOrganizer').addEventListener('click', function () { viewer.pageOrganizer.openPageOrganizer(); } ``` - ## Keyboard shortcuts - The following keyboard shortcuts are available at the organize pages dialog. - * **Ctrl+Z** : Undo the last action performed. * **Ctrl+Y** : Redo the action that was undone * **Ctrl+Scroll** : Zoom in and zoom out page thumbnails for better visibility. - ![Alt text](./images/undo-redo.png) - #### Conclusion - With the Organize Pages feature in the PDF Viewer, managing your PDF documents has never been easier. Whether you are adding new content, adjusting page orientation, moving the pages, duplicating the pages, or removing unnecessary pages, this feature provides the tools you need to streamline your document management workflow. Explore these capabilities today and take control of your PDF documents with ease! - [View sample in GitHub](https://github.com/SyncfusionExamples/typescript-pdf-viewer-examples/tree/master/How%20to/Organize%20pdf) \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es6/organize-pdf/organize-page-mobile-view.md b/Document-Processing/PDF/PDF-Viewer/javascript-es6/organize-pdf/organize-page-mobile-view.md new file mode 100644 index 000000000..69c40c602 --- /dev/null +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es6/organize-pdf/organize-page-mobile-view.md @@ -0,0 +1,37 @@ +--- +layout: post +title: Organize Pages in Mobile PDF Viewer | Syncfusion +description: Learn how to organize pages in the mobile PDF Viewer, including rotating, rearranging, inserting, deleting, and copying pages on mobile devices. +platform: document-processing +control: PDF Viewer +documentation: ug +domainurl: ##DomainURL## +--- + +# Organize Pages in Mobile PDF Viewer + +The PDF Viewer offers a mobile-responsive layout for the `Organize Pages` feature, ensuring a seamless experience on smaller devices. When viewed on a mobile device, the toolbar and navigation elements adapt to the screen size, providing easy access to all page management tools. + +## Mobile-Friendly Toolbar + +In the mobile view, the `Organize Pages` toolbar is displayed at the bottom of the screen for easy one-handed access. The toolbar includes the same set of tools as the desktop version, such as insert, delete, and rotate, but with a mobile-optimized layout. + +## Context Menu for Page Operations + +To perform actions on a page thumbnail, tap and hold on the thumbnail to open a context menu. This menu contains all the available page operations: + +* **Rotate Clockwise**: Rotate the selected page 90 degrees clockwise. +* **Rotate Counter-Clockwise**: Rotate the selected page 90 degrees counter-clockwise. +* **Insert Page**: Insert a new page. +* **Copy Page**: Duplicate the selected page. +* **Delete Page**: Remove the selected page. +* **Select All**: Select all pages in the document. + + +![Alt text](../images/Context-Menu-Page-Operations1.png) + +## Rearranging Pages on Mobile + +To rearrange pages, tap and hold a page thumbnail to select it, then drag it to the desired position. A blue line will indicate the drop location. + +By providing a mobile-friendly interface, the PDF Viewer ensures that users can efficiently manage their PDF documents from any device, anywhere. diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es6/organize-pdf/organize-pdf-events.md b/Document-Processing/PDF/PDF-Viewer/javascript-es6/organize-pdf/organize-pdf-events.md new file mode 100644 index 000000000..4ca3948a2 --- /dev/null +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es6/organize-pdf/organize-pdf-events.md @@ -0,0 +1,78 @@ +--- +layout: post +title: Organize Pages Events in PDF Viewer | Syncfusion +description: Learn how to organize pages Events in the PDF Viewer, including rotating, rearranging, inserting, deleting, and copying pages on mobile devices. +platform: document-processing +control: PDF Viewer +documentation: ug +domainurl: ##DomainURL## +--- + +# Organize Pages Events in PDF Viewer + +The PDF Viewer provides events to track and respond to actions within the page organizer, allowing for the customization of page manipulation features. + +## pageOrganizerSaveAs + +The `pageOrganizerSaveAs` event is triggered when a save action is performed in the page organizer. + +- Occurs when the **Save as** button in the page organizer toolbar is clicked after modifying the document structure. + +The event arguments provide the necessary information about the save event: + +- `fileName`: The name of the currently loaded PDF document. +- `downloadDocument`: A base64 string of the modified PDF document data. +- `cancel`: A boolean that, when set to `true`, prevents the default save action from proceeding. + +```typescript +import { PdfViewer, Toolbar, Magnification, Navigation, LinkAnnotation,ThumbnailView, BookmarkView, + TextSelection, Annotation, FormDesigner, FormFields, ValidateFormFieldsArgs, PageOrganizer } from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject( Toolbar,Magnification, Navigation, LinkAnnotation,ThumbnailView, + BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer ); + +let pdfviewer: PdfViewer = new PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + pageOrganizerSaveAs: function (args) { + console.log('File Name is' + args.fileName); + console.log('Document data' + args.downloadDocument); + } +}); +pdfviewer.appendTo('#PdfViewer'); +``` + +## pageOrganizerZoomChanged + +The `pageOrganizerZoomChanged` event is triggered when the zoom level of the page organizer is changed. + +- This event is fired when the user interacts with the zoom slider in the page organizer. The `showImageZoomingSlider` property in `pageOrganizerSettings` must be set to `true` for the slider to be visible. + + +Event arguments: + +- `previousZoomValue`: The previous zoom value. +- `currentZoomValue`: The current zoom value. + +```typescript +import { PdfViewer, Toolbar, Magnification, Navigation, LinkAnnotation,ThumbnailView, BookmarkView, + TextSelection, Annotation, FormDesigner, FormFields, ValidateFormFieldsArgs, PageOrganizer } from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject( Toolbar,Magnification, Navigation, LinkAnnotation,ThumbnailView, + BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer ); + +let pdfviewer: PdfViewer = new PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + pageOrganizerZoomChanged: function (args) { + console.log('Previous Zoom Value is' + args.previousZoom); + console.log('Current Zoom Value is' + args.currentZoom); + } +}); +pdfviewer.pageOrganizerSettings = { showImageZoomingSlider: true }; +pdfviewer.appendTo('#PdfViewer'); +``` + +## Related event documentation + +- Overall Viewer events: [Event](../event) +- Annotation events: [Annotation events](../annotations/annotation-event) +- Form designer events: [Form field events](../form-designer/form-field-events) diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es6/organize-pdf/programmatic-support-for-organize-page.md b/Document-Processing/PDF/PDF-Viewer/javascript-es6/organize-pdf/programmatic-support-for-organize-page.md new file mode 100644 index 000000000..a3708aff5 --- /dev/null +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es6/organize-pdf/programmatic-support-for-organize-page.md @@ -0,0 +1,140 @@ +--- +layout: post +title: Programmatic Support for Organize Pages in TypeScript PDF Viewer control | Syncfusion +description: Learn here all about Programmatic Support for Organize Pages in Syncfusion TypeScript PDF Viewer control of Syncfusion Essential JS 2 and more. +platform: document-processing +control: PDF Viewer +documentation: ug +domainurl: ##DomainURL## +--- + +# Programmatic Support for Organize Pages in TypeScript PDF Viewer control + +The PDF Viewer provides comprehensive programmatic support for organizing pages, allowing you to integrate and manage PDF functionalities directly within your application. This section details the available APIs to enable, control, and interact with the page organization features. + +## Enable or disable the page organizer + +The page organizer feature can be enabled or disabled using the `enablePageOrganizer` property. By default, this feature is enabled. + +{% tabs %} +{% highlight ts tabtitle="Standalone" %} + +import { PdfViewer, Toolbar, Magnification, Navigation, Annotation, LinkAnnotation, ThumbnailView, BookmarkView, TextSelection, TextSearch, FormFields, FormDesigner, PageOrganizer} from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject(Toolbar, Magnification, Navigation, Annotation, LinkAnnotation, ThumbnailView, BookmarkView, TextSelection, TextSearch, FormFields, FormDesigner, PageOrganizer); + +let pdfviewer: PdfViewer = new PdfViewer(); +pdfviewer.documentPath = "https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf"; +pdfviewer.resourceUrl = "https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib"; +pdfviewer.enablePageOrganizer = true; +pdfviewer.appendTo('#PdfViewer'); + +{% endhighlight %} +{% highlight ts tabtitle="Server-Backed" %} + +import { PdfViewer, Toolbar, Magnification, Navigation, Annotation, LinkAnnotation, ThumbnailView, BookmarkView, TextSelection, TextSearch, FormFields, FormDesigner, PageOrganizer} from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject(Toolbar, Magnification, Navigation, Annotation, LinkAnnotation, ThumbnailView, BookmarkView, TextSelection, TextSearch, FormFields, FormDesigner, PageOrganizer); + +let pdfviewer: PdfViewer = new PdfViewer(); +pdfviewer.serviceUrl = 'https://document.syncfusion.com/web-services/pdf-viewer/api/pdfviewer/'; +pdfviewer.documentPath = "https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf"; +pdfviewer.enablePageOrganizer = true; +pdfviewer.appendTo('#PdfViewer'); + +{% endhighlight %} +{% endtabs %} + +## Open the page organizer on document load + +You can control whether the page organizer dialog opens automatically when a document is loaded using the `isPageOrganizerOpen` property. The default value is `false`. + +{% tabs %} +{% highlight ts tabtitle="Standalone" %} + +import { PdfViewer, Toolbar, Magnification, Navigation, Annotation, LinkAnnotation, ThumbnailView, BookmarkView, TextSelection, TextSearch, FormFields, FormDesigner, PageOrganizer} from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject(Toolbar, Magnification, Navigation, Annotation, LinkAnnotation, ThumbnailView, BookmarkView, TextSelection, TextSearch, FormFields, FormDesigner, PageOrganizer); + +let pdfviewer: PdfViewer = new PdfViewer(); +pdfviewer.documentPath = "https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf"; +pdfviewer.resourceUrl = "https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib"; +pdfviewer.isPageOrganizerOpen = true; +pdfviewer.appendTo('#PdfViewer'); + +{% endhighlight %} +{% highlight ts tabtitle="Server-Backed" %} + +import { PdfViewer, Toolbar, Magnification, Navigation, Annotation, LinkAnnotation, ThumbnailView, BookmarkView, TextSelection, TextSearch, FormFields, FormDesigner, PageOrganizer} from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject(Toolbar, Magnification, Navigation, Annotation, LinkAnnotation, ThumbnailView, BookmarkView, TextSelection, TextSearch, FormFields, FormDesigner, PageOrganizer); + +let pdfviewer: PdfViewer = new PdfViewer(); +pdfviewer.serviceUrl = 'https://document.syncfusion.com/web-services/pdf-viewer/api/pdfviewer/'; +pdfviewer.documentPath = "https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf"; +pdfviewer.isPageOrganizerOpen = true; +pdfviewer.appendTo('#PdfViewer'); + +{% endhighlight %} +{% endtabs %} + +## Customize page organizer settings + +The `pageOrganizerSettings` API allows you to customize the page management functionalities. You can enable or disable actions such as deleting, inserting, rotating, copying, importing, and rearranging pages, as well as configure thumbnail zoom settings. By default, all actions are enabled, and standard zoom settings are applied. + +{% tabs %} +{% highlight ts tabtitle="Standalone" %} + +import { PdfViewer, Toolbar, Magnification, Navigation, Annotation, LinkAnnotation, ThumbnailView, BookmarkView, TextSelection, TextSearch, FormFields, FormDesigner, PageOrganizer} from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject(Toolbar, Magnification, Navigation, Annotation, LinkAnnotation, ThumbnailView, BookmarkView, TextSelection, TextSearch, FormFields, FormDesigner, PageOrganizer); + +let pdfviewer: PdfViewer = new PdfViewer(); +pdfviewer.documentPath = "https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf"; +pdfviewer.resourceUrl = "https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib"; +pdfviewer.pageOrganizerSettings = {canDelete: true, canInsert: true, canRotate: true, canCopy: true, canRearrange: true, canImport: true, imageZoom: 1, showImageZoomingSlider: true, imageZoomMin: 1, imageZoomMax: 5} +pdfviewer.appendTo('#PdfViewer'); + +{% endhighlight %} +{% highlight ts tabtitle="Server-Backed" %} + +import { PdfViewer, Toolbar, Magnification, Navigation, Annotation, LinkAnnotation, ThumbnailView, BookmarkView, TextSelection, TextSearch, FormFields, FormDesigner, PageOrganizer} from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject(Toolbar, Magnification, Navigation, Annotation, LinkAnnotation, ThumbnailView, BookmarkView, TextSelection, TextSearch, FormFields, FormDesigner, PageOrganizer); + +let pdfviewer: PdfViewer = new PdfViewer(); +pdfviewer.serviceUrl = 'https://document.syncfusion.com/web-services/pdf-viewer/api/pdfviewer/'; +pdfviewer.documentPath = "https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf"; +pdfviewer.pageOrganizerSettings = {canDelete: true, canInsert: true, canRotate: true, canCopy: true, canRearrange: true, canImport: true, imageZoom: 1, showImageZoomingSlider: true, imageZoomMin: 1, imageZoomMax: 5}; +pdfviewer.appendTo('#PdfViewer'); + +{% endhighlight %} +{% endtabs %} + +## Open the page organizer dialog + +The `openPageOrganizer` method programmatically opens the page organizer dialog, providing access to page management tools. + +```html + +``` + +```ts +document.getElementById('openPageOrganizer').addEventListener('click', function () { + viewer.pageOrganizer.openPageOrganizer(); +}); +``` + +## Close the page organizer dialog + +The `closePageOrganizer` method programmatically closes the page organizer dialog. + +```html + +``` + +```ts +document.getElementById('closePageOrganizer').addEventListener('click', function () { + viewer.pageOrganizer.closePageOrganizer(); +}); +``` diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es6/organize-pdf/toolbar-organize-page.md b/Document-Processing/PDF/PDF-Viewer/javascript-es6/organize-pdf/toolbar-organize-page.md new file mode 100644 index 000000000..4bdbeda34 --- /dev/null +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es6/organize-pdf/toolbar-organize-page.md @@ -0,0 +1,124 @@ +--- +layout: post +title: Organize Page Toolbar Customization in TypeScript PDF Viewer control | Syncfusion +description: Learn here all about Organize Page Toolbar Customization in Syncfusion TypeScript PDF Viewer control of Syncfusion Essential JS 2 and more. +platform: document-processing +control: PDF Viewer +documentation: ug +domainurl: ##DomainURL## +--- + +# Organize Page Toolbar Customization in TypeScript PDF Viewer control + +The PDF Viewer allows you to customize the toolbar for the organize pages feature, enabling you to show or hide specific tools based on your application's requirements. The `pageOrganizerSettings` API provides properties to control the visibility of each tool in the organize pages dialog. + +## Show or hide the insert option + +The `canInsert` property controls the visibility of the insert tool. When set to `false`, the insert tool will be hidden from the toolbar. + +{% tabs %} +{% highlight ts tabtitle="Standalone" %} + +import { PdfViewer, Toolbar, Magnification, Navigation, Annotation, LinkAnnotation, ThumbnailView, BookmarkView, TextSelection, TextSearch, FormFields, FormDesigner, PageOrganizer} from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject(Toolbar, Magnification, Navigation, Annotation, LinkAnnotation, ThumbnailView, BookmarkView, TextSelection, TextSearch, FormFields, FormDesigner, PageOrganizer); + +let pdfviewer: PdfViewer = new PdfViewer(); +pdfviewer.documentPath = "https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf"; +pdfviewer.resourceUrl = "https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib"; +pdfviewer.pageOrganizerSettings = {canInsert: false}; +pdfviewer.appendTo('#PdfViewer'); + +{% endhighlight %} +{% highlight ts tabtitle="Server-Backed" %} + +import { PdfViewer, Toolbar, Magnification, Navigation, Annotation, LinkAnnotation, ThumbnailView, BookmarkView, TextSelection, TextSearch, FormFields, FormDesigner, PageOrganizer} from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject(Toolbar, Magnification, Navigation, Annotation, LinkAnnotation, ThumbnailView, BookmarkView, TextSelection, TextSearch, FormFields, FormDesigner, PageOrganizer); + +let pdfviewer: PdfViewer = new PdfViewer(); +pdfviewer.serviceUrl = 'https://document.syncfusion.com/web-services/pdf-viewer/api/pdfviewer/'; +pdfviewer.documentPath = "https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf"; +pdfviewer.pageOrganizerSettings = {canInsert: false}; +pdfviewer.appendTo('#PdfViewer'); + +{% endhighlight %} +{% endtabs %} + +## Show or hide the delete option + +The `canDelete` property controls the visibility of the delete tool. When set to `false`, the delete tool will be hidden. + +{% tabs %} +{% highlight ts tabtitle="Standalone" %} + +import { PdfViewer, Toolbar, Magnification, Navigation, Annotation, LinkAnnotation, ThumbnailView, BookmarkView, TextSelection, TextSearch, FormFields, FormDesigner, PageOrganizer} from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject(Toolbar, Magnification, Navigation, Annotation, LinkAnnotation, ThumbnailView, BookmarkView, TextSelection, TextSearch, FormFields, FormDesigner, PageOrganizer); + +let pdfviewer: PdfViewer = new PdfViewer(); +pdfviewer.documentPath = "https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf"; +pdfviewer.resourceUrl = "https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib"; +pdfviewer.pageOrganizerSettings = {canDelete: false}; +pdfviewer.appendTo('#PdfViewer'); + +{% endhighlight %} +{% highlight ts tabtitle="Server-Backed" %} + +import { PdfViewer, Toolbar, Magnification, Navigation, Annotation, LinkAnnotation, ThumbnailView, BookmarkView, TextSelection, TextSearch, FormFields, FormDesigner, PageOrganizer} from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject(Toolbar, Magnification, Navigation, Annotation, LinkAnnotation, ThumbnailView, BookmarkView, TextSelection, TextSearch, FormFields, FormDesigner, PageOrganizer); + +let pdfviewer: PdfViewer = new PdfViewer(); +pdfviewer.serviceUrl = 'https://document.syncfusion.com/web-services/pdf-viewer/api/pdfviewer/'; +pdfviewer.documentPath = "https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf"; +pdfviewer.pageOrganizerSettings = {canDelete: false}; +pdfviewer.appendTo('#PdfViewer'); + +{% endhighlight %} +{% endtabs %} + +## Show or hide the rotate option + +The `canRotate` property controls the visibility of the rotate tool. When set to `false`, the rotate tool will be hidden. + +{% tabs %} +{% highlight ts tabtitle="Standalone" %} + +import { PdfViewer, Toolbar, Magnification, Navigation, Annotation, LinkAnnotation, ThumbnailView, BookmarkView, TextSelection, TextSearch, FormFields, FormDesigner, PageOrganizer} from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject(Toolbar, Magnification, Navigation, Annotation, LinkAnnotation, ThumbnailView, BookmarkView, TextSelection, TextSearch, FormFields, FormDesigner, PageOrganizer); + +let pdfviewer: PdfViewer = new PdfViewer(); +pdfviewer.documentPath = "https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf"; +pdfviewer.resourceUrl = "https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib"; +pdfviewer.pageOrganizerSettings = {canRotate: false}; +pdfviewer.appendTo('#PdfViewer'); + +{% endhighlight %} +{% highlight ts tabtitle="Server-Backed" %} + +import { PdfViewer, Toolbar, Magnification, Navigation, Annotation, LinkAnnotation, ThumbnailView, BookmarkView, TextSelection, TextSearch, FormFields, FormDesigner, PageOrganizer} from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject(Toolbar, Magnification, Navigation, Annotation, LinkAnnotation, ThumbnailView, BookmarkView, TextSelection, TextSearch, FormFields, FormDesigner, PageOrganizer); + +let pdfviewer: PdfViewer = new PdfViewer(); +pdfviewer.serviceUrl = 'https://document.syncfusion.com/web-services/pdf-viewer/api/pdfviewer/'; +pdfviewer.documentPath = "https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf"; +pdfviewer.pageOrganizerSettings = {canRotate: false}; +pdfviewer.appendTo('#PdfViewer'); + +{% endhighlight %} +{% endtabs %} + +## Show or hide the copy option + +The `canCopy` property controls the visibility of the copy tool. When set to `false`, the copy tool will be hidden. + +## Show or hide the import option + +The `canImport` property controls the visibility of the import tool. When set to `false`, the import tool will be hidden. + +## Show or hide the rearrange option + +The `canRearrange` property controls the ability to rearrange pages. When set to `false`, pages cannot be rearranged. diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es6/organize-pdf/ui-interactions-organize-page.md b/Document-Processing/PDF/PDF-Viewer/javascript-es6/organize-pdf/ui-interactions-organize-page.md new file mode 100644 index 000000000..93bbb548a --- /dev/null +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es6/organize-pdf/ui-interactions-organize-page.md @@ -0,0 +1,97 @@ +--- +layout: post +title: UI Interactions for Organizing Pages in TypeScript PDF Viewer | Syncfusion +description: Learn about the UI interactions for organizing pages in the Syncfusion TypeScript PDF Viewer control, including rotating, rearranging, inserting, deleting, and copying pages. +platform: document-processing +control: PDF Viewer +documentation: ug +domainurl: ##DomainURL## +--- + +# UI Interactions for Organizing Pages in TypeScript PDF Viewer + +The PDF Viewer provides an intuitive user interface for managing and organizing pages within a PDF document. This section covers the various UI interactions available in the `Organize Pages` dialog. + + + +## Rotating PDF pages + +You can adjust the orientation of pages to ensure proper alignment. The rotate icon in the Organize Pages dialog provides the following options: + +* **Rotate clockwise**: Rotate the selected pages 90 degrees clockwise. +* **Rotate counter-clockwise**: Rotate the selected pages 90 degrees counter-clockwise. + +![Alt text](../images/rotate-rearrange.gif) + +## Rearranging PDF pages + +Easily change the sequence of pages using the drag-and-drop method: + +* **Drag and drop**: Click and drag a page thumbnail to the desired position within the document, then release it to reorder the pages. + +![Alt text](../images/rotate-rearrange.gif) + +## Inserting new pages + +Effortlessly add blank pages to your document with the following options: + +* **Insert blank page left**: Insert a blank page to the left of the selected page. +* **Insert blank page right**: Insert a blank page to the right of the selected page. + +![Alt text](../images/insert-delete-copy.gif) + +## Deleting PDF pages + +Remove unwanted pages from your document with these steps: + +1. **Select pages to delete**: Click on the thumbnails of the pages you wish to remove. You can select multiple pages at once. +2. **Delete selected pages**: Use the delete option in the Organize Pages pane to remove the selected pages from the document. + +![Alt text](../images/insert-delete-copy.gif) + +## Copying PDF pages + +Duplicate pages within your PDF document effortlessly: + +* **Select pages to copy**: Click on the page thumbnails you wish to duplicate. +* **Copy selected pages**: Use the copy option to create duplicates. The copied pages will be added to the right of the selected pages. + +![Alt text](../images/insert-delete-copy.gif) + +## Importing a PDF document + +Seamlessly import another PDF document into your current document: + +* **Import PDF document**: Click the **Import Document** button to select and import a PDF. The imported document will be inserted as a thumbnail. If a page is selected, the thumbnail will be added to its right. If no pages are selected, it will be added as the first page. The imported PDF will be merged with the current document upon saving. + +![Alt text](../images/import.gif) + +## Selecting all pages + +Select all pages simultaneously to perform bulk operations, such as rotating or deleting all pages at once. + +![Alt text](../images/selectall.png) + +## Zooming page thumbnails + +Adjust the size of page thumbnails for better visibility and precision: + +* Use the zoom slider to increase or decrease the thumbnail size. +* Zoom in to see more detail on each page. +* Zoom out to view more pages at once. + +![Alt text](../images/zoomOrganize.png) + +## Real-time updates and saving + +All changes are reflected instantly in the Organize Pages dialog. Click the **Save** button to apply the modifications to the document. Use the **Save As** feature to download a new version of the PDF with your changes. + +## Keyboard shortcuts + +The following keyboard shortcuts are available in the Organize Pages dialog: + +* **Ctrl+Z**: Undo the last action. +* **Ctrl+Y**: Redo the last undone action. +* **Ctrl+Scroll**: Zoom in and out on page thumbnails for better visibility. + +![Alt text](../images/undo-redo.png) diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es6/overview.md b/Document-Processing/PDF/PDF-Viewer/javascript-es6/overview.md index 203a5d91a..dcdb4261a 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es6/overview.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es6/overview.md @@ -1,42 +1,43 @@ --- -title: Overview of TypeScript PDF Viewer Component | Syncfusion -description: Checkout and learn about overview of the Syncfusion TypeScript PDF Viewer component and much more details. +layout: post +title: Overview of TypeScript PDF Viewer component | Syncfusion +description: Learn about the Syncfusion TypeScript PDF Viewer component, its key capabilities, and supported platforms. platform: document-processing control: PDF Viewer -documentation: UG +documentation: ug --- -# Overview of JavaScript PDF Viewer Component +# Overview of TypeScript PDF Viewer Control -The Syncfusion [`TypeScript PDF Viewer`](https://www.syncfusion.com/pdf-viewer-sdk) control enables you to view, annotate, prepare and fill forms, and print PDF files from your web applications. +The Syncfusion TypeScript PDF Viewer component enables users to view, annotate, prepare and fill forms, and print PDF files directly in web applications. ## Setup -To install PDF Viewer and its dependent packages, use the following command. +Install the PDF Viewer and its dependent packages with the following command. ``` npm install @syncfusion/ej2-pdfviewer ``` -## Key Features - -*[`View PDF Document`](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/getting-started) - Open and display both the normal and the protected PDF files with AES and RC4 encryption. -*[`Annotations`](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/annotations/text-markup-annotation) - Annotate with text markup, shapes, stamps, ink, and sticky notes.Form filling and form designing can be done. -*[`Form Fields`](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/form-designer/create-programmatically) - Form filling and form designing can be done. -*[`Signature`](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/annotations/signature-annotation) - Hand-written and digital signatures are allowed. -*[`Toolbar`](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/toolbar) - Built-in-toolbar and custom toolbars to perform user interaction of PDF Viewer functionalities. -*[`Navigation`](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/navigation) - Easy navigation with the help of bookmarks, thumbnails, hyperlinks, and table of contents. -*[`Magnification`](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/magnification) - Fit to page, fit to width, and automatic (fits to the visible area). -*[`Search`](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/text-search) - Search a text easily across the PDF document. -*[`Core Interactions`](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/interaction-mode) - Allows scrolling, zooming, panning, selection, and page navigation. -*[`Print`](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/print) - Print the entire document or a specific page directly from the browser. -*[`Globalization`](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/globalization) - Provides inherent support to localize the UI. - -## Supported Web platforms - -* [Javascript (ES5)](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started) +## Key features + +* [`View PDF document`](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/getting-started) – Open encrypted and standard PDF files with AES or RC4 protection. +* [`Annotations`](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/annotations/text-markup-annotation) – Add text markup, shapes, stamps, ink, and sticky notes. +* [`Form fields`](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/form-designer/create-programmatically) – Design and fill interactive forms. +* [`Signature`](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/annotations/signature-annotation) – Capture handwritten or digital signatures in the document. +* [`Toolbar`](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/toolbar) – Use the built-in toolbar or create custom toolbars for common interactions. +* [`Navigation`](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/navigation) – Navigate using bookmarks, thumbnails, hyperlinks, and the table of contents. +* [`Magnification`](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/magnification) – Adjust zoom with fit-to-page, fit-to-width, or automatic options. +* [`Search`](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/text-search) – Find text anywhere in the PDF document. +* [`Core interactions`](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/interaction-mode) – Scroll, zoom, pan, select, and navigate between pages. +* [`Print`](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/print) – Print the entire PDF or selected pages from the browser. +* [`Globalization`](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/globalization) – Localize the user interface for different languages and cultures. + +## Supported web platforms + +* [JavaScript (ES5)](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es5/getting-started) * [Angular](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/angular/getting-started) * [React](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/react/getting-started) * [Vue](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/vue/getting-started) * [ASP.NET Core](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/asp-net-core/getting-started) * [ASP.NET MVC](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/asp-net-mvc/getting-started) -* [Blazor](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/blazor/overview) \ No newline at end of file +* [Blazor](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/blazor/overview) diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es6/print.md b/Document-Processing/PDF/PDF-Viewer/javascript-es6/print.md index c93f05bff..c8c590766 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es6/print.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es6/print.md @@ -1,16 +1,17 @@ --- layout: post -title: Print in Typescript Pdfviewer control | Syncfusion -description: Learn here all about Print in Syncfusion Typescript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Print in TypeScript PDF Viewer | Syncfusion +description: Learn how to enable, customize, and monitor printing in the Syncfusion TypeScript PDF Viewer component. platform: document-processing control: Print -publishingplatform: Typescript documentation: ug domainurl: ##DomainURL## --- -# Print in Typescript Pdfviewer control +# Print in TypeScript PDF Viewer -The PDF Viewer supports printing the loaded PDF file. You can enable/disable the print using the following code snippet. +The Syncfusion TypeScript PDF Viewer component lets users print a loaded PDF document through the built-in toolbar or programmatic calls. Control whether printing is available by setting the `enablePrint` property. + +The following HTML and TypeScript examples render the PDF Viewer with printing enabled in standalone and server-backed applications. ```html @@ -65,9 +66,11 @@ pdfviewer.appendTo('#PdfViewer'); {% endhighlight %} {% endtabs %} -![Alt text](./images/print.png) +Select **Print** in the built-in toolbar to open the browser print dialog. + +![PDF Viewer print dialog preview](./images/print.png) -You can invoke print action using the following code snippet., +To start printing from code, call the `print.print()` method after loading a document. This approach is useful when you need to wire up custom UI or initiate printing automatically. {% tabs %} {% highlight ts tabtitle="Standalone" %} @@ -98,16 +101,15 @@ pdfviewer.print.print(); {% endhighlight %} {% endtabs %} -## Customizing Print Quality using printScaleFactor API +## Customize print quality using the printScaleFactor API -The PDF Viewer allows you to adjust the print quality using the [printScaleFactor](https://ej2.syncfusion.com/documentation/api/pdfviewer#printScaleFactor) API. The quality of the print improves as the print quality value increases from 0.5 to 5. +The PDF Viewer allows you to adjust the print rendering quality by setting the [printScaleFactor](https://ej2.syncfusion.com/documentation/api/pdfviewer#printScaleFactor) property. Valid values range from 0.5 to 5. Higher values produce sharper output but also increase rendering time. -When the value is less than 0.5, the PDF is printed at a standard quality. When the value exceeds 5, the PDF is still printed at the standard quality. In standard quality, printScaleFactor value is set to 1 as default value. -The effective range for print quality is between 0.5 and 5. Higher values within this range will result in better print quality, but also increase the print time. +By default, `printScaleFactor` is set to 1. -By default, the printScaleFactor is set to 1. +N> Values outside the 0.5–5 range revert to the standard print quality (value 1). -* **The following code snippet demonstrates how to customize print quality using the printScaleFactor API in the PDF Viewer.** +The following example demonstrates how to update the scale factor before printing. {% tabs %} {% highlight ts tabtitle="Standalone" %} @@ -136,9 +138,181 @@ pdfviewer.appendTo('#PdfViewer'); {% endhighlight %} {% endtabs %} +## Enable print rotation in the PDF Viewer + +Set the `enablePrintRotation` property to control whether landscape pages are rotated automatically to fit the paper orientation. Keep it enabled to minimize clipping, or disable it to preserve the original orientation. + +{% tabs %} +{% highlight ts tabtitle="Standalone" %} + +import { PdfViewer, Toolbar, Magnification, Navigation, Annotation, LinkAnnotation,ThumbnailView,BookmarkView, TextSelection} from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject(Toolbar,Magnification,Navigation, Annotation, LinkAnnotation,ThumbnailView,BookmarkView, TextSelection); + +let pdfviewer: PdfViewer = new PdfViewer({ + documentPath:'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + enablePrintRotation: true +}); +pdfviewer.appendTo('#PdfViewer'); + +{% endhighlight %} +{% highlight ts tabtitle="Server-Backed" %} + +import { PdfViewer, Toolbar, Magnification, Navigation, Annotation, LinkAnnotation,ThumbnailView,BookmarkView, TextSelection} from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject(Toolbar,Magnification,Navigation, Annotation, LinkAnnotation,ThumbnailView,BookmarkView, TextSelection); + +let pdfviewer: PdfViewer = new PdfViewer({ + documentPath:'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + serviceUrl: 'https://document.syncfusion.com/web-services/pdf-viewer/api/pdfviewer/', + enablePrintRotation: true +}); +pdfviewer.appendTo('#PdfViewer'); + +{% endhighlight %} +{% endtabs %} + +## Print modes in the PDF Viewer + +Use the `printMode` property to choose how the document is printed. + +The supported values are: +* `Default`: Prints the document from the same window. +* `NewWindow`: Prints the document from a new window or tab, which can help with browser pop-up policies. + +N> Browser pop-up blockers must allow new windows or tabs when you use `PrintMode.NewWindow`. + +The following example shows how to set the print mode. +{% tabs %} +{% highlight ts tabtitle="Standalone" %} + +import { PdfViewer, Toolbar, Magnification, Navigation, Annotation, LinkAnnotation,ThumbnailView,BookmarkView, TextSelection, PrintMode} from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject(Toolbar,Magnification,Navigation, Annotation, LinkAnnotation,ThumbnailView,BookmarkView, TextSelection); + +let pdfviewer: PdfViewer = new PdfViewer({ + documentPath:'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + printMode: PrintMode.NewWindow +}); +pdfviewer.appendTo('#PdfViewer'); + +{% endhighlight %} +{% highlight ts tabtitle="Server-Backed" %} + +import { PdfViewer, Toolbar, Magnification, Navigation, Annotation, LinkAnnotation,ThumbnailView,BookmarkView, TextSelection, PrintMode} from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject(Toolbar,Magnification,Navigation, Annotation, LinkAnnotation,ThumbnailView,BookmarkView, TextSelection); + +let pdfviewer: PdfViewer = new PdfViewer({ + documentPath:'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + serviceUrl: 'https://document.syncfusion.com/web-services/pdf-viewer/api/pdfviewer/', + printMode: PrintMode.NewWindow +}); +pdfviewer.appendTo('#PdfViewer'); + +{% endhighlight %} +{% endtabs %} + [View sample in GitHub](https://github.com/SyncfusionExamples/typescript-pdf-viewer-examples/tree/master/How%20to/Customization%20%20of%20Print%20Quality) +## Print events + +Subscribe to print lifecycle events to track usage and implement custom workflows. + +| Name | Description | +|--------------|-------------| +| `printStart` | Raised when a print action begins. Use the event to log activity or cancel printing. | +| `printEnd` | Raised after a print action completes. Use the event to notify users or clean up resources. | + +### printStart event +The [`printStart`](https://ej2.syncfusion.com/documentation/api/pdfviewer/#printstart) event runs when printing starts from the toolbar or from code. Use it to validate prerequisites or cancel the action. + +#### Event arguments +Review [`PrintStartEventArgs`](https://ej2.syncfusion.com/documentation/api/pdfviewer/printStartEventArgs/) for details such as `fileName` and the `cancel` option. + +The following example logs the file that is being printed and shows how to cancel the operation. + +{% tabs %} +{% highlight ts tabtitle="Standalone" %} + +import { PdfViewer, PrintStartEventArgs, Toolbar, Magnification, Navigation, Annotation, LinkAnnotation,ThumbnailView,BookmarkView, TextSelection } from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject(Toolbar,Magnification,Navigation, Annotation, LinkAnnotation,ThumbnailView,BookmarkView, TextSelection); + +let pdfviewer: PdfViewer = new PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + printStart: (args: PrintStartEventArgs) => { + console.log('Print action has started for file: ' + args.fileName); + // To cancel the print action + // args.cancel = true; + } +}); +pdfviewer.appendTo('#PdfViewer'); + +{% endhighlight %} +{% highlight ts tabtitle="Server-Backed" %} + +import { PdfViewer, PrintStartEventArgs, Toolbar, Magnification, Navigation, Annotation, LinkAnnotation,ThumbnailView,BookmarkView, TextSelection } from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject(Toolbar,Magnification,Navigation, Annotation, LinkAnnotation,ThumbnailView,BookmarkView, TextSelection); + +let pdfviewer: PdfViewer = new PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + serviceUrl: 'https://document.syncfusion.com/web-services/pdf-viewer/api/pdfviewer/', + printStart: (args: PrintStartEventArgs) => { + console.log('Print action has started for file: ' + args.fileName); + // To cancel the print action + // args.cancel = true; + } +}); +pdfviewer.appendTo('#PdfViewer'); + +{% endhighlight %} +{% endtabs %} + +### printEnd event +The [`printEnd`](https://ej2.syncfusion.com/documentation/api/pdfviewer/#printend) event triggers after printing completes. Use it to finalize analytics or inform users that printing finished. + +#### Event arguments +See [`PrintEndEventArgs`](https://ej2.syncfusion.com/documentation/api/pdfviewer/printEndEventArgs/) for available values such as `fileName`. + +The following example logs the printed file name. + +{% tabs %} +{% highlight ts tabtitle="Standalone" %} + +import { PdfViewer, PrintEndEventArgs, Toolbar, Magnification, Navigation, Annotation, LinkAnnotation,ThumbnailView,BookmarkView, TextSelection } from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject(Toolbar,Magnification,Navigation, Annotation, LinkAnnotation,ThumbnailView,BookmarkView, TextSelection); + +let pdfviewer: PdfViewer = new PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + printEnd: (args: PrintEndEventArgs) => { + console.log('Printed File Name: ' + args.fileName); + } +}); +pdfviewer.appendTo('#PdfViewer'); + +{% endhighlight %} +{% highlight ts tabtitle="Server-Backed" %} + +import { PdfViewer, PrintEndEventArgs, Toolbar, Magnification, Navigation, Annotation, LinkAnnotation,ThumbnailView,BookmarkView, TextSelection } from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject(Toolbar,Magnification,Navigation, Annotation, LinkAnnotation,ThumbnailView,BookmarkView, TextSelection); + +let pdfviewer: PdfViewer = new PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + serviceUrl: 'https://document.syncfusion.com/web-services/pdf-viewer/api/pdfviewer/', + printEnd: (args: PrintEndEventArgs) => { + console.log('Printed File Name: ' + args.fileName); + } +}); +pdfviewer.appendTo('#PdfViewer'); + +{% endhighlight %} +{% endtabs %} + ## See also * [Toolbar items](./toolbar) -* [Feature Modules](./feature-module) \ No newline at end of file +* [Feature Modules](./feature-module) diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es6/save-pdf-file/to-amazon-s3.md b/Document-Processing/PDF/PDF-Viewer/javascript-es6/save-pdf-file/to-amazon-s3.md index ca410866f..c22b2812f 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es6/save-pdf-file/to-amazon-s3.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es6/save-pdf-file/to-amazon-s3.md @@ -1,17 +1,15 @@ --- layout: post -title: Save PDF files to AWS S3 Typescript Pdfviewer control | Syncfusion -description: Learn here all about how to Save PDF files to AWS S3 in Syncfusion Typescript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Save PDF files to AWS S3 in TypeScript PDF Viewer | Syncfusion +description: Learn how to save PDF files to AWS S3 using the Syncfusion TypeScript PDF Viewer component in standalone and server-backed configurations. platform: document-processing -control: Save PDF files to AWS S3 -publishingplatform: Typescript +control: PDF Viewer documentation: ug -domainurl: ##DomainURL## --- -# Save PDF file to AWS S3 +# Save PDF files to AWS S3 -PDF Viewer allows to save PDF file to AWS S3 using either the Standalone or Server-backed PDF Viewer. Below are the steps and a sample to demonstrate how to save PDF to AWS S3. +The TypeScript PDF Viewer component supports saving PDF files to AWS S3 using either the standalone or server-backed configuration. The following steps demonstrate both approaches. ## Using Standalone PDF Viewer @@ -21,7 +19,7 @@ To save a PDF file to AWS S3, you can follow the steps below: Follow the instructions provided in this [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/getting-started) to create a simple PDF Viewer sample in typescript. This will set up the basic structure of your PDF Viewer application. -**Step 2:** Modify the `src/app/app.ts` File in the Angular Project +**Step 2:** Modify the `src/app/app.ts` file in the Angular project 1. Import the required namespaces at the top of the file: @@ -29,7 +27,7 @@ Follow the instructions provided in this [link](https://help.syncfusion.com/docu import * as AWS from 'aws-sdk'; ``` -2. Configures AWS SDK with the region, access key, and secret access key. This configuration allows the application to interact with AWS services like S3. +2. Configure the AWS SDK with the region, access key, and secret access key. This enables the application to interact with AWS services such as S3. N> Replace **Your Region** with the actual Region of your AWS S3 account and **Your Access Key** with the actual Access Key of your AWS S3 account and **Your Security Access Key** with the actual Security Access Key of your AWS S3 account. @@ -41,7 +39,7 @@ AWS.config.update({ }); ``` -3. Configure a custom toolbar item for the download function to save a PDF file in Azure Blob Storage. +3. Configure a custom toolbar item for the download function to save a PDF file to AWS S3. ```typescript let toolItem1: CustomToolbarItemModel = { @@ -60,7 +58,7 @@ pdfviewer.toolbarClick = function (args) { }; ``` -4. Retrieve the PDF viewer instance and save the current PDF as a Blob. Then, read the Blob using a FileReader to convert it into an ArrayBuffer, and upload the ArrayBuffer to AWS S3 using the putObject method of the S3 instance. +4. Retrieve the PDF Viewer instance, save the current PDF as a Blob, read it using FileReader to get an ArrayBuffer, and upload the ArrayBuffer to AWS S3 using the `putObject` method. N> Replace **Your Bucket Name** with the actual Bucket name of your AWS S3 account and **Your Key** with the actual File Key of your AWS S3 account. @@ -91,11 +89,11 @@ function saveDocument() { } ``` -N> The **npm install aws-sdk** package must be installed in your application to use the previous code example. +N> Install the aws-sdk package in the application to use the previous code example: npm install aws-sdk [View sample in GitHub](https://github.com/SyncfusionExamples/open-save-pdf-documents-in-aws-s3/tree/master/Open%20and%20Save%20PDF%20in%20AWS%20S3%20using%20Standalone). -## Using Server-Backed PDF Viewer +## Using server-backed PDF Viewer To save a PDF file to AWS S3, you can follow the steps below: @@ -103,9 +101,9 @@ To save a PDF file to AWS S3, you can follow the steps below: Follow the instructions provided in this [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/getting-started) to create a simple PDF Viewer sample in typescript. This will set up the basic structure of your PDF Viewer application. -**Step 2:** Modify the `PdfViewerController.cs` File in the Web Service Project +**Step 2:** Modify the `PdfViewerController.cs` file in the web service project -1. Create a web service project in .NET Core 3.0 or above. You can refer to this [link](https://www.syncfusion.com/kb/11063/how-to-create-pdf-viewer-web-service-in-net-core-3-0-and-above) for instructions on how to create a web service project. +1. Create a web service project in .NET Core 3.0 or later. For instructions, see this article: https://www.syncfusion.com/kb/11063/how-to-create-pdf-viewer-web-service-in-net-core-3-0-and-above 2. Open the `PdfViewerController.cs` file in your web service project. @@ -137,7 +135,7 @@ public PdfViewerController(IWebHostEnvironment hostingEnvironment, IMemoryCache } ``` -5. Modify the [Download()](https://ej2.syncfusion.com/documentation/api/pdfviewer/#download) method to save the downloaded PDF files to AWS S3 bucket +5. Modify the [Download()](https://ej2.syncfusion.com/documentation/api/pdfviewer/#download) method to save the downloaded PDF file to the AWS S3 bucket. ```csharp @@ -174,7 +172,7 @@ public IActionResult Download([FromBody] Dictionary jsonObject) } ``` -6. Open the `appsettings.json` file in your web service project, Add the following lines below the existing `"AllowedHosts"` configuration +6. Open the `appsettings.json` file in the web service project and add the following lines below the existing `"AllowedHosts"` configuration. ```json { @@ -191,11 +189,11 @@ public IActionResult Download([FromBody] Dictionary jsonObject) } ``` -N> Replace **Your Access Key from AWS S3**, **Your Secret Key from AWS S3**, and **Your Bucket name from AWS S3** with your actual AWS access key, secret key and bucket name +N> Replace the placeholders with the actual AWS access key, secret key, and bucket name. -**Step 3:** Set the PDF Viewer Properties in Typescript PDF viewer component +**Step 3:** Set the PDF Viewer properties in the TypeScript PDF Viewer component -Modify the [serviceUrl](https://ej2.syncfusion.com/documentation/api/pdfviewer/#serviceurl) property of the PDF viewer component with the accurate URL of your web service project, replacing `https://localhost:44396/pdfviewer` with the actual URL of your server. Set the `documentPath` property of the PDF viewer component to the desired name of the PDF file you wish to load from AWS S3. Ensure that you correctly pass the document name from the files available in your AWS S3 bucket to the documentPath property. +Modify the [serviceUrl](https://ej2.syncfusion.com/documentation/api/pdfviewer/#serviceurl) property of the PDF Viewer component with the accurate URL of the web service, replacing `https://localhost:44396/pdfviewer` with the actual server URL. Set the `documentPath` property to the desired PDF file name to load from AWS S3, and ensure that the document exists in the target bucket. ```typescript @@ -213,6 +211,6 @@ viewer.load('PDF_Succinctly.pdf', null); ``` -N> The **AWSSDK.S3** NuGet package must be installed in your application to use the previous code example. +N> Install the AWSSDK.S3 NuGet package in the web service application to use the previous code example. [View sample in GitHub](https://github.com/SyncfusionExamples/open-save-pdf-documents-in-aws-s3/tree/master/Open%20and%20Save%20PDF%20in%20AWS%20S3%20using%20Server-Backend) \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es6/save-pdf-file/to-azure-active-directory.md b/Document-Processing/PDF/PDF-Viewer/javascript-es6/save-pdf-file/to-azure-active-directory.md index 1f005eb3e..682a74a4a 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es6/save-pdf-file/to-azure-active-directory.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es6/save-pdf-file/to-azure-active-directory.md @@ -1,36 +1,34 @@ --- layout: post -title: Save PDF To AAD Typescript Pdfviewer | Syncfusion -description: Learn how to Save PDF To AAD in Syncfusion Typescript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Save PDF files to Azure Active Directory (AAD) in TypeScript PDF Viewer | Syncfusion +description: Learn how to load and save PDF files with Azure Active Directory (AAD) using the Syncfusion TypeScript PDF Viewer component and a server-backed web service. platform: document-processing control: PDF Viewer -publishingplatform: Typescript documentation: ug -domainurl: ##DomainURL## --- -# Save PDF To Azure Active Directory in Viewer +# Save PDF files to Azure Active Directory (AAD) -### **Overview** +### Overview -The Syncfusion PDF Viewer allows you to load and save PDF files directly from Azure Active Directory (AAD). Below are the steps to securely load and store PDF documents from and to AAD using the PDF Viewer. +The TypeScript PDF Viewer component supports loading and saving PDF files with Azure Active Directory (AAD). The following steps describe how to securely load and store PDF documents using a server-backed web service. -### **Steps to Open the PDF File from Azure Active Directory** +### Steps to open the PDF file from Azure Active Directory --- -### **Step 1: Register an Application in Azure Active Directory (AAD)** +### Step 1: Register an application in Azure Active Directory (AAD) -1. **Go to the Azure Portal**: +1. Go to the Azure portal: - Navigate to [Azure Portal](https://portal.azure.com). -2. **Register your Application**: +2. Register the application: - In the Azure portal, go to **Azure Active Directory** > **App registrations** > **New registration**. - Register your application and note down the **Application (client) ID** and **Directory (tenant) ID**. ![app-registration](../images/app-registration.png) -3. **Create a Client Secret**: +3. Create a client secret: - In the registered application, go to **Certificates & secrets**. - Click **New client secret**. - Provide a description and set an expiration period. @@ -41,9 +39,9 @@ The Syncfusion PDF Viewer allows you to load and save PDF files directly from Az --- -### **Step 2: Create the Azure Storage Account** +### Step 2: Create the Azure Storage account -1. **Create a Storage Account**: +1. Create a storage account: - In the Azure portal, use the search bar to search for **Storage accounts**. - Create a new storage account by filling in the required details (e.g., name, location, resource group, etc.). @@ -51,12 +49,12 @@ The Syncfusion PDF Viewer allows you to load and save PDF files directly from Az --- -### **Step 3: Assign Role to the Application** +### Step 3: Assign a role to the application -1. **Go to your Storage Account**: +1. Go to the storage account: - Navigate to **Access control (IAM)** > **Add role assignment** in your Azure Storage Account. -2. **Assign Role**: +2. Assign a role: - Assign the **Storage Blob Data Contributor** role to your registered application. - In the **Assign access to** dropdown, select **User, group, or service principal**. - Click on **Select members** and search for your registered application by name or client ID. @@ -66,20 +64,20 @@ The Syncfusion PDF Viewer allows you to load and save PDF files directly from Az ![add-role](../images/add-role.png) --- -### **Step 4: Upload the PDF Document to the Azure Storage Account** +### Step 4: Upload the PDF document to Azure Storage -1. **Navigate to Data Storage**: +1. Navigate to Data storage: - In the Azure portal, go to **Data storage** > **Containers**. -2. **Upload the PDF File**: +2. Upload the PDF file: - Create a new container and upload the PDF document you want to access in the PDF Viewer. ![upload-pdf](../images/upload-pdf.png) --- -### **Step 5: Server-Side Configuration** +### Step 5: Server-side configuration -1. **Configure Server-Side Code**: +1. Configure server-side code: - Open the server-side application (e.g., ASP.NET Core) and configure the following details in the `PdfViewerController` file: - `tenantId` (your Azure AD tenant ID), - `clientId` (your registered application client ID), @@ -87,34 +85,34 @@ The Syncfusion PDF Viewer allows you to load and save PDF files directly from Az - `blobServiceEndpoint` (your storage account blob service URL), - `containerName` (your container name in Azure Blob Storage). -2. **Run the Web Service**: +2. Run the web service: - After configuring the necessary details, run the web service to make it accessible. --- -### **Step 6: Client-Side Configuration** +### Step 6: Client-side configuration -1. **Run the TS Sample**: - - Start the TS sample that includes the Syncfusion PDF Viewer. +1. Run the TypeScript sample: + - Start the TypeScript sample that includes the Syncfusion PDF Viewer. -2. **Load PDF from AAD**: +2. Load a PDF from AAD: - When the user clicks the **Load from AAD** button, the JS client will make an HTTP request to the server-side API to fetch the PDF from Azure Blob Storage. - The server will retrieve the PDF from Azure, convert it to a base64 string, and return it to the client. -3. **Display PDF in the PDF Viewer**: +3. Display the PDF in the PDF Viewer: - Once the base64 string is received, the PDF Viewer will load the PDF using the `viewer.load()` method. --- -### **Step 7: Save the PDF Document to Azure** +### Step 7: Save the PDF document to Azure -1. **Save PDF to AAD**: +1. Save PDF to AAD: - The user can click the **Save to AAD** button to upload any modifications to the PDF back to Azure Blob Storage. - This action sends the modified PDF to the server, where it is converted into a byte array and saved to the specified Azure Blob container. --- -### **Server-Side Code Snippets** +### Server-side code snippets ```cs string tenantId = "Provide the tenant id here"; string clientId = "Provide the clientid here"; @@ -170,7 +168,7 @@ public async Task SaveToAAD([FromBody] Dictionary -### **Client-side Code Snippets** +### Client-side code snippets ```ts import { PdfViewer, Toolbar, TextSelection, TextSearch, Print, Navigation, Magnification, Annotation, FormDesigner, FormFields, CustomToolbarItemModel } from '@syncfusion/ej2-pdfviewer'; diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es6/save-pdf-file/to-azure-blob-storage.md b/Document-Processing/PDF/PDF-Viewer/javascript-es6/save-pdf-file/to-azure-blob-storage.md index 8034bd1c7..72bcfe2f2 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es6/save-pdf-file/to-azure-blob-storage.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es6/save-pdf-file/to-azure-blob-storage.md @@ -1,27 +1,25 @@ --- layout: post -title: Save PDF to Azure Blob Storage Typescript Pdfviewer | Syncfusion -description: Learn here all about how to Save PDF files to Azure Blob Storage in Syncfusion Typescript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Save PDF files to Azure Blob Storage in TypeScript PDF Viewer | Syncfusion +description: Learn how to save PDF files to Azure Blob Storage using the Syncfusion TypeScript PDF Viewer component in standalone and server-backed configurations. platform: document-processing -control: Save PDF files to Azure Blob Storage -publishingplatform: Typescript +control: PDF Viewer documentation: ug -domainurl: ##DomainURL## --- -# Save PDF file to Azure Blob Storage +# Save PDF files to Azure Blob Storage -PDF Viewer allows to save PDF file to Azure Blob Storage using either the Standalone or Server-backed PDF Viewer. Below are the steps and a sample to demonstrate how to save PDF to Azure Blob Storage. +The TypeScript PDF Viewer component supports saving PDF files to Azure Blob Storage using either the standalone or server-backed configuration. The following steps demonstrate both approaches. ## Using Standalone PDF Viewer -To save a PDF file to Azure Blob Storage, you can follow the steps below +To save a PDF file to Azure Blob Storage, follow these steps: -**Step 1:** Create a PDF Viewer sample in Typescript +**Step 1:** Create a PDF Viewer sample in TypeScript -Follow the instructions provided in this [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/getting-started) to create a simple PDF Viewer sample in Typescript. This will set up the basic structure of your PDF Viewer application. +Follow the instructions provided in this [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/getting-started) to create a simple PDF Viewer sample in TypeScript. This sets up the basic structure of the PDF Viewer application. -**Step 2:** Modify the `src/app/app.ts` File in the Angular Project +**Step 2:** Modify the `src/app/app.ts` file in the Angular project 1. Import the required namespaces at the top of the file: @@ -29,15 +27,15 @@ Follow the instructions provided in this [link](https://help.syncfusion.com/docu import { BlockBlobClient } from "@azure/storage-blob"; ``` -2. Add the following private properties to the `app.ts`, and assign the values from the configuration to the corresponding properties +2. Add the following private property to `app.ts`, and assign the value from the configuration to the corresponding property. -N> Replace **Your SAS Url in Azure** with the actual SAS url for your Azure Blob Storage account. +N> Replace **Your SAS Url in Azure** with the actual SAS URL for the Azure Blob Storage account. ```typescript private SASUrl: string = "*Your SAS Url in Azure*"; ``` -3. Configure a custom toolbar item for the download function to save a PDF file in Azure Blob Storage. +3. Configure a custom toolbar item for the download function to save a PDF file to Azure Blob Storage. ```typescript let toolItem1: CustomToolbarItemModel = { @@ -56,7 +54,7 @@ pdfviewer.toolbarClick = function (args) { }; ``` -4. Retrieve the PDF viewer instance and save the current PDF as a Blob. Then, read the Blob as an ArrayBuffer and upload the ArrayBuffer to Azure Blob Storage using 'BlockBlobClient'. +4. Retrieve the PDF Viewer instance and save the current PDF as a Blob. Then, read the Blob as an ArrayBuffer and upload the ArrayBuffer to Azure Blob Storage using `BlockBlobClient`. ```typescript function saveDocument() { @@ -76,21 +74,21 @@ function saveDocument() { }; ``` -N> The **npm install @azure/storage-blob** package must be installed in your application to use the previous code example. +N> Install the @azure/storage-blob package in the application to use the previous code example: npm install @azure/storage-blob [View sample in GitHub](https://github.com/SyncfusionExamples/open-save-pdf-documents-in-azure-blob-storage/tree/master/Open%20and%20Save%20PDF%20in%20Azure%20Blob%20Storage%20using%20Standalone). -## Using Server-Backed PDF Viewer +## Using server-backed PDF Viewer To save a PDF file to Azure Blob Storage, you can follow the steps below -**Step 1:** Create a PDF Viewer sample in Typescript +**Step 1:** Create a PDF Viewer sample in TypeScript -Follow the instructions provided in this [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/getting-started) to create a simple PDF Viewer sample in Typescript. This will set up the basic structure of your PDF Viewer application. +Follow the instructions provided in this [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/getting-started) to create a simple PDF Viewer sample in TypeScript. This sets up the basic structure of the PDF Viewer application. -**Step 2:** Modify the `PdfViewerController.cs` File in the Web Service Project +**Step 2:** Modify the `PdfViewerController.cs` file in the web service project -1. Create a web service project in .NET Core 3.0 or above. You can refer to this [link](https://www.syncfusion.com/kb/11063/how-to-create-pdf-viewer-web-service-in-net-core-3-0-and-above) for instructions on how to create a web service project. +1. Create a web service project in .NET Core 3.0 or later. For instructions, see this article: https://www.syncfusion.com/kb/11063/how-to-create-pdf-viewer-web-service-in-net-core-3-0-and-above 2. Open the `PdfViewerController.cs` file in your web service project. @@ -117,7 +115,7 @@ public PdfViewerController(IConfiguration configuration, ILogger jsonObject) } ``` -6. Open the `appsettings.json` file in your web service project, Add the following lines below the existing `"AllowedHosts"` configuration +6. Open the `appsettings.json` file in the web service project and add the following lines below the existing `"AllowedHosts"` configuration. ```json { @@ -169,11 +167,11 @@ public IActionResult Download([FromBody] Dictionary jsonObject) } ``` -N> Replace **Your Connection string from Azure** with the actual connection string for your Azure Blob Storage account and **Your container name in Azure** with the actual container name +N> Replace the placeholders with the actual Azure Storage connection string and container name. -**Step 3:** Set the PDF Viewer Properties in JavaScript PDF viewer component +**Step 3:** Set the PDF Viewer properties in the TypeScript PDF Viewer component -Modify the [serviceUrl](https://ej2.syncfusion.com/documentation/api/pdfviewer/#serviceurl) property of the PDF viewer component with the accurate URL of your web service project, replacing `https://localhost:44396/pdfviewer` with the actual URL of your server. Set the `documentPath` property of the PDF viewer component to the desired name of the PDF file you wish to load from Azure Blob Storage. Ensure that you correctly pass the document name from the files available in your azure contanier to the documentPath property. +Modify the [serviceUrl](https://ej2.syncfusion.com/documentation/api/pdfviewer/#serviceurl) property of the PDF Viewer component with the accurate URL of the web service, replacing `https://localhost:44396/pdfviewer` with the actual server URL. Set the `documentPath` property to the desired PDF file name to load from Azure Blob Storage, and ensure that the document exists in the target container. ```typescript import { PdfViewer, Toolbar, Magnification, Navigation, LinkAnnotation,ThumbnailView, @@ -190,6 +188,6 @@ viewer.load('PDF_Succinctly.pdf', null); ``` -N> The **Azure.Storage.Blobs** NuGet package must be installed in your application to use the previous code example. +N> Install the Azure.Storage.Blobs NuGet package in the web service application to use the previous code example. [View sample in GitHub](https://github.com/SyncfusionExamples/open-save-pdf-documents-in-azure-blob-storage/tree/master/Open%20and%20Save%20PDF%20in%20Azure%20Blob%20Storage%20using%20Server-Backend). \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es6/save-pdf-file/to-box-cloud-file-storage.md b/Document-Processing/PDF/PDF-Viewer/javascript-es6/save-pdf-file/to-box-cloud-file-storage.md index 60783cf88..75ad0d150 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es6/save-pdf-file/to-box-cloud-file-storage.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es6/save-pdf-file/to-box-cloud-file-storage.md @@ -1,27 +1,25 @@ --- layout: post -title: Save PDF files to Box cloud file storage Typescript Pdfviewer control | Syncfusion -description: Learn here all about how to Save PDF files to Box cloud file storage in Syncfusion Typescript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Save PDF files to Box cloud storage in TypeScript PDF Viewer | Syncfusion +description: Learn how to save PDF files to Box cloud storage using the Syncfusion TypeScript PDF Viewer component with a server-backed web service. platform: document-processing -control: Save PDF files to Box cloud file storage -publishingplatform: Typescript +control: PDF Viewer documentation: ug -domainurl: ##DomainURL## --- -# Save PDF file to Box cloud file storage +# Save PDF files to Box cloud storage To save a PDF file to Box cloud file storage, you can follow the steps below: -**Step 1** Set up a Box developer account and create a Box application +**Step 1:** Set up a Box developer account and create a Box application To access Box storage programmatically, you'll need a developer account with Box. Go to the [Box Developer Console](https://developer.box.com/), sign in or create a new account, and then create a new Box application. This application will provide you with the necessary credentials Client ID and Client Secret to authenticate and access Box APIs. Before accessing files, you need to authenticate your application to access your Box account. Box API supports `OAuth 2.0 authentication` for this purpose. **Step 2:** Create a PDF Viewer sample in TypeScript -Follow the instructions provided in this [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/getting-started) to create a simple PDF Viewer sample in typescript. This will set up the basic structure of your PDF Viewer application. +Follow the instructions provided in this [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/getting-started) to create a simple PDF Viewer sample in TypeScript. This sets up the basic structure of the PDF Viewer application. -**Step 3:** Modify the `PdfViewerController.cs` File in the Web Service Project +**Step 3:** Modify the `PdfViewerController.cs` file in the web service project 1. Create a web service project in .NET Core 3.0 or above. You can refer to this [link](https://www.syncfusion.com/kb/11063/how-to-create-pdf-viewer-web-service-in-net-core-3-0-and-above) for instructions on how to create a web service project. @@ -36,7 +34,7 @@ using Box.V2.Config; using Box.V2.Models; ``` -4. Add the following private fields and constructor parameters to the `PdfViewerController` class, In the constructor, assign the values from the configuration to the corresponding fields +4. Add the following private fields and constructor parameters to the `PdfViewerController` class. In the constructor, assign configuration values to the corresponding fields. ```csharp private IConfiguration _configuration; @@ -57,7 +55,7 @@ public PdfViewerController(IWebHostEnvironment hostingEnvironment, IMemoryCache } ``` -5. Modify the [Download()](https://ej2.syncfusion.com/documentation/api/pdfviewer/#download) method to save the downloaded PDF files to Box cloud file storage bucket +5. Modify the [Download()](https://ej2.syncfusion.com/documentation/api/pdfviewer/#download) method to save the downloaded PDF file to the Box cloud storage folder. ```csharp [HttpPost("Download")] @@ -96,7 +94,7 @@ public async Task Download([FromBody] Dictionary } ``` -6. Open the `appsettings.json` file in your web service project, Add the following lines below the existing `"AllowedHosts"` configuration +6. Open the `appsettings.json` file in the web service project and add the following lines below the existing `"AllowedHosts"` configuration. ```json { @@ -114,11 +112,11 @@ public async Task Download([FromBody] Dictionary } ``` -N> replace **Your_Box_Storage_Access_Token** with your actual box access token, and **Your_Folder_ID** with the ID of the folder in your box storage where you want to perform specific operations. Remember to use your valid box API credentials, as **Your_Box_Storage_ClientID** and **Your_Box_Storage_ClientSecret"** are placeholders for your application's API key and secret. +N> Replace the placeholders with the actual Box access token, folder ID, client ID, and client secret. -**Step 4:** Set the PDF Viewer Properties in Typescript PDF viewer component +**Step 4:** Set the PDF Viewer properties in the TypeScript PDF Viewer component -Modify the `serviceUrl` property of the PDF viewer component with the accurate URL of your web service project, replacing `https://localhost:44396/pdfviewer` with the actual URL of your server. Set the `documentPath` property of the PDF viewer component to the desired name of the PDF file you wish to load from Box cloud file storage. Ensure that you correctly pass the document name from the files available in your box folder to the documentPath property. +Modify the `serviceUrl` property of the PDF Viewer component with the accurate URL of the web service, replacing `https://localhost:44396/pdfviewer` with the actual server URL. Set the `documentPath` property to the desired PDF file name to load from Box cloud storage, and ensure that the document exists in the target folder. ```typescript @@ -136,8 +134,8 @@ viewer.load('PDF_Succinctly.pdf', null); ``` -N> The **Box.V2.Core** NuGet package must be installed in your application to use the previous code example. +N> Install the Box.V2.Core NuGet package in the web service application to use the previous code example. -N> Replace `PDF_Succinctly.pdf` with the actual document name that you want to load from Box cloud file storage. Make sure to pass the document name from the box folder to the `documentPath` property of the PDF viewer component +N> Replace `PDF_Succinctly.pdf` with the actual document name to load from Box cloud storage. Pass the document name from the Box folder to the `documentPath` property of the PDF Viewer component. [View sample in GitHub](https://github.com/SyncfusionExamples/open-save-pdf-documents-in-box-cloud-file-storage) \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es6/save-pdf-file/to-dropbox-cloud-file-storage.md b/Document-Processing/PDF/PDF-Viewer/javascript-es6/save-pdf-file/to-dropbox-cloud-file-storage.md index 09ec4c749..273990c16 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es6/save-pdf-file/to-dropbox-cloud-file-storage.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es6/save-pdf-file/to-dropbox-cloud-file-storage.md @@ -1,31 +1,29 @@ --- layout: post -title: Save PDF to Dropbox cloud storage Typescript Pdfviewer | Syncfusion -description: Learn here all about how to Save PDF to Dropbox cloud file storage in Syncfusion Typescript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Save PDF files to Dropbox in TypeScript PDF Viewer | Syncfusion +description: Learn how to save PDF files to Dropbox using the Syncfusion TypeScript PDF Viewer component in standalone and server-backed configurations. platform: document-processing -control: Save PDF files to Dropbox cloud file storage -publishingplatform: Typescript +control: PDF Viewer documentation: ug -domainurl: ##DomainURL## --- -# Save PDF file to Dropbox cloud file storage +# Save PDF files to Dropbox cloud storage -PDF Viewer allows to load PDF file from Drop Box using either the Standalone or Server-backed PDF Viewer. Below are the steps and a sample to demonstrate how to open a PDF from Drop Box. +The TypeScript PDF Viewer component supports saving PDF files to Dropbox using either the standalone or server-backed configuration. The following steps demonstrate both approaches. ## Using Standalone PDF Viewer -To load a PDF file from Dropbox cloud file storage in a PDF Viewer, you can follow the steps below +To save a PDF file to Dropbox, follow these steps: -**Step 1** Create a Dropbox API +**Step 1:** Create a Dropbox API app To create a Dropbox API App, you should follow the official documentation provided by Dropbox [link](https://www.dropbox.com/developers/documentation/dotnet#tutorial). The process involves visiting the Dropbox Developer website and using their App Console to set up your API app. This app will allow you to interact with Dropbox programmatically, enabling secure access to files and data. -**Step 2:** Create a Simple PDF Viewer Sample in Typescript +**Step 2:** Create a Simple PDF Viewer Sample in TypeScript -Start by following the steps provided in this [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/getting-started) to create a simple PDF viewer sample in Typescript. This will give you a basic setup of the PDF viewer component. +Follow the instructions provided in this [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/getting-started) to create a simple PDF Viewer sample in TypeScript. This sets up the basic structure of the PDF Viewer application. -**Step 3:** Modify the `src/app/app.ts` File in the Angular Project +**Step 3:** Modify the `src/app/app.ts` file in the Angular project 1. Import the required namespaces at the top of the file: @@ -33,7 +31,7 @@ Start by following the steps provided in this [link](https://help.syncfusion.com import { Dropbox } from 'dropbox'; ``` -2. Configure a custom toolbar item for the download function to save a PDF file in Azure Blob Storage. +2. Configure a custom toolbar item for the download function to save a PDF file to Dropbox. ```typescript let toolItem1: CustomToolbarItemModel = { @@ -52,7 +50,7 @@ pdfviewer.toolbarClick = function (args) { }; ``` -3. Retrieve the PDF viewer instance and save the current PDF as a Blob. Then, read the Blob using a FileReader to convert it into an ArrayBuffer, and upload the ArrayBuffer to Drop Box using the filesUpload method of the Drop Box instance. +3. Retrieve the PDF Viewer instance and save the current PDF as a Blob. Then, read the Blob using a FileReader to convert it into an ArrayBuffer, and upload the ArrayBuffer to Dropbox using the `filesUpload` method. N> Replace **Your Access Token** with the actual Access Token of your Drop Box account. @@ -80,23 +78,23 @@ function saveDocument() { } ``` -N> The **npm install dropbox** package must be installed in your application to use the previous code example. +N> Install the dropbox package in the application to use the previous code example: npm install dropbox [View sample in GitHub](https://github.com/SyncfusionExamples/open-save-pdf-documents-in-dropbox-cloud-file-storage/tree/master/Open%20and%20Save%20PDF%20in%20Drop%20Box%20using%20Standalone) -## Using Server-Backed PDF Viewer +## Using server-backed PDF Viewer To save a PDF file to Dropbox cloud file storage, you can follow the steps below: -**Step 1** Create a Dropbox API +**Step 1:** Create a Dropbox API app To create a Dropbox API App, you should follow the official documentation provided by Dropbox [link](https://www.dropbox.com/developers/documentation/dotnet#tutorial). The process involves visiting the Dropbox Developer website and using their App Console to set up your API app. This app will allow you to interact with Dropbox programmatically, enabling secure access to files and data. **Step 2:** Create a PDF Viewer sample in TypeScript -Follow the instructions provided in this [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/getting-started) to create a simple PDF Viewer sample in typescript. This will set up the basic structure of your PDF Viewer application. +Follow the instructions provided in this [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/getting-started) to create a simple PDF Viewer sample in TypeScript. This sets up the basic structure of the PDF Viewer application. -**Step 3:** Modify the `PdfViewerController.cs` File in the Web Service Project +**Step 3:** Modify the `PdfViewerController.cs` file in the web service project 1. Create a web service project in .NET Core 3.0 or above. You can refer to this [link](https://www.syncfusion.com/kb/11063/how-to-create-pdf-viewer-web-service-in-net-core-3-0-and-above) for instructions on how to create a web service project. @@ -110,7 +108,7 @@ using Dropbox.Api; using Dropbox.Api.Files; ``` -4. Add the following private fields and constructor parameters to the `PdfViewerController` class, In the constructor, assign the values from the configuration to the corresponding fields +4. Add the following private fields and constructor parameters to the `PdfViewerController` class. In the constructor, assign configuration values to the corresponding fields. ```csharp private IConfiguration _configuration; @@ -127,7 +125,7 @@ public PdfViewerController(IWebHostEnvironment hostingEnvironment, IMemoryCache } ``` -5. Modify the [Download()](https://ej2.syncfusion.com/documentation/api/pdfviewer/#download) method to save the downloaded PDF files to Dropbox cloud file storage bucket +5. Modify the [Download()](https://ej2.syncfusion.com/documentation/api/pdfviewer/#download) method to save the downloaded PDF file to the Dropbox folder. ```csharp @@ -164,7 +162,7 @@ public async Task Download([FromBody] Dictionary } ``` -6. Open the `appsettings.json` file in your web service project, Add the following lines below the existing `"AllowedHosts"` configuration +6. Open the `appsettings.json` file in the web service project and add the following lines below the existing `"AllowedHosts"` configuration. ```json { @@ -180,11 +178,11 @@ public async Task Download([FromBody] Dictionary } ``` -N> Replace **Your_Dropbox_Access_Token** with your actual Dropbox access token and **Your_Folder_Name** with your folder name. +N> Replace the placeholders with the actual Dropbox access token and target folder name. -**Step 4:** Set the PDF Viewer Properties in Typescript PDF viewer component +**Step 4:** Set the PDF Viewer properties in the TypeScript PDF Viewer component -Modify the `serviceUrl` property of the PDF viewer component with the accurate URL of your web service project, replacing `https://localhost:44396/pdfviewer` with the actual URL of your server. Set the `documentPath` property of the PDF viewer component to the desired name of the PDF file you wish to load from Dropbox cloud file storage. Ensure that you correctly pass the document name from the files available in your dropbox folder to the documentPath property. +Modify the `serviceUrl` property of the PDF Viewer component with the accurate URL of the web service, replacing `https://localhost:44396/pdfviewer` with the actual server URL. Set the `documentPath` property to the desired PDF file name to load from Dropbox, and ensure that the document exists in the target folder. ```typescript @@ -202,6 +200,6 @@ viewer.load('PDF_Succinctly.pdf', null); ``` -N> The **Dropbox.Api** NuGet package must be installed in your application to use the previous code example. +N> Install the Dropbox.Api NuGet package in the web service application to use the previous code example. [View sample in GitHub](https://github.com/SyncfusionExamples/open-save-pdf-documents-in-dropbox-cloud-file-storage/tree/master/Open%20and%20Save%20PDF%20in%20Drop%20Box%20using%20Server-Backed) diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es6/save-pdf-file/to-google-cloud-storage.md b/Document-Processing/PDF/PDF-Viewer/javascript-es6/save-pdf-file/to-google-cloud-storage.md index 8be5ee55f..88c0c0bea 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es6/save-pdf-file/to-google-cloud-storage.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es6/save-pdf-file/to-google-cloud-storage.md @@ -1,21 +1,19 @@ --- layout: post -title: Save PDF files to Google Cloud Storage Typescript Pdfviewer control | Syncfusion -description: Learn here all about how to Save PDF files to Google Cloud Storage in Syncfusion Typescript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Save PDF files to Google Cloud Storage in TypeScript PDF Viewer | Syncfusion +description: Learn how to save PDF files to Google Cloud Storage using the Syncfusion TypeScript PDF Viewer component with a server-backed web service. platform: document-processing -control: Save PDF files to Google Cloud Storage -publishingplatform: Typescript +control: PDF Viewer documentation: ug -domainurl: ##DomainURL## --- -# Save PDF file to Google Cloud Storage +# Save PDF files to Google Cloud Storage To save a PDF file to Google Cloud Storage, you can follow the steps below: **Step 1:** Create a PDF Viewer sample in TypeScript -Follow the instructions provided in this [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/getting-started) to create a simple PDF Viewer sample in typescript. This will set up the basic structure of your PDF Viewer application. +Follow the instructions provided in this [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/getting-started) to create a simple PDF Viewer sample in TypeScript. This sets up the basic structure of the PDF Viewer application. **Step 2:** Modify the `PdfViewerController.cs` File in the Web Service Project @@ -31,7 +29,7 @@ using Google.Cloud.Storage.V1; using Google.Apis.Auth.OAuth2; ``` -4. Add the following private fields and constructor parameters to the `PdfViewerController` class, In the constructor, assign the values from the configuration to the corresponding fields +4. Add the following private fields and constructor parameters to the `PdfViewerController` class. In the constructor, assign configuration values to the corresponding fields. ```csharp // Private readonly object _storageClient @@ -60,7 +58,7 @@ public PdfViewerController(IWebHostEnvironment hostingEnvironment, IMemoryCache ``` -5. Modify the [Download()](https://ej2.syncfusion.com/documentation/api/pdfviewer/#download) method to save the downloaded PDF files to Google Cloud Storage bucket +5. Modify the [Download()](https://ej2.syncfusion.com/documentation/api/pdfviewer/#download) method to save the downloaded PDF file to the Google Cloud Storage bucket. ```csharp [HttpPost("Download")] @@ -88,7 +86,7 @@ public IActionResult Download([FromBody] Dictionary jsonObject) } ``` -6. Open the `appsettings.json` file in your web service project, Add the following lines below the existing `"AllowedHosts"` configuration +6. Open the `appsettings.json` file in the web service project and add the following lines below the existing `"AllowedHosts"` configuration. ```json { @@ -103,13 +101,13 @@ public IActionResult Download([FromBody] Dictionary jsonObject) } ``` -N> Replace **Your Bucket name from Google Cloud Storage** with the actual name of your Google Cloud Storage bucket +N> Replace the placeholder with the actual Google Cloud Storage bucket name. -N> Replace **path/to/service-account-key.json** with the actual file path to your service account key JSON file. Make sure to provide the correct path and filename. +N> Replace `path/to/service-account-key.json` with the actual file path to the service account key JSON file. -**Step 3:** Set the PDF Viewer Properties in Typescript PDF viewer component +**Step 3:** Set the PDF Viewer properties in the TypeScript PDF Viewer component -Modify the [serviceUrl](https://ej2.syncfusion.com/documentation/api/pdfviewer/#serviceurl) property of the PDF viewer component with the accurate URL of your web service project, replacing `https://localhost:44396/pdfviewer` with the actual URL of your server. Set the `documentPath` property of the PDF viewer component to the desired name of the PDF file you wish to load from Google Cloud Storage. Ensure that you correctly pass the document name from the files available in your bucket to the documentPath property. +Modify the [serviceUrl](https://ej2.syncfusion.com/documentation/api/pdfviewer/#serviceurl) property of the PDF Viewer component with the accurate URL of the web service, replacing `https://localhost:44396/pdfviewer` with the actual server URL. Set the `documentPath` property to the desired PDF file name to load from Google Cloud Storage, and ensure that the document exists in the target bucket. ```typescript @@ -127,6 +125,6 @@ viewer.load('PDF_Succinctly.pdf', null); ``` -N> The **Google.Cloud.Storage.V1** NuGet package must be installed in your application to use the previous code example. +N> Install the Google.Cloud.Storage.V1 NuGet package in the web service application to use the previous code example. [View sample in GitHub](https://github.com/SyncfusionExamples/open-save-pdf-documents-in-google-cloud-storage) \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es6/save-pdf-file/to-google-drive.md b/Document-Processing/PDF/PDF-Viewer/javascript-es6/save-pdf-file/to-google-drive.md index 82bc2a6f3..192b0d3db 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es6/save-pdf-file/to-google-drive.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es6/save-pdf-file/to-google-drive.md @@ -1,27 +1,25 @@ --- layout: post -title: Save PDF files to Google Drive Typescript Pdfviewer control | Syncfusion -description: Learn here all about how to Save PDF files to Google Drive in Syncfusion Typescript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Save PDF files to Google Drive in TypeScript PDF Viewer | Syncfusion +description: Learn how to save PDF files to Google Drive using the Syncfusion TypeScript PDF Viewer component with a server-backed web service. platform: document-processing -control: Save PDF files to Google Drive -publishingplatform: Typescript +control: PDF Viewer documentation: ug -domainurl: ##DomainURL## --- -# Save PDF file to Google Drive +# Save PDF files to Google Drive To save a PDF file to Google Drive, you can follow the steps below: -**Step 1** Set up Google Drive API +**Step 1:** Set up the Google Drive API You must set up a project in the Google Developers Console and enable the Google Drive API. Obtain the necessary credentials to access the API. For more information, view the official [link](https://developers.google.com/drive/api/guides/enable-sdk). **Step 2:** Create a PDF Viewer sample in TypeScript -Follow the instructions provided in this [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/getting-started) to create a simple PDF Viewer sample in typescript. This will set up the basic structure of your PDF Viewer application. +Follow the instructions provided in this [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/getting-started) to create a simple PDF Viewer sample in TypeScript. This sets up the basic structure of the PDF Viewer application. -**Step 3:** Modify the `PdfViewerController.cs` File in the Web Service Project +**Step 3:** Modify the `PdfViewerController.cs` file in the web service project 1. Create a web service project in .NET Core 3.0 or above. You can refer to this [link](https://www.syncfusion.com/kb/11063/how-to-create-pdf-viewer-web-service-in-net-core-3-0-and-above) for instructions on how to create a web service project. @@ -35,7 +33,7 @@ using Google.Apis.Drive.v3; using Google.Apis.Util.Store; ``` -4. Add the following private fields and constructor parameters to the `PdfViewerController` class, In the constructor, assign the values from the configuration to the corresponding fields +4. Add the following private fields and constructor parameters to the `PdfViewerController` class. In the constructor, assign configuration values to the corresponding fields. ```csharp private IConfiguration _configuration; @@ -55,7 +53,7 @@ public PdfViewerController(IWebHostEnvironment hostingEnvironment, IMemoryCache } ``` -5. Modify the [Download()](https://ej2.syncfusion.com/documentation/api/pdfviewer/#download) method to save the downloaded PDF files to Google Drive bucket +5. Modify the [Download()](https://ej2.syncfusion.com/documentation/api/pdfviewer/#download) method to save the downloaded PDF file to the Google Drive folder. ```csharp [HttpPost("Download")] @@ -113,7 +111,7 @@ public async Task Download([FromBody] Dictionary } ``` -6. Open the `appsettings.json` file in your web service project, Add the following lines below the existing `"AllowedHosts"` configuration +6. Open the `appsettings.json` file in the web service project and add the following lines below the existing `"AllowedHosts"` configuration. ```json { @@ -130,15 +128,15 @@ public async Task Download([FromBody] Dictionary } ``` -N> Replace **Your Google Drive Folder ID**, **Your Application name**, and **Your Path to the OAuth 2.0 Client IDs json file** with your actual Google drive folder ID , Your name for your application and the path for the JSON file. +N> Replace the placeholders with the actual Google Drive folder ID, application name, and the path to the OAuth 2.0 Client IDs JSON file. -N> The **FolderId** part is the unique identifier for the folder. For example, if your folder URL is: `https://drive.google.com/drive/folders/abc123xyz456`, then the folder ID is `abc123xyz456`. +N> The folder ID is the unique identifier in the folder URL. For example, in `https://drive.google.com/drive/folders/abc123xyz456`, the ID is `abc123xyz456`. -N> You must use a unique `Client_ID` from json file to interface your application with the Google Drive API in order to save PDFs directly to Google Drive. This Client_ID will serve as the authentication key, allowing you to save files securely. +N> Use a valid `client_id` from the JSON file to authenticate with the Google Drive API and save files securely. -**Step 4:** Set the PDF Viewer Properties in Typescript PDF viewer component +**Step 4:** Set the PDF Viewer properties in the TypeScript PDF Viewer component -Modify the `serviceUrl` property of the PDF viewer component with the accurate URL of your web service project, replacing `https://localhost:44396/pdfviewer` with the actual URL of your server. Set the `documentPath` property of the PDF viewer component to the desired name of the PDF file you wish to load from Google Drive. Ensure that you correctly pass the document name from the files available in your drive folder to the documentPath property. +Modify the `serviceUrl` property of the PDF Viewer component with the accurate URL of the web service, replacing `https://localhost:44396/pdfviewer` with the actual server URL. Set the `documentPath` property to the desired PDF file name to load from Google Drive, and ensure that the document exists in the target folder. ```typescript @@ -156,6 +154,6 @@ viewer.load('PDF_Succinctly.pdf', null); ``` -N> The **Google.Apis.Drive.v3** NuGet package must be installed in your application to use the previous code example. +N> Install the Google.Apis.Drive.v3 NuGet package in the web service application to use the previous code example. [View sample in GitHub](https://github.com/SyncfusionExamples/open-save-pdf-documents-in-google-drive). \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es6/save-pdf-file/to-one-drive.md b/Document-Processing/PDF/PDF-Viewer/javascript-es6/save-pdf-file/to-one-drive.md index df4145c1d..163ab4b19 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es6/save-pdf-file/to-one-drive.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es6/save-pdf-file/to-one-drive.md @@ -1,27 +1,25 @@ --- layout: post -title: Save PDF files to One Drive Typescript Pdfviewer control | Syncfusion -description: Learn here all about how to Save PDF files to One Drive in Syncfusion Typescript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Save PDF files to OneDrive in TypeScript PDF Viewer | Syncfusion +description: Learn how to save PDF files to OneDrive using the Syncfusion TypeScript PDF Viewer component with a server-backed web service. platform: document-processing -control: Save PDF files to One Drive -publishingplatform: Typescript +control: PDF Viewer documentation: ug -domainurl: ##DomainURL## --- -# Save PDF file to One Drive +# Save PDF files to OneDrive To save a PDF file to One Drive, you can follow the steps below: -**Step 1** Create the Microsoft graph API. +**Step 1:** Create a Microsoft Graph API application Need to create a Microsoft Graph API application and obtain the necessary credentials, namely the application ID and tenant ID. Follow the steps provided in the [link](https://learn.microsoft.com/en-us/training/modules/msgraph-access-file-data/3-exercise-access-files-onedrive) to create the application and obtain the required IDs. **Step 2:** Create a PDF Viewer sample in TypeScript -Follow the instructions provided in this [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/getting-started) to create a simple PDF Viewer sample in typescript. This will set up the basic structure of your PDF Viewer application. +Follow the instructions provided in this [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/getting-started) to create a simple PDF Viewer sample in TypeScript. This sets up the basic structure of the PDF Viewer application. -**Step 3:** Modify the `PdfViewerController.cs` File in the Web Service Project +**Step 3:** Modify the `PdfViewerController.cs` file in the web service project 1. Create a web service project in .NET Core 3.0 or above. You can refer to this [link](https://www.syncfusion.com/kb/11063/how-to-create-pdf-viewer-web-service-in-net-core-3-0-and-above) for instructions on how to create a web service project. @@ -36,7 +34,7 @@ using Microsoft.Identity.Client; using Helpers; ``` -4. Add the following private fields and constructor parameters to the `PdfViewerController` class, In the constructor, assign the values from the configuration to the corresponding fields +4. Add the following private fields and constructor parameters to the `PdfViewerController` class. In the constructor, assign configuration values to the corresponding fields. ```csharp private IConfiguration _configuration; @@ -55,7 +53,7 @@ public PdfViewerController(IWebHostEnvironment hostingEnvironment, IMemoryCache } ``` -5. Modify the [Download()](https://ej2.syncfusion.com/documentation/api/pdfviewer/#download) method to save the downloaded PDF files to One Drive bucket +5. Modify the [Download()](https://ej2.syncfusion.com/documentation/api/pdfviewer/#download) method to save the downloaded PDF file to the OneDrive folder. ```csharp [HttpPost("Download")] @@ -102,7 +100,7 @@ public async Task Download([FromBody] Dictionary } ``` -6. Open the `appsettings.json` file in your web service project, Add the following lines below the existing `"AllowedHosts"` configuration +6. Open the `appsettings.json` file in the web service project and add the following lines below the existing `"AllowedHosts"` configuration. ```json { @@ -120,11 +118,11 @@ public async Task Download([FromBody] Dictionary ``` -N> Replace **Your_Tenent_ID**, **Your_Application_ID**, and **Your_Folder_Name_To_Access_The_Files_In_Onedrive** with your actual tenant ID, application ID, and folder name. +N> Replace the placeholders with the actual tenant ID, application ID, and OneDrive folder name. -**Step 4:** Set the PDF Viewer Properties in Typescript PDF viewer component +**Step 4:** Set the PDF Viewer properties in the TypeScript PDF Viewer component -Modify the `serviceUrl` property of the PDF viewer component with the accurate URL of your web service project, replacing `https://localhost:44396/pdfviewer` with the actual URL of your server. Set the `documentPath` property of the PDF viewer component to the desired name of the PDF file you wish to load from One Drive. Ensure that you correctly pass the document name from the files available in your drive folder to the documentPath property. +Modify the `serviceUrl` property of the PDF Viewer component with the accurate URL of the web service, replacing `https://localhost:44396/pdfviewer` with the actual server URL. Set the `documentPath` property to the desired PDF file name to load from OneDrive, and ensure that the document exists in the target folder. ```typescript @@ -142,13 +140,11 @@ viewer.load('PDF_Succinctly.pdf', null); ``` -N> The following NuGet packages are required to use the previous code example -* **Microsoft.Identity.Client** -* **Microsoft.Graph** -* **Microsoft.Extensions.Configuration** -* **Microsoft.Extensions.Configuration.FileExtensions** -* **Microsoft.Extensions.Configuration.Json** - -You can install these packages using the NuGet Package Manager in Visual Studio or Visual Studio Code. +N> Install the following NuGet packages in the web service application: +- Microsoft.Identity.Client +- Microsoft.Graph +- Microsoft.Extensions.Configuration +- Microsoft.Extensions.Configuration.FileExtensions +- Microsoft.Extensions.Configuration.Json [View sample in GitHub](https://github.com/SyncfusionExamples/open-save-pdf-documents-in-one-drive) \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es6/save-pdf-files.md b/Document-Processing/PDF/PDF-Viewer/javascript-es6/save-pdf-files.md index cac08c936..2fcdb12c2 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es6/save-pdf-files.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es6/save-pdf-files.md @@ -1,33 +1,30 @@ --- layout: post -title: Saving PDF files Typescript Pdfviewer control | Syncfusion -description: This page helps you to learn here all about saving PDF files in Syncfusion Typescript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Save PDF files in TypeScript PDF Viewer | Syncfusion +description: Learn how to save updated documents from the Syncfusion TypeScript PDF Viewer component to a server, database, or local file system. platform: document-processing control: Saving PDF files -publishingplatform: Typescript documentation: ug domainurl: ##DomainURL## --- -# Saving PDF file +# Saving PDF files -After editing the PDF file with various annotation tools, you will need to save the updated PDF to the server, database, or local file system. +After annotating or editing a document, use the TypeScript PDF Viewer component to persist the updated PDF to a server, local storage, or a database. -## Save PDF file to Server +## Save a PDF file to a server -Need to save the modified PDF back to a server. To achieve this, proceed with the following steps +Follow these steps to upload the modified document to a server-side location. -**Step 1:** Create a Simple PDF Viewer Sample in Typescript +**Step 1:** Create a TypeScript PDF Viewer sample -Start by following the steps provided in this [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/getting-started) to create a simple PDF viewer sample in Typescript. This will give you a basic setup of the PDF viewer component. +Follow the [getting started guide](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/getting-started) to configure a TypeScript PDF Viewer project. This provides the viewer instance required to submit downloads to a web service. -**Step 2:** Modify the `PdfViewerController.cs` File in the Web Service Project +**Step 2:** Modify the `PdfViewerController.cs` file in the web service project -1. Create a web service project in .NET Core 3.0 or above. You can refer to this [link](https://www.syncfusion.com/kb/11063/how-to-create-pdf-viewer-web-service-in-net-core-3-0-and-above) for instructions on how to create a web service project. - -2. Open the `PdfViewerController.cs` file in your web service project. - -3. Modify the [Download()](https://ej2.syncfusion.com/documentation/api/pdfviewer/#download) method to open it in the viewer using URL +1. Create a web service in .NET Core 3.0 or later. Refer to [How to create PDF Viewer web service in .NET Core 3.0 and above](https://www.syncfusion.com/kb/11063/how-to-create-pdf-viewer-web-service-in-net-core-3-0-and-above) for detailed instructions. +2. Open the `PdfViewerController.cs` file in the service project. +3. Update the [`Download`](https://ej2.syncfusion.com/documentation/api/pdfviewer/#download) action to save the output file on the server. ```csharp @@ -58,9 +55,11 @@ public IActionResult Download([FromBody] Dictionary jsonObject) ``` -**Step 3:** Set the PDF Viewer Properties in React PDF viewer component +N> Ensure the application pool identity or service account has write access to the destination directory before saving files. + +**Step 3:** Set PDF Viewer service properties -Modify the [serviceUrl](https://ej2.syncfusion.com/documentation/api/pdfviewer/#serviceurl) property of the PDF viewer component with the accurate URL of your web service project, replacing `https://localhost:44396/pdfviewer` with the actual URL of your server.Modify the documentPath with the correct PDF Document URL want to load. +Specify the [`serviceUrl`](https://ej2.syncfusion.com/documentation/api/pdfviewer/#serviceurl) of your web service and the document to load. ```typescript @@ -78,11 +77,13 @@ viewer.appendTo('#pdfViewer'); ``` +N> Replace the placeholder service URL and document name with your deployment values. Configure CORS on the web service if the viewer runs on a different origin. + [View sample in GitHub](https://github.com/SyncfusionExamples/typescript-pdf-viewer-examples/tree/master/Save%20and%20Load/Load%20PDF%20file%20from%20base64%20string) -## Download PDF file as a copy +## Download a PDF file as a copy -In the built-in toolbar, you have an option to download the updated PDF to the local file system, you can use it to download the PDF file. +The built-in toolbar includes a **Download** button that saves the current PDF to the local file system. You can also trigger the same behavior from custom UI by calling [`download`](https://ej2.syncfusion.com/documentation/api/pdfviewer/#download). ```html @@ -97,28 +98,28 @@ document.getElementById('download').addEventListener('click', function () { ``` -## Save PDF file to Database - -If you have plenty of PDF files stored in database and you want to save the updated PDF file back to the database, use the following code example. +N> The `download` method returns the document after applying annotations, form edits, and other runtime changes. -**Step 1:** Create a Simple PDF Viewer Sample in Typescript +## Save a PDF file to a database -Start by following the steps provided in this [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/getting-started) to create a simple PDF viewer sample in Typescript. This will give you a basic setup of the PDF viewer component. +Use the following steps to persist the generated PDF document to a SQL Server database. -**Step 2:** Modify the `PdfViewerController.cs` File in the Web Service Project +**Step 1:** Create a TypeScript PDF Viewer sample -1. Create a web service project in .NET Core 3.0 or above. You can refer to this [link](https://www.syncfusion.com/kb/11063/how-to-create-pdf-viewer-web-service-in-net-core-3-0-and-above) for instructions on how to create a web service project. +Follow the [getting started guide](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/getting-started) to configure a TypeScript PDF Viewer project. -2. Open the `PdfViewerController.cs` file in your web service project +**Step 2:** Modify the `PdfViewerController.cs` file in the web service project -3. Import the required namespaces at the top of the file: +1. Create a web service in .NET Core 3.0 or later. +2. Open the `PdfViewerController.cs` file. +3. Import the required namespaces at the top of the file. ```csharp using System.IO; using System.Data.SqlClient; ``` -4. Add the following private fields and constructor parameters to the `PdfViewerController` class, In the constructor, assign the values from the configuration to the corresponding fields +4. Add the following private fields and constructor parameters to the `PdfViewerController` class, and map configuration values in the constructor. ```csharp private IConfiguration _configuration; @@ -133,7 +134,7 @@ public PdfViewerController(IWebHostEnvironment hostingEnvironment, IMemoryCache } ``` -5. Modify the [Download()](https://ej2.syncfusion.com/documentation/api/pdfviewer/#download) method to open it in the viewer using URL +5. Update the [`Download`](https://ej2.syncfusion.com/documentation/api/pdfviewer/#download) action to insert the document into a database table. ```csharp @@ -173,7 +174,7 @@ public async Task Download([FromBody] Dictionary } ``` -6. Open the `appsettings.json` file in your web service project, Add the following lines below the existing `"AllowedHosts"` configuration +6. Update the `appsettings.json` file to include the connection string setting. ```json { @@ -188,8 +189,8 @@ public async Task Download([FromBody] Dictionary } ``` -N> Replace **Your Connection string from SQL server** with the actual connection string for your SQL Server database +N> Replace **Your connection string for SQL server** with the actual value. Make sure the database table, columns, and permissions exist before inserting records. -N> The **System.Data.SqlClient** package must be installed in your application to use the previous code example. You need to modify the connectionString variable in the previous code example as per the connection string of your database. +N> Install the **System.Data.SqlClient** package in the application to execute SQL commands with the previous example. Update the connection string to match your environment. -[View sample in GitHub](https://github.com/SyncfusionExamples/open-save-pdf-documents-in-database) \ No newline at end of file +[View sample in GitHub](https://github.com/SyncfusionExamples/open-save-pdf-documents-in-database) diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es6/server-deployment/how-to-deploy-docker-image-in-azure-app-service-for-container.md b/Document-Processing/PDF/PDF-Viewer/javascript-es6/server-deployment/how-to-deploy-docker-image-in-azure-app-service-for-container.md index 934ae65c3..a609d00d4 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es6/server-deployment/how-to-deploy-docker-image-in-azure-app-service-for-container.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es6/server-deployment/how-to-deploy-docker-image-in-azure-app-service-for-container.md @@ -1,58 +1,55 @@ --- layout: post -title: How to deploy docker image in azure app service for container in Typescript Pdfviewer control | Syncfusion -description: Learn here all about How to deploy docker image in azure app service for container in Syncfusion Typescript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Deploy TypeScript PDF Viewer server to Azure App Service for Containers +description: Deploy the Syncfusion PDF Viewer server Docker image to Azure App Service for Containers and connect it to the TypeScript PDF Viewer client. platform: document-processing -control: How to deploy docker image in azure app service for container -publishingplatform: Typescript +control: PDF Viewer documentation: ug -domainurl: ##DomainURL## --- -# How to deploy docker image in azure app service for container in Typescript Pdfviewer control +# Deploy Docker image to Azure App Service for Containers -## Prerequisites +Deploy the Syncfusion PDF Viewer server container to Azure App Service for Containers to host the backend for the TypeScript PDF Viewer client without managing infrastructure. The steps below provision platform resources, configure the Docker image, and expose the service endpoint required for the component’s `serviceUrl`. -* Have [`Azure account`](https://azure.microsoft.com/en-gb/) and [`Azure CLI`](https://docs.microsoft.com/en-us/cli/azure/?view=azure-cli-latest) setup in your environment. +## Prerequisites -* Run the following command to open the Azure login page. Sign into your [`Microsoft Azure account`](https://azure.microsoft.com/en-gb/). +- Azure subscription and Azure CLI installed. See the [Install the Azure CLI](https://learn.microsoft.com/cli/azure/install-azure-cli) article. +- Sign in to Azure before you create resources. -``` +```console az login ``` -**Step 1:** Create a resource group. +Ensure the web app can pull the `syncfusion/pdfviewerserver:latest` image from Docker Hub. Mirror the image to a private registry if outbound internet access is restricted. -Create a resource group using the [`az group create`](https://docs.microsoft.com/en-us/cli/azure/group#az-group-create) command. +## Deploy the PDF Viewer server -The following example creates a resource group named pdfviewerresourcegroup in the eastus location. +Follow these steps to provision the App Service plan and multi-container web app that hosts the PDF Viewer server container. -``` +**Step 1:** Create a resource group. + +```console az group create --name pdfviewerresourcegroup --location "East US" ``` **Step 2:** Create an Azure App Service plan. -Create an App Service plan in the resource group with the [`az appservice plan create`](https://docs.microsoft.com/en-us/cli/azure/appservice/plan?view=azure-cli-latest#az-appservice-plan-create) command. - -The following example creates an App Service plan named pdfviewerappservice in the Standard pricing tier (--sku S1) and in a Linux container (--is-linux). - -``` +```console az appservice plan create --name pdfviewerappservice --resource-group pdfviewerresourcegroup --sku S1 --is-linux ``` **Step 3:** Create a Docker Compose app. -Create a multi-container [`web app`](https://docs.microsoft.com/en-us/azure/app-service/containers/app-service-linux-intro) in the pdfviewerappservice App Service plan with the [`az webapp create`](https://docs.microsoft.com/en-us/cli/azure/webapp?view=azure-cli-latest#az-webapp-create) command. The following command creates the web app using the provided Docker compose file. Please look into the section for getting started with Docker compose to create the Docker compose file for the PDF Viewer server and use the created Docker compose file here. +Create a multi-container web app in the plan by using your Docker Compose file. Ensure it references `syncfusion/pdfviewerserver:latest` and sets the `SYNCFUSION_LICENSE_KEY` environment variable via App Service application settings or Azure Key Vault secrets. -``` -az webapp create --resource-group pdfviewerappservice --plan pdfviewerappservice --name pdfviewer-server --multicontainer-config-type compose --multicontainer-config-file pdfviewer-server-compose.yml +```console +az webapp create --resource-group pdfviewerresourcegroup --plan pdfviewerappservice --name pdfviewer-server --multicontainer-config-type compose --multicontainer-config-file pdfviewer-server-compose.yml ``` **Step 4:** Browse to the app. -Browse to the deployed app at `http://.azurewebsites.net`,. i.e. `http://pdfviewerappservice.azurewebsites.net`. Open this link in a browser and navigate to the PDF Viewer Web API control `http://pdfviewerappservice.azurewebsites.net/api/pdfviewer`. It returns the default get method response. +Open the app at `https://.azurewebsites.net` (for example, `https://pdfviewerappservice.azurewebsites.net`). Verify the API at `https://pdfviewerappservice.azurewebsites.net/api/pdfviewer` to confirm a default GET response. Configure a custom domain and certificate for production deployments. -Append the app service running the URL `http://pdfviewerappservice.azurewebsites.net/api/pdfviewer` to the service URL in the client-side PDF Viewer control. For more information about how to get started with the PDF Viewer control, refer to this [`getting started page`](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/getting-started/?). +Append the service endpoint (for example, `https://pdfviewerappservice.azurewebsites.net/api/pdfviewer`) to the PDF Viewer client’s `serviceUrl`. See the [Getting started with the TypeScript PDF Viewer](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/getting-started/) guide for client configuration steps. -For more information about the app container service, please look deeper into the [`Microsoft Azure Container Service`](https://docs.microsoft.com/en-us/azure/app-service/containers/quickstart-multi-container) for a production-ready setup. \ No newline at end of file +For production guidance, review the [Azure App Service for Containers documentation](https://learn.microsoft.com/azure/app-service/containers/quickstart-multi-container). Consider adding an architecture diagram that illustrates how the hosted PDF Viewer server communicates with the TypeScript PDF Viewer client. diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es6/server-deployment/how-to-deploy-docker-image-in-azure-kubernetes-service.md b/Document-Processing/PDF/PDF-Viewer/javascript-es6/server-deployment/how-to-deploy-docker-image-in-azure-kubernetes-service.md index 043ff9d30..865239e14 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es6/server-deployment/how-to-deploy-docker-image-in-azure-kubernetes-service.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es6/server-deployment/how-to-deploy-docker-image-in-azure-kubernetes-service.md @@ -1,61 +1,55 @@ --- layout: post -title: How to deploy docker image in azure kubernetes service in Typescript Pdfviewer control | Syncfusion -description: Learn here all about How to deploy docker image in azure kubernetes service in Syncfusion Typescript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Deploy TypeScript PDF Viewer server to Azure Kubernetes Service (AKS) +description: Deploy the Syncfusion PDF Viewer server Docker image to Azure Kubernetes Service (AKS), expose it securely, and connect it to the TypeScript PDF Viewer client. platform: document-processing -control: How to deploy docker image in azure kubernetes service -publishingplatform: Typescript +control: PDF Viewer documentation: ug -domainurl: ##DomainURL## --- -# How to deploy docker image in azure kubernetes service in Typescript Pdfviewer control +# Deploy Docker image to Azure Kubernetes Service (AKS) -## Prerequisites +Host the Syncfusion PDF Viewer server container on Azure Kubernetes Service (AKS) to deliver PDFs to the TypeScript PDF Viewer client at scale. The following workflow provisions the infrastructure, deploys the published image from Docker Hub, and exposes a public endpoint for the component’s `serviceUrl`. -* Have [`Azure account`](https://azure.microsoft.com/en-gb/) and [`Azure CLI`](https://docs.microsoft.com/en-us/cli/azure/?view=azure-cli-latest) setup in your environment. +## Prerequisites -* Run the following command to open the Azure login page. Sign into your [`Microsoft Azure account`](https://azure.microsoft.com/en-gb/). +- Azure subscription and Azure CLI installed. See the [Install the Azure CLI](https://learn.microsoft.com/cli/azure/install-azure-cli) guide. +- Sign in to Azure before you create resources. -``` +```console az login ``` -**Step 1:** Create a resource group. +Ensure the AKS nodes can pull the `syncfusion/pdfviewerserver:latest` image from Docker Hub or from a private registry mirror if outbound internet access is restricted. -Create a resource group using the [`az group create`](https://docs.microsoft.com/en-us/cli/azure/group#az-group-create) command. +## Deploy the PDF Viewer server -The following example creates a resource group named pdfviewerresourcegroup in the eastus location. +The following steps create the resource group, cluster, and networking assets used by the PDF Viewer server. Replace resource names if you deploy to an existing namespace or use regional naming conventions. -``` +**Step 1:** Create a resource group for AKS resources. + +```console az group create --name pdfviewerresourcegroup --location "East US" ``` -**Step 2:** Create AKS cluster. - -Use the [`az aks create`](https://docs.microsoft.com/en-us/cli/azure/aks?view=azure-cli-latest#az-aks-create) command to create an AKS cluster. The following example creates a cluster named pdfviewercluster with one node. +**Step 2:** Create an AKS cluster in the default namespace. -``` +```console az aks create --resource-group pdfviewerresourcegroup --name pdfviewercluster --node-count 1 ``` **Step 3:** Connect to the cluster. -Install the [`kubectl`](https://kubernetes.io/docs/reference/kubectl/kubectl/) into the workspace using the following command. +Install kubectl and download the credentials for the resource group. If you use a custom namespace, append `--namespace ` to subsequent `kubectl` commands. -``` +```console az aks install-cli -``` - -To configure kubectl to connect to your Kubernetes cluster, use the [`az aks get-credentials`](https://docs.microsoft.com/en-us/cli/azure/aks?view=azure-cli-latest#az-aks-get-credentials) command. This command downloads credentials and configures the Kubernetes CLI to use them. - -``` az aks get-credentials --resource-group pdfviewerresourcegroup --name pdfviewercluster ``` **Step 4:** Create services and deployments. -[`Kubernetes Services`](https://kubernetes.io/docs/concepts/services-networking/service/) and [`Deployments`](https://kubernetes.io/docs/concepts/workloads/controllers/deployment/) can be configured in a file. To run the PDF Viewer server, you have to define a Service and a Deployment pdfviewerserver. To do this, create the pdfviewer-server.yaml file in the current directory using the following code. +Create a `pdfviewer-server.yaml` file that defines the Deployment and Service required to expose the container by using a public LoadBalancer. ```yaml apiVersion: apps/v1 @@ -69,20 +63,19 @@ spec: selector: matchLabels: app: pdfviewerserver - strategy: {} template: metadata: labels: app: pdfviewerserver spec: containers: - - image: syncfusion/pdfviewerserver:latest - name: pdfviewerserver - ports: - - containerPort: 80 - env: - - name: SYNCFUSION_LICENSE_KEY - value: "YOUR_LICENSE_KEY" + - image: syncfusion/pdfviewerserver:latest + name: pdfviewerserver + ports: + - containerPort: 80 + env: + - name: SYNCFUSION_LICENSE_KEY + value: "YOUR_LICENSE_KEY" --- apiVersion: v1 kind: Service @@ -92,27 +85,26 @@ metadata: name: pdfviewerserver spec: ports: - - port: 80 - targetPort: 80 + - port: 80 + targetPort: 80 selector: app: pdfviewerserver type: LoadBalancer ``` -**Step 5:** To create all Services and Deployments needed to run the PDF Viewer server, execute the following. +> **Security note:** Store `SYNCFUSION_LICENSE_KEY` in an Azure Key Vault secret or Kubernetes Secret and reference it from the pod manifest instead of hard-coding the value in source control. -```console -kubectl create -f ./pdfviewer-server.yaml -``` - -Run the following command to get the Kubernetes cluster deployed with service details and copy the external IP address of the PDF Viewer service. +**Step 5:** Apply the configuration and get the external IP. ```console +kubectl apply -f ./pdfviewer-server.yaml kubectl get all ``` -Browse the copied external IP address and navigate to the PDF Viewer Web API control `http:///api/pdfviewer`. It returns the default get method response. +It can take several minutes for Azure to provision the LoadBalancer IP. When the external IP is available, browse to `http:///api/pdfviewer` to verify the default GET response. Enable HTTPS with an ingress controller or Azure Front Door for production workloads. + +**Step 6:** Connect the client to the server endpoint. -**Step 6:** Append the Kubernetes service running the URL `http:///api/pdfviewer` to the service URL in the client-side PDF Viewer control. For more information about how to get started with the PDF Viewer control, refer to this [`getting started page`](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/getting-started/?). +Update the TypeScript PDF Viewer client configuration with the service endpoint (for example, `https:///api/pdfviewer`). See the [Getting started with the TypeScript PDF Viewer](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/getting-started/) guide for client configuration steps. -For more details about the Azure Kubernetes service, please look deeper into [`Microsoft Azure Kubernetes Service`](https://docs.microsoft.com/en-us/azure/aks/kubernetes-walkthrough) for a production-ready setup. \ No newline at end of file +For production guidance, review the [Azure Kubernetes Service documentation](https://learn.microsoft.com/azure/aks/kubernetes-walkthrough). Consider including an architecture diagram illustrating the AKS cluster, LoadBalancer, and PDF Viewer client communication path to help onboarding teams. diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es6/server-deployment/how-to-deploy-pdfviewer-server-app-in-azure-app-service-from-visual-studio.md b/Document-Processing/PDF/PDF-Viewer/javascript-es6/server-deployment/how-to-deploy-pdfviewer-server-app-in-azure-app-service-from-visual-studio.md index 0a735e04b..5457a8f14 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es6/server-deployment/how-to-deploy-pdfviewer-server-app-in-azure-app-service-from-visual-studio.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es6/server-deployment/how-to-deploy-pdfviewer-server-app-in-azure-app-service-from-visual-studio.md @@ -1,43 +1,47 @@ --- layout: post -title: How to deploy pdfviewer server app in azure app service from visual studio in Typescript Pdfviewer control | Syncfusion -description: Learn here all about How to deploy pdfviewer server app in azure app service from visual studio in Syncfusion Typescript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Deploy TypeScript PDF Viewer server app to Azure App Service from Visual Studio +description: Publish the Syncfusion PDF Viewer Web API from Visual Studio to Azure App Service and connect it to the TypeScript PDF Viewer client. platform: document-processing -control: How to deploy pdfviewer server app in azure app service from visual studio -publishingplatform: Typescript +control: PDF Viewer documentation: ug -domainurl: ##DomainURL## --- -# How to deploy pdfviewer server app in azure app service from visual studio in Typescript Pdfviewer control +# Deploy PDF Viewer server app to Azure App Service from Visual Studio + +Publish the Syncfusion PDF Viewer Web API from Visual Studio to Azure App Service to host the backend required by the TypeScript PDF Viewer client. This workflow packages the project, deploys it to Azure, and provides a public endpoint for the component’s `serviceUrl`. ## Prerequisites -* Visual Studio 2017 or Visual Studio 2019. -* An [`Azure subscription`](https://azure.microsoft.com/en-gb/). -* Create the [`PDF Viewer Web API application`](https://www.syncfusion.com/kb/10346/how-to-create-pdf-viewer-web-service-application-in-asp-net-core). -* Make sure you’ve built the project using the Build > Build Solution menu command before following the deployment steps. +- Visual Studio 2017 or 2019 with the Azure development workload installed +- Active Azure subscription. Sign up from the [Azure pricing page](https://azure.microsoft.com/pricing/) +- Existing PDF Viewer Web API project. Follow the article [Create a PDF Viewer Web API application in ASP.NET Core](https://www.syncfusion.com/kb/10346/how-to-create-pdf-viewer-web-service-application-in-asp-net-core) +- Build the project (Build > Build Solution) before publishing to catch compilation errors locally ## Publish to Azure App Service -**Step 1:** In Solution Explorer, right-click the project and choose Publish (or use the Build > Publish menu item). +Follow these steps to publish the Web API and generate the App Service endpoint that the TypeScript PDF Viewer client uses. + +**Step 1:** In Solution Explorer, right-click the project and choose Publish (or use Build > Publish) to open the publishing wizard. - ![azure publish ](../images/azure_publish.png) +![azure publish](../images/azure_publish.png) -**Step 2:** If you have previously configured any publishing profiles, the Publish pane appears, in which case, select Create new profile. +**Step 2:** If no profile exists, select **Create new profile** to configure deployment settings. -**Step 3:** In the Pick a publish target dialog box, choose App Service. +**Step 3:** In **Pick a publish target**, choose **App Service** so Visual Studio provisions or reuses an Azure App Service instance. ![azure target](../images/azure_target.png) -**Step 4:** Select Publish. The Create App Service dialog box appears. Sign in with your Azure account, if necessary, then the default app service settings populate the fields. +**Step 4:** Select **Publish**. In **Create App Service**, sign in if prompted and review the default resource group, plan, and hosting settings. + +![azure pdfviewer](../images/azure_pdfviewer.png) -![azure pdfviewer ](../images/azure_pdfviewer.png) +> **Security note:** Store the `SYNCFUSION_LICENSE_KEY` in Azure App Service application settings or Azure Key Vault references instead of embedding it in source code or publish profiles. -**Step 5:** Select Create. Visual Studio deploys the app to your Azure App Service, and the web app loads in your browser at `http://.azurewebsites.net`. (i.e. `http:// ej2-pdfviewer-server20200513053326.azurewebsites.net`). +**Step 5:** Select **Create**. After deployment, browse to `https://.azurewebsites.net` (for example, `https://ej2-pdfviewer-server20200513053326.azurewebsites.net`). Configure a custom domain and TLS certificate for production environments. -**Step 6:** Navigate to the PDF Viewer Web API control `http://ej2-pdfviewer-server20200513053326.azurewebsites.net/api/pdfviewer`. It returns the default get method response. +**Step 6:** Verify the API at `https://ej2-pdfviewer-server20200513053326.azurewebsites.net/api/pdfviewer`. A default GET response confirms the server is running and reachable. -Append the app service running the URL `http://ej2-pdfviewer-server20200513053326.azurewebsites.net./api/pdfviewer` to the service URL in the client-side PDF Viewer control. For more information about how to get started with the PDF Viewer control, refer to this [`getting started page`](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/getting-started/?). +Update the TypeScript PDF Viewer client to use the secure service endpoint (for example, `https://ej2-pdfviewer-server20200513053326.azurewebsites.net/api/pdfviewer`) as the `serviceUrl`. Refer to the [Getting started with the TypeScript PDF Viewer](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/getting-started/) guide for client configuration steps. -For more information about the app container service, please look deeper into the [`Microsoft Azure App Service`](https://docs.microsoft.com/en-us/visualstudio/deployment/) for a production-ready setup. \ No newline at end of file +For production deployment guidance, review the [Azure App Service deployment documentation](https://learn.microsoft.com/visualstudio/deployment/azure/app-service). An architecture diagram illustrating the Visual Studio deployment process and client-to-server communication can help onboarding teams understand the workflow. diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es6/server-deployment/pdfviewer-server-docker-image-overview.md b/Document-Processing/PDF/PDF-Viewer/javascript-es6/server-deployment/pdfviewer-server-docker-image-overview.md index 1b346855b..3563f0d11 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es6/server-deployment/pdfviewer-server-docker-image-overview.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es6/server-deployment/pdfviewer-server-docker-image-overview.md @@ -1,40 +1,41 @@ --- layout: post -title: PDF Viewer Server Docker Image in Typescript | Syncfusion -description: Learn here all about Pdfviewer server docker image overview in Syncfusion Typescript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: TypeScript PDF Viewer server Docker image overview +description: Run the Syncfusion PDF Viewer server Docker image, configure licensing and Redis cache, and connect it to the TypeScript PDF Viewer client. platform: document-processing -control: Pdfviewer server docker image overview -publishingplatform: Typescript +control: PDF Viewer documentation: ug -domainurl: ##DomainURL## --- -# Pdfviewer server docker image overview in Typescript Pdfviewer control +# PDF Viewer server Docker image overview -The Syncfusion PDF Viewer control allows you to view, print, form-fill, and annotate PDF files in your web applications. This PDF Viewer control requires a server-side backend Web API service to render PDF contents. +The Syncfusion PDF Viewer component enables viewing, printing, form filling, and annotating PDF files in web applications. The client component requires a server-side Web API to process and render PDF content. -This Docker image is the predefined Docker container of Syncfusion’s PDF Viewer backend. You can deploy it quickly to your infrastructure. +Use the PDF Viewer server Docker image to host this backend quickly in containerized environments. The container exposes a REST API that the TypeScript PDF Viewer client calls through its `serviceUrl` value. -PDF Viewer is a commercial product, and it requires a valid license to use it in a production environment [`(request license or trial key).`](https://help.syncfusion.com/common/essential-studio/licensing/licensing-faq/where-can-i-get-a-license-key) +PDF Viewer is a commercial product and requires a valid license in production environments. Request a license or trial key from the [Syncfusion licensing portal](https://help.syncfusion.com/common/essential-studio/licensing/licensing-faq/where-can-i-get-a-license-key). -PDF Viewer control is supported in the JavaScript, Angular, React, Vue, ASP.NET Core, ASP.NET MVC, and Blazor platforms. +PDF Viewer is available for JavaScript, Angular, React, Vue, ASP.NET Core, ASP.NET MVC, and Blazor. Choose the Docker image when you need a lightweight deployment option or when multiple clients share the same backend. ## Prerequisites -Have [`Docker`](https://www.docker.com/products/container-runtime/#/download) installed in your environment: +Install Docker in the target environment so the host can run containers. -* On Windows, install [`Docker for Windows`](https://hub.docker.com/editions/community/docker-ce-desktop-windows). +- On Windows, install [Docker Desktop for Windows](https://hub.docker.com/editions/community/docker-ce-desktop-windows) +- On macOS, install [Docker Desktop for Mac](https://hub.docker.com/editions/community/docker-ce-desktop-mac) -* On macOS, install [`Docker for Mac`](https://hub.docker.com/editions/community/docker-ce-desktop-windows). +Ensure the host can pull the `syncfusion/pdfviewer-server:latest` image from Docker Hub or from a private registry mirror if outbound connectivity is restricted. ## How to use this PDF Viewer Docker image -**Step 1:** Pull the pdfviewer-server image from Docker Hub. +The following steps pull the image, run the container, and connect the TypeScript PDF Viewer client. + +**Step 1:** Pull the `pdfviewer-server` image from Docker Hub. ```console docker pull syncfusion/pdfviewer-server ``` -**Step 2:** Create the docker-compose.yml file with the following code in your file system. +**Step 2:** Create a `docker-compose.yml` file in the desired folder. Adjust the mapped port if another service uses `6001`. ```yaml version: '3.4' @@ -43,27 +44,29 @@ services: pdfviewer-server: image: syncfusion/pdfviewer-server:latest environment: - #Provide your license key for activation + # Provide your license key for activation SYNCFUSION_LICENSE_KEY: YOUR_LICENSE_KEY ports: - - "6001:80" + - "6001:80" ``` -**Step 3:** In a terminal tab, navigate to the directory where you’ve placed the docker-compose.yml file and execute the following. +> **Security note:** Store `SYNCFUSION_LICENSE_KEY` in Docker secrets, environment variables, or orchestration-specific secret stores instead of saving it in source control. + +**Step 3:** In a terminal, navigate to the folder containing `docker-compose.yml` and run: ```console docker-compose up ``` -Also, you can run the Docker container along with the license key using this docker run command. +Alternatively, run the container directly with the license key: ```console docker run -d -p 6001:80 –e SYNCFUSION_LICENSE_KEY= YOUR_LICENSE_KEY syncfusion/pdfviewer-server:latest ``` -Now the PDF Viewer server Docker instance runs in the localhost with the provided port number `http://localhost:6001`. Open this link in the browser and navigate to the PDF Viewer Web API control `http://localhost:6001/api/pdfviewer`. It returns the default get method response. +When the container starts, the server listens on `http://localhost:6001`. Open the API endpoint at `http://localhost:6001/api/pdfviewer` to verify the default GET response. Update firewalls or inbound rules to allow traffic through the published port. -**Step 4:** Append the Docker instance running the URL `(http://localhost:6001/api/pdfviewer)` to the service URL in the client-side PDF Viewer control. For more information about how to get started with PDF Viewer control, refer to this [`getting started page`](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/getting-started/?). +**Step 4:** Set the PDF Viewer client’s `serviceUrl` to the server endpoint (for example, `https://localhost:6001/api/pdfviewer`). For details on creating a client application, see the [Getting started with the TypeScript PDF Viewer](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/javascript-es6/getting-started/) guide. Configure HTTPS and trusted certificates before exposing the service publicly. ```html @@ -113,13 +116,13 @@ if(ele) { ``` -## How to configure the distributed Redis Cache in this Docker image +## How to configure the distributed Redis cache in this Docker image -The PDF Viewer server library internally caches the loaded document instance and you can extend the cache option to a distributed cache environment. Please follow these steps to configure the Azure Cache for a Redis instance to the PDF Viewer server library using a Docker compose file. +The PDF Viewer server caches loaded document instances. To use a distributed cache, configure Azure Cache for Redis with Docker Compose as follows. -**Step 1:** Create the [`Azure Cache for the Redis instance`](https://docs.microsoft.com/en-us/azure/azure-cache-for-redis/cache-dotnet-core-quickstart) and copy the connection string. +**Step 1:** Create an Azure Cache for Redis instance and copy the connection string. Follow the [Azure Cache for Redis quickstart](https://learn.microsoft.com/azure/azure-cache-for-redis/cache-dotnet-core-quickstart). -**Step 2:** Provide the connection string to the `REDIS_CACHE_CONNECTION_STRING` environment variable in the pdfviewer-server docker-compose file. The default cache sliding expiration time is 10 minutes. You can also configure it by setting the value to the `DOCUMENT_SLIDING_EXPIRATION_TIME` environment variable. +**Step 2:** Provide the connection string with the `REDIS_CACHE_CONNECTION_STRING` variable in `docker-compose.yml`. The default sliding expiration is 10 minutes. To change it, set `DOCUMENT_SLIDING_EXPIRATION_TIME`. ```yaml version: '3.4' @@ -127,12 +130,18 @@ services: pdfviewer-server: image: syncfusion/pdfviewer-server:latest environment: - #Provide your license key for activation + # Provide your license key for activation SYNCFUSION_LICENSE_KEY: YOUR_LICENSE_KEY REDIS_CACHE_CONNECTION_STRING: YOUR_REDIS_CACHE_CONNECTION_STRING DOCUMENT_SLIDING_EXPIRATION_TIME: “20” ports: - - "6001:80" + - "6001:80" ``` -Refer to these getting started pages to create a PDF Viewer in [`Angular`](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/angular/getting-started), [`React`](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/react/getting-started), [`Vue`](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/vue/getting-started), [`ASP.NET MVC`]https://help.syncfusion.com/document-processing/pdf/pdf-viewer/asp-net-mvc/getting-started), [`ASP.NET Core`](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/asp-net-core/getting-started), and [`Blazor`](https://blazor.syncfusion.com/documentation/pdfviewer/getting-started/server-side-application). \ No newline at end of file +Review the platform-specific getting started guides: +- Angular: https://help.syncfusion.com/document-processing/pdf/pdf-viewer/angular/getting-started +- React: https://help.syncfusion.com/document-processing/pdf/pdf-viewer/react/getting-started +- Vue: https://help.syncfusion.com/document-processing/pdf/pdf-viewer/vue/getting-started +- ASP.NET MVC: https://help.syncfusion.com/document-processing/pdf/pdf-viewer/asp-net-mvc/getting-started +- ASP.NET Core: https://help.syncfusion.com/document-processing/pdf/pdf-viewer/asp-net-core/getting-started +- Blazor: https://blazor.syncfusion.com/documentation/pdfviewer/getting-started/server-side-application diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es6/text-search.md b/Document-Processing/PDF/PDF-Viewer/javascript-es6/text-search.md index 8286146fc..23aa2e17d 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es6/text-search.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es6/text-search.md @@ -1,16 +1,15 @@ --- layout: post -title: Text search in Typescript Pdfviewer control | Syncfusion -description: Learn here all about Text search in Syncfusion Typescript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Text search in TypeScript PDF Viewer control | Syncfusion +description: Learn how to configure text search, handle search events, and run programmatic searches in the Syncfusion TypeScript PDF Viewer. platform: document-processing control: Text search -publishingplatform: Typescript documentation: ug domainurl: ##DomainURL## --- -# Text search in Typescript Pdfviewer control +# Text search in TypeScript PDF Viewer control -The Text Search option in PDF Viewer is used to find and highlight the text content from the document. You can enable/disable the text search using the following code snippet. +The text search feature in the PDF Viewer locates and highlights matching content within a document. Enable or disable this capability with the following configuration. ```html @@ -23,7 +22,7 @@ The Text Search option in PDF Viewer is used to find and highlight the text cont - + @@ -69,45 +68,98 @@ pdfviewer.appendTo('#PdfViewer'); ## Text search features -### Real time search suggestion while typing -Entering text into the search input dynamically displays search suggestions based on the provided input. The suggestions are updated in real-time as text is typed, offering relevant matches from the available content. This feature enhances the search experience by allowing quick access to potential results while typing. +### Real-time search suggestions while typing +Typing in the search box immediately surfaces suggestions that match the entered text. The list refreshes on every keystroke so users can quickly jump to likely results without completing the entire term. -![Alt text](./images/SingleSearchPopup.png) +![Search suggestion popup](./images/SingleSearchPopup.png) -### Selecting Search Suggestions from the Popup -Entering text into the search input triggers a popup displaying relevant suggestions based on the input. Selecting a suggestion from the popup enables direct navigation to its occurrences in the document. +### Select search suggestions from the popup +After typing in the search box, the popup lists relevant matches. Selecting an item jumps directly to the corresponding occurrence in the PDF. -![Alt text](./images/SearchResultFromPopup.png) +![Search results from popup](./images/SearchResultFromPopup.png) -### Search Text with enabling 'Match Case' checkbox -By enabling the 'Match Case' option and entering text into the search input, only the exact case-sensitive matches in the document are highlighted. This feature allows navigation through each occurrence of the exact text match within the document. +### Search text with the Match Case option +Enable the Match Case checkbox to limit results to case-sensitive matches. Navigation commands then step through each exact match in sequence. -![Alt text](./images/SearchNavigationMatchCase.png) +![Match case navigation](./images/SearchNavigationMatchCase.png) -### Search Text without enabling 'Match Case' checkbox -When text is entered into the search input without enabling the 'Match Case' option, all instances of the text, regardless of case, are highlighted in the document. This allows easy navigation through every occurrence of the search term. +### Search text without Match Case +Leave the Match Case option cleared to highlight every occurrence of the query, regardless of capitalization, and navigate through each result. -![Alt text](./images/SearchNavigationNoMatchCase.png) +![Search navigation without match case](./images/SearchNavigationNoMatchCase.png) -### Search list of text by enabling 'Match Any Word' checkbox -When the 'Match Any Word' option is enabled, the entered text in the search input is split into individual words based on spaces. As the text is typed, the popup dynamically displays search suggestions for each word in real time, highlighting potential matches within the document. +### Search a list of words with Match Any Word +Enable Match Any Word to split the query into separate words. The popup proposes matches for each word and highlights them throughout the document. -![Alt text](./images/MultiSearchPopup.png) +![Match any word search results](./images/MultiSearchPopup.png) + +### Programmatic search with settings + +While the PDF Viewer toolbar offers an interactive search experience, you can also trigger and customize searches programmatically by calling the `searchText` method with tailored options. + +#### Using `searchText` + +Use the `searchText` method to start a search with optional filters that control case sensitivity and whole-word behavior. + +```typescript +// searchText(text: string, isMatchCase?: boolean, isMatchWholeWord?: boolean) +pdfviewer.textSearch.searchText('search text', false, false); +``` + +- `isMatchCase` (optional boolean): Determines whether the search should be case-sensitive. +- `isMatchWholeWord` (optional boolean): Ensures the entire string is matched as a standalone word. + +#### Match Case + +Set the `isMatchCase` parameter to `true` to perform a case-sensitive search that mirrors the Match Case option in the search panel. + +```typescript +import { PdfViewer } from '@syncfusion/ej2-pdfviewer'; + +let pdfviewer: PdfViewer = new PdfViewer({ + documentPath:'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf' +}); +pdfviewer.appendTo('#PdfViewer'); + +// Later, to search programmatically: +// This will only find instances of "PDF" in uppercase. +pdfviewer.textSearch.searchText('PDF', true); +``` + +#### Match Whole Word + +Set the `isMatchWholeWord` parameter to `true` to restrict results to whole-word matches. For example, a search for "view" will not match "viewer". + +```typescript +import { PdfViewer } from '@syncfusion/ej2-pdfviewer'; + +let pdfviewer: PdfViewer = new PdfViewer({ + documentPath:'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf' +}); +pdfviewer.appendTo('#PdfViewer'); + +// Later, to search programmatically: +// This will find "pdf" but not "pdf-succinctly" +pdfviewer.textSearch.searchText('pdf', false, true); +``` + +**Note on Match Any Word:** The Match Any Word checkbox in the toolbar splits the input into multiple words and searches for each term individually. This differs from the `isMatchWholeWord` parameter, which enforces a whole-word match on the entire query string. The following text search methods are available in the PDF Viewer, -* [**Search text**](https://ej2.syncfusion.com/documentation/api/pdfviewer/textSearch/#searchtext):- Searches the target text in the PDF document and highlights the occurrences in the pages. -* [**Search next**](https://ej2.syncfusion.com/documentation/api/pdfviewer/textSearch/#searchnext):- Searches the next occurrence of the searched text from the current occurrence of the PdfViewer. -* [**Search previous**](https://ej2.syncfusion.com/documentation/api/pdfviewer/textSearch/#searchprevious):- Searches the previous occurrence of the searched text from the current occurrence of the PdfViewer. -* [**Cancel text search**](https://ej2.syncfusion.com/documentation/api/pdfviewer/textSearch/#canceltextsearch):- The text search can be canceled and the highlighted occurrences from the PDF Viewer can be removed . +* [**Search text**](https://ej2.syncfusion.com/documentation/api/pdfviewer/textSearch/#searchtext): Searches the target text in the PDF document and highlights each occurrence in the pages. +* [**Search next**](https://ej2.syncfusion.com/documentation/api/pdfviewer/textSearch/#searchnext): Searches the next occurrence of the current query from the active match. +* [**Search previous**](https://ej2.syncfusion.com/documentation/api/pdfviewer/textSearch/#searchprevious): Searches the previous occurrence of the current query from the active match. +* [**Cancel text search**](https://ej2.syncfusion.com/documentation/api/pdfviewer/textSearch/#canceltextsearch): Cancels the current text search and removes the highlighted occurrences from the PDF Viewer. ![Alt text](./images/search.png) ## Find text method -Searches for the specified text or an array of strings within the document and returns the bounding rectangles for each occurrence. The search can be case-sensitive based on the provided parameters. If a specific page index is provided, it returns the bounding rectangles for these search strings on that page; otherwise, it returns the bounding rectangles for all pages in the document where the strings were found. +Use the `findText` method to locate a string or an array of strings and return the bounding rectangles for each match. Optional parameters support case-sensitive comparisons and page scoping so you can retrieve coordinates for a single page or the entire document. ### Find and get the bounds of a text -Searches for the specified text within the document and returns the bounding rectangles of the matched text. The search can be case-sensitive based on the provided parameter. It returns the bounding rectangles for all pages in the document where the text was found. The below code snippet shows how to get the bounds of the given text: +Searches for the specified text within the document and returns the bounding rectangles of the matched text. The search can be case-sensitive based on the provided parameter. It returns the bounding rectangles for all pages in the document where the text was found. The following code snippet shows how to get the bounds of the specified text: +The following code snippet shows how to get the bounds of the specified text: ```html
    @@ -150,7 +202,8 @@ import { PdfViewer, Toolbar, Magnification, Navigation, LinkAnnotation,Thumbnail {% endtabs %} ### Find and get the bounds of a text on the desired page -Searches for the specified text within the document and returns the bounding rectangles of the matched text. The search can be case-sensitive based on the provided parameter. It returns the bounding rectangles for that page in the document where the text was found. The below code snippet shows how to get the bounds of the given text from the desired page: +Searches for the specified text within the document and returns the bounding rectangles of the matched text. The search can be case-sensitive based on the provided parameter. It returns the bounding rectangles for that page in the document where the text was found. The following code snippet shows how to retrieve bounds for the specified text on a selected page: +The following code snippet shows how to retrieve bounds for the specified text on a selected page: ```html
    @@ -278,9 +331,83 @@ import { PdfViewer, Toolbar, Magnification, Navigation, LinkAnnotation,Thumbnail {% endhighlight %} {% endtabs %} -[View sample in GitHub](https://github.com/SyncfusionExamples/typescript-pdf-viewer-examples/tree/master/How%20to/TextSearch) +## Text Search Events + +The PDF Viewer triggers events during text search operations, allowing you to customize behavior and respond to different stages of the search process. + +### textSearchStart + +The [textSearchStart](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#textsearchstartevent) event fires as soon as a search begins from the toolbar interface or through the `textSearch.searchText` method. Use it to reset UI state, log analytics, or cancel the default search flow before results are processed. + +- Event arguments: [TextSearchStartEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/textSearchStartEventArgs/) exposes: + - `searchText`: the term being searched. + - `matchCase`: indicates whether case-sensitive search is enabled. + - `isMatchWholeWord`: indicates whether whole-word matching is enabled. + - `name`: event name. + - `cancel`: set to `true` to stop the default search. + +```typescript +const viewer: PdfViewer = new PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + textSearchStart: function (args: any) { + // args.searchText contains the term being searched + // args.cancel can be set to true to stop the default search + console.log(`Text search started for: "${args.searchText}"`); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +### textSearchHighlight + +The [textSearchHighlight](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#textsearchhighlightevent) event triggers whenever a search result is brought into view, including navigation between matches. Use it to draw custom overlays or synchronize adjacent UI elements when a match is highlighted. + +- Event arguments: [TextSearchHighlightEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/textSearchHighlightEventArgs/) exposes: + - `bounds`: `RectangleBoundsModel | RectangleBoundsModel[]` representing the highlighted match. + - `pageNumber`: page index where the match is highlighted. + - `searchText`: the active search term. + - `matchCase`: indicates whether case-sensitive search was used. + - `name`: event name. + +```typescript +const viewer: PdfViewer = new PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + textSearchHighlight: function (args: any) { + // args.bounds provides the rectangle(s) of the current match + console.log('Highlighted match bounds:', args.bounds); + } +}); +viewer.appendTo('#pdfViewer'); +``` + +### textSearchComplete + +The [textSearchComplete](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#textsearchcompleteevent) event runs after the search engine finishes scanning the document for the current query. Use it to update match counts, toggle navigation controls, or notify users when no results were found. + +- Typical uses: + - Update UI with the total number of matches and enable navigation controls. + - Hide loading indicators or show a "no results" message if none were found. + - Record analytics for search effectiveness. +- Event arguments: [TextSearchCompleteEventArgs](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/textSearchCompleteEventArgs/) exposes: + - `totalMatches`: total number of occurrences found. + - `isMatchFound`: indicates whether at least one match was found. + - `searchText`: the searched term. + - `matchCase`: indicates whether case-sensitive search was used. + - `name`: event name. + +```typescript +const viewer: PdfViewer = new PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + textSearchComplete: (args: any) => { + // args.totalMatches may indicate how many results were found (when available) + console.log('Text search completed.', args); + } +}); +viewer.appendTo('#pdfViewer'); +``` ## See also * [Toolbar items](./toolbar) -* [Feature Modules](./feature-module) \ No newline at end of file +* [Feature modules](./feature-module) +* [Text selection](./textselection) diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es6/textselection.md b/Document-Processing/PDF/PDF-Viewer/javascript-es6/textselection.md new file mode 100644 index 000000000..ebf7ee098 --- /dev/null +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es6/textselection.md @@ -0,0 +1,130 @@ +--- +layout: post +title: Text selection in TypeScript PDF Viewer control | Syncfusion +description: Learn how to configure text selection, react to selection events, and manage copy workflows in the Syncfusion TypeScript PDF Viewer. +platform: document-processing +control: Text selection +documentation: ug +domainurl: ##DomainURL## +--- +# Text selection in TypeScript PDF Viewer control + +The TextSelection module lets users highlight and copy text from the loaded PDF. Selection is enabled by default and can be configured or monitored programmatically to match application workflows. + +## Enable or disable text selection + +Use the `enableTextSelection` property to enable or disable choosing text in the PDF Viewer. + +```html + + + + + Essential JS 2 + + + + + + + + + + + + + + + + + +
    + + + +``` + +{% tabs %} +{% highlight ts tabtitle="Standalone" %} + +import { PdfViewer, Toolbar, Magnification, Navigation, LinkAnnotation, ThumbnailView, BookmarkView, TextSelection } from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject(Toolbar, Magnification, Navigation, LinkAnnotation, ThumbnailView, BookmarkView, TextSelection); + +let pdfviewer: PdfViewer = new PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + enableTextSelection: true // Defaults to true +}); +pdfviewer.appendTo('#PdfViewer'); + +// Disable text selection later if required +pdfviewer.enableTextSelection = false; + +{% endhighlight %} +{% highlight ts tabtitle="Server-Backed" %} + +import { PdfViewer, Toolbar, Magnification, Navigation, LinkAnnotation, ThumbnailView, BookmarkView, TextSelection } from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject(Toolbar, Magnification, Navigation, LinkAnnotation, ThumbnailView, BookmarkView, TextSelection); + +let pdfviewer: PdfViewer = new PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + enableTextSelection: true +}); +pdfviewer.serviceUrl = 'https://document.syncfusion.com/web-services/pdf-viewer/api/pdfviewer/'; +pdfviewer.appendTo('#PdfViewer'); + +// Toggle on demand +pdfviewer.enableTextSelection = false; + +{% endhighlight %} +{% endtabs %} + +## Text selection events + +Monitor user interaction with selection events to coordinate downstream actions such as showing tooltips, enabling context menus, or storing analytics. + +### textSelectionStart + +The [textSelectionStart](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#textselectionstartevent) event fires when a user begins selecting text. Use it to reset temporary UI, pause conflicting shortcuts, or capture the starting context. + +- Event arguments: `TextSelectionStartEventArgs` supplies details such as `pageNumber`, `bounds`, and `selectionBehavior`. + +```ts +import { PdfViewer } from '@syncfusion/ej2-pdfviewer'; + +const viewer: PdfViewer = new PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + textSelectionStart: (args: any) => { + // args.pageNumber, args.bounds provide the starting context + console.log('Selection started', args); + } +}); +viewer.appendTo('#PdfViewer'); +``` + +### textSelectionEnd + +The [textSelectionEnd](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/#textselectionendevent) event triggers after the selection is finalized. Use it to access the selected text, toggle contextual commands, or store telemetry. + +- Event arguments: `TextSelectionEndEventArgs` includes `pageNumber`, `bounds`, `selectedText`, and `isSelectionCopied`. + +```ts +import { PdfViewer } from '@syncfusion/ej2-pdfviewer'; + +const viewer: PdfViewer = new PdfViewer({ + documentPath: 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + textSelectionEnd: (args: any) => { + // For example, automatically copy or show a custom menu + console.log('Selection ended', args); + } +}); +viewer.appendTo('#PdfViewer'); +``` + + +## See also + +- [Text search](./text-search) +- [Interaction modes](./interaction-mode) +- [Toolbar items](./toolbar) diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es6/toolbar-customization/annotation-toolbar-customization.md b/Document-Processing/PDF/PDF-Viewer/javascript-es6/toolbar-customization/annotation-toolbar-customization.md new file mode 100644 index 000000000..ac3c56eab --- /dev/null +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es6/toolbar-customization/annotation-toolbar-customization.md @@ -0,0 +1,148 @@ +--- +layout: post +title: Annotation Toolbar Customization in TypeScript PDF Viewer control | Syncfusion +description: Learn here all about annotation toolbar customization in Syncfusion TypeScript PDF Viewer control of Syncfusion Essential JS 2 and more. +platform: document-processing +control: Annotation Toolbar Customization +publishingplatform: PDF Viewer +documentation: ug +domainurl: ##DomainURL## +--- + +# Annotation Toolbar Customization + +The annotation toolbar can be customized by showing or hiding default items and by controlling the order in which they appear. + +## Show or hide the annotation toolbar + +Show or hide the annotation toolbar programmatically during initialization or at runtime. + +Use the [EnableAnnotationToolbar](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/pdfViewerModel/#enableannotationtoolbar) property or the [showAnnotationToolbar](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/toolbar/#showannotationtoolbar) method to toggle visibility. + +The following code snippet explains how to show or hide the annotation toolbar using the `showAnnotationToolbar` method. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} +import { PdfViewer, Toolbar, Magnification, Navigation, Annotation, LinkAnnotation, + ThumbnailView, BookmarkView, TextSelection, TextSearch, FormFields, FormDesigner} from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject( Toolbar, Magnification, Navigation, Annotation, LinkAnnotation, ThumbnailView, + BookmarkView, TextSelection, TextSearch, FormFields, FormDesigner ); + +let pdfviewer: PdfViewer = new PdfViewer({ + documentPath:'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl:"https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib" +}); +pdfviewer.appendTo('#PdfViewer'); +document.getElementById('set').addEventListener('click', ()=> { + pdfviewer.toolbar.showAnnotationToolbar(false); +}); + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + + + + + + EJ2 PDF Viewer + + + + + + + + + + + + +
    Loading....
    + +
    +
    +
    + + + +{% endhighlight %} +{% endtabs %} + +## How to customize the annotation toolbar + +Choose which tools appear and control their order in the annotation toolbar. + +Use [`PdfViewerToolbarSettings`](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/toolbarSettings/) with the [`AnnotationToolbarItems`](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/toolbarSettings/#annotationtoolbaritems) property to choose which tools are displayed in the annotation toolbar. The property accepts a list of [`AnnotationToolbarItem`](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/annotationToolbarItem/) values. Only the items included in this list are shown; any item not listed is hidden. The rendered order follows the sequence of items in the list. + +The annotation toolbar is presented when entering annotation mode in PdfViewer and adapts responsively based on the available width. Include the Close tool to allow users to exit the annotation toolbar when needed. + +The following example demonstrates how to customize the annotation toolbar by specifying a selected set of tools using `AnnotationToolbarItem`. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} +import { PdfViewer, Toolbar, Magnification, Navigation, Annotation, LinkAnnotation, + ThumbnailView, BookmarkView, TextSelection, TextSearch, FormFields, FormDesigner, AnnotationToolbarItem} from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject( Toolbar, Magnification, Navigation, Annotation, LinkAnnotation, ThumbnailView, + BookmarkView, TextSelection, TextSearch, FormFields, FormDesigner ); + +let pdfviewer: PdfViewer = new PdfViewer({ + documentPath:'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl:"https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib", +}); + pdfviewer.toolbarSettings = { + annotationToolbarItems: [ + "HighlightTool", + "UnderlineTool", + "StrikethroughTool", + "ColorEditTool", + "OpacityEditTool", + "AnnotationDeleteTool", + "StampAnnotationTool", + "HandWrittenSignatureTool", + "InkAnnotationTool", + "ShapeTool", + "CalibrateTool", + "StrokeColorEditTool", + "ThicknessEditTool", + "FreeTextAnnotationTool", + "FontFamilyAnnotationTool", + "FontSizeAnnotationTool", + "FontStylesAnnotationTool", + "FontAlignAnnotationTool", + "FontColorAnnotationTool", + "CommentPanelTool" + ] + }; +pdfviewer.appendTo('#PdfViewer'); + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + + + + + + EJ2 PDF Viewer + + + + + + + + + + + + +
    Loading....
    +
    +
    +
    + + + +{% endhighlight %} +{% endtabs %} diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es6/toolbar-customization/custom-toolbar.md b/Document-Processing/PDF/PDF-Viewer/javascript-es6/toolbar-customization/custom-toolbar.md new file mode 100644 index 000000000..9c0824b69 --- /dev/null +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es6/toolbar-customization/custom-toolbar.md @@ -0,0 +1,1093 @@ +--- +layout: post +title: Custom Toolbar in TypeScript PDF Viewer Component | Syncfusion +description: Learn here all about custom toolbar in Syncfusion TypeScript PDF Viewer component of Syncfusion Essential JS 2 and more. +platform: document-processing +control: PDF Viewer +documentation: ug +domainurl: ##DomainURL## +--- + +# Custom Toolbar + +The PDF Viewer provides APIs for user interaction options available in its built-in toolbar. Using these, you can create your own custom user interface for toolbar actions at the application level by hiding the default toolbar. + +Follow these steps to create a custom toolbar for the PDF Viewer: + +**Step 1: Create a simple PDF Viewer sample.** + +Follow the steps provided in the [getting started](https://ej2.syncfusion.com/javascript/documentation/pdfviewer/getting-started/) guide to create a basic PDF Viewer sample. + +**Step 2: Add HTML elements for the custom toolbar.** + +Add HTML `div` elements to act as containers for the custom toolbar actions: + +```html + + + + + Essential JS 2 + + + + + + + + + + + + + + + +
    +
    +
    + + +
    +
    + + + + + + +
    +
    + +
    +
    + + +``` + +**Step 3: Import and inject the necessary modules.** + +Import and inject the modules required for the custom toolbar functionality: + +```ts +import { + PdfViewer, Toolbar, Magnification, Navigation, LinkAnnotation, BookmarkView, ThumbnailView, Print, + IPageChangeEventArgs, ILoadEventArgs, TextSearch, TextSelection +} from '@syncfusion/ej2-pdfviewer'; +import { Toolbar as Tool, TreeView, NodeSelectEventArgs } from '@syncfusion/ej2-navigations'; +import { ClickEventArgs, Button, CheckBox, ChangeEventArgs } from '@syncfusion/ej2-buttons'; +import { Dialog } from '@syncfusion/ej2-popups'; + +PdfViewer.Inject(Toolbar, Magnification, Navigation, LinkAnnotation, BookmarkView, ThumbnailView, Print, TextSearch, TextSelection); + +``` + +**Step 4: Hide the default toolbar of the PDF Viewer.** + +Hide the default toolbar using `enableToolbar` and `enableThumbnail` properties: + +{% tabs %} +{% highlight ts tabtitle="Standalone" %} + +```ts + + let viewer: PdfViewer = new PdfViewer({ + enableToolbar: false, + enableThumbnail: false, + documentPath: 'https://cdn.syncfusion.com/content/pdf/hive-succinctly.pdf' + }); + viewer.appendTo('#pdfViewer'); + +``` +{% endhighlight %} +{% highlight ts tabtitle="Server-Backed" %} + +```ts + + let viewer: PdfViewer = new PdfViewer({ + enableToolbar: false, + enableThumbnail: false, + documentPath: 'https://cdn.syncfusion.com/content/pdf/hive-succinctly.pdf', + serviceUrl: 'https://document.syncfusion.com/web-services/pdf-viewer/api/pdfviewer/' + }); + viewer.appendTo('#pdfViewer'); + +``` +{% endhighlight %} +{% endtabs %} + +**Step 5: Add EJ2 Toolbar for primary actions.** + +Add Syncfusion EJ2 Toolbar components to perform primary actions like Open, Previous page, Next page, Go to page, Print, and Download: + +```ts + let toolbarObj: Tool = new Tool({ + items: [ + { prefixIcon: 'e-pv-open-document', tooltipText: 'Open', id: 'openButton', click: openDocument.bind(this) }, + { prefixIcon: 'e-pv-bookmark-icon', tooltipText: 'Bookmark', id: 'bookmarkButton', click: bookmarkClicked }, + // tslint:disable-next-line:max-line-length + { prefixIcon: 'e-pv-previous-page-navigation-icon', id: 'previousPage', tooltipText: 'Previous Page', align: 'Center', click: previousClicked.bind(this) }, + // tslint:disable-next-line:max-line-length + { prefixIcon: 'e-pv-next-page-navigation-icon', id: 'nextPage', tooltipText: 'Next Page', align: 'Center', click: nextClicked.bind(this) }, + { template: inputTemplate, tooltipText: 'Page Number', align: 'Center' }, + { template: ele, tooltipText: 'Page Number', align: 'Center' }, + { prefixIcon: 'e-pv-search-icon', tooltipText: 'Text Search', align: 'Right', click: searchClicked.bind(this) }, + { prefixIcon: 'e-pv-print-document-icon', tooltipText: 'Print', align: 'Right', click: printClicked.bind(this) }, + { prefixIcon: 'e-pv-download-document-icon', tooltipText: 'Download', align: 'Right', click: downloadClicked.bind(this) } + ] + }); + toolbarObj.appendTo('#topToolbar'); + +``` + +**Step 6: Add EJ2 Toolbar for magnification actions.** + +Add Syncfusion EJ2 Toolbar components to perform magnification actions in the PDF Viewer: + +```ts + + let magnificationToolbar: Tool = new Tool({ + items: [ + { prefixIcon: 'e-pv-fit-page-icon', id: 'fitPage', tooltipText: 'Fit to page', click: pageFitClicked.bind(this) }, + { prefixIcon: 'e-pv-zoom-in-icon', id: 'zoomIn', tooltipText: 'Zoom in', click: zoomInClicked.bind(this) }, + { prefixIcon: 'e-pv-zoom-out-icon', id: 'zoomOut', tooltipText: 'Zoom out', click: zoomOutClicked.bind(this) }, + ] + }); + magnificationToolbar.appendTo('#magnificationToolbar'); + +``` + +**Step 7: Add custom toolbar styling.** + +Add the following CSS styles to achieve the desired custom toolbar styling: + +```css + +``` + +> The icons are embedded in the font file used in the above code snippet. + +**Step 8: Add scripts for PDF Viewer user interaction.** + +Add the following scripts for handling user interactions with the custom toolbar: + +{% tabs %} +{% highlight ts tabtitle="Standalone" %} +```ts + +import { + PdfViewer, Toolbar, Magnification, Navigation, LinkAnnotation, BookmarkView, ThumbnailView, Print, + IPageChangeEventArgs, ILoadEventArgs, TextSearch, TextSelection +} from '@syncfusion/ej2-pdfviewer'; +import { Toolbar as Tool, TreeView, NodeSelectEventArgs } from '@syncfusion/ej2-navigations'; +import { ClickEventArgs, Button, CheckBox, ChangeEventArgs } from '@syncfusion/ej2-buttons'; +import { Dialog } from '@syncfusion/ej2-popups'; + +PdfViewer.Inject(Toolbar, Magnification, Navigation, LinkAnnotation, BookmarkView, ThumbnailView, Print, TextSearch, TextSelection); + +/** + * Default PdfViewer sample + */ + +let inputTemplate: string = '
    '; +let ele: string = '
    of 0
    '; +let isBookmarkOpen: boolean = false; +let isBookmarkClick: boolean = false; +let isTextSearchBoxOpen: boolean = false; +let bookmarkPopup: Dialog; +let textSearchPopup: Dialog; +let toolbarObj: Tool; +let viewer: PdfViewer; +let currentPageBox: HTMLElement; +let searchInput: HTMLElement; +let searchButton: HTMLElement; +let matchCase: boolean = false; + +function previousClicked(args: ClickEventArgs): void { + hidePopups(); + viewer.navigation.goToPreviousPage(); +} + +function hidePopups(): void { + isBookmarkOpen = false; + isTextSearchBoxOpen = false; + bookmarkPopup.hide(); + textSearchPopup.hide(); +} + +function bookmarkClicked(): void { + textSearchPopup.hide(); + if (!isBookmarkOpen) { + let bookmarkDetails: any = viewer.bookmark.getBookmarks(); + if (bookmarkDetails.bookmarks) { + let bookmarks: any = bookmarkDetails.bookmarks.bookMark; + let treeObj: TreeView = new TreeView({ + fields: + { + dataSource: bookmarks, + id: 'Id', + parentID: 'Pid', + text: 'Title', + hasChildren: 'HasChild', + }, nodeSelected: nodeClick + }); + treeObj.appendTo('#bookmarkview'); + bookmarkPopup.show(); + isBookmarkOpen = true; + isBookmarkClick = true; + } else { + toolbarObj.enableItems(document.getElementById('bookmarkButton'), false); + isBookmarkOpen = false; + } + } else { + if (!isBookmarkClick) { + bookmarkPopup.show(); + isBookmarkClick = true; + } else { + bookmarkPopup.hide(); + isBookmarkClick = false; + } + } +} + +function nextClicked(args: ClickEventArgs): void { + hidePopups(); + viewer.navigation.goToNextPage(); +} + +function searchClicked(args: ClickEventArgs): void { + bookmarkPopup.hide(); + if (!isTextSearchBoxOpen) { + textSearchPopup.show(); + } else { + viewer.textSearch.cancelTextSearch(); + textSearchPopup.hide(); + } + isTextSearchBoxOpen = !isTextSearchBoxOpen; +} + +function printClicked(args: ClickEventArgs): void { + hidePopups(); + viewer.print.print(); +} + +function downloadClicked(args: ClickEventArgs): void { + hidePopups(); + viewer.download(); +} + +function pageFitClicked(args: ClickEventArgs): void { + hidePopups(); + viewer.magnification.fitToPage(); + updateZoomButtons(); + toolbarObj.enableItems(document.getElementById('fitPage'), false); +} + +function zoomInClicked(args: ClickEventArgs): void { + hidePopups(); + viewer.magnification.zoomIn(); + updateZoomButtons(); +} + +function zoomOutClicked(args: ClickEventArgs): void { + hidePopups(); + viewer.magnification.zoomOut(); + updateZoomButtons(); +} + +function onCurrentPageBoxKeypress(event: KeyboardEvent): boolean { + if ((event.which < 48 || event.which > 57) && event.which !== 8 && event.which !== 13) { + event.preventDefault(); + return false; + } else { + // tslint:disable-next-line:radix + let currentPageNumber: number = parseInt((currentPageBox as HTMLInputElement).value); + if (event.which === 13) { + if (currentPageNumber > 0 && currentPageNumber <= viewer.pageCount) { + viewer.navigation.goToPage(currentPageNumber); + } else { + (currentPageBox as HTMLInputElement).value = viewer.currentPageNumber.toString(); + } + } + return true; + } +} + +function onCurrentPageBoxClicked(): void { + (currentPageBox as HTMLInputElement).select(); + (currentPageBox).focus(); +} + +function readFile(args: any): void { + // tslint:disable-next-line + let upoadedFiles: any = args.target.files; + if (args.target.files[0] !== null) { + let uploadedFile: File = upoadedFiles[0]; + if (uploadedFile) { + let reader: FileReader = new FileReader(); + let filename: string = upoadedFiles[0].name; + reader.readAsDataURL(uploadedFile); + // tslint:disable-next-line + reader.onload = (e: any): void => { + let uploadedFileUrl: string = e.currentTarget.result; + viewer.load(uploadedFileUrl, null); + viewer.fileName = filename; + (currentPageBox as HTMLInputElement).value = '1'; + document.getElementById('totalPage').textContent = 'of ' + viewer.pageCount; + document.getElementById('bookmarkview').innerHTML = ''; + isBookmarkOpen = false; + }; + } + } +} + +function openDocument(e: ClickEventArgs): void { + document.getElementById('fileUpload').click(); +} + +function updatePageNavigation(): void { + if (viewer.currentPageNumber === 1) { + toolbarObj.enableItems(document.getElementById('previousPage'), false); + toolbarObj.enableItems(document.getElementById('nextPage'), true); + } else if (viewer.currentPageNumber === viewer.pageCount) { + toolbarObj.enableItems(document.getElementById('previousPage'), true); + toolbarObj.enableItems(document.getElementById('nextPage'), false); + } else { + toolbarObj.enableItems(document.getElementById('previousPage'), true); + toolbarObj.enableItems(document.getElementById('nextPage'), true); + } +} + +function updateZoomButtons(): void { + if (viewer.zoomPercentage <= 50) { + toolbarObj.enableItems(document.getElementById('zoomIn'), true); + toolbarObj.enableItems(document.getElementById('zoomOut'), false); + toolbarObj.enableItems(document.getElementById('fitPage'), true); + } else if (viewer.zoomPercentage >= 400) { + toolbarObj.enableItems(document.getElementById('zoomIn'), false); + toolbarObj.enableItems(document.getElementById('zoomOut'), true); + toolbarObj.enableItems(document.getElementById('fitPage'), true); + } else { + toolbarObj.enableItems(document.getElementById('zoomIn'), true); + toolbarObj.enableItems(document.getElementById('zoomOut'), true); + toolbarObj.enableItems(document.getElementById('fitPage'), true); + } +} + +function nodeClick(args: NodeSelectEventArgs): boolean { + let bookmarksDetails: any = viewer.bookmark.getBookmarks(); + let bookmarksDestination: any = bookmarksDetails.bookmarksDestination; + let bookid: number = Number(args.nodeData.id); + let pageIndex: number = bookmarksDestination.bookMarkDestination[bookid].PageIndex; + let Y: number = bookmarksDestination.bookMarkDestination[bookid].Y; + viewer.bookmark.goToBookmark(pageIndex, Y); + return false; +} + +function searchInputKeypressed(event: KeyboardEvent): void { + enablePrevButton(true); + enableNextButton(true); + if (event.which === 13) { + initiateTextSearch(); + updateSearchInputIcon(false); + } +} + +function searchClickHandler(): void { + if (searchButton.classList.contains('e-pv-search-icon')) { + viewer.textSearch.cancelTextSearch(); + initiateTextSearch(); + } else if (searchButton.classList.contains('e-pv-search-close')) { + (searchInput as HTMLInputElement).value = ''; + searchInput.focus(); + viewer.textSearch.cancelTextSearch(); + } +} + +function initiateTextSearch(): void { + let searchString: string = (searchInput as HTMLInputElement).value; + viewer.textSearch.searchText(searchString, matchCase); +} + +function previousSearchClicked(): void { + let searchString: string = (searchInput as HTMLInputElement).value; + if (searchString) { + viewer.textSearch.searchPrevious(); + } +} + +function nextSearchClicked(): void { + let searchString: string = (searchInput as HTMLInputElement).value; + if (searchString) { + viewer.textSearch.searchNext(); + } +} + +function checkBoxChanged(args: ChangeEventArgs): void { + if (args.checked) { + matchCase = true; + } else { + matchCase = false; + } + initiateTextSearch(); +} + +function enablePrevButton(isEnable: boolean): void { + let previousSearchButton: HTMLElement = document.getElementById('previousSearch'); + if (isEnable) { + previousSearchButton.removeAttribute('disabled'); + } else { + (previousSearchButton as HTMLButtonElement).disabled = true; + } +} + +function enableNextButton(isEnable: boolean): void { + let nextSearchButton: HTMLElement = document.getElementById('nextSearch'); + if (isEnable) { + nextSearchButton.removeAttribute('disabled'); + } else { + (nextSearchButton as HTMLButtonElement).disabled = true; + } +} + +function updateSearchInputIcon(isEnable: boolean): void { + if (isEnable) { + searchButton.classList.remove('e-pv-search-close'); + searchButton.classList.add('e-pv-search-icon'); + } else { + searchButton.classList.remove('e-pv-search-icon'); + searchButton.classList.add('e-pv-search-close'); + } +} + + + toolbarObj = new Tool({ + items: [ + { prefixIcon: 'e-pv-open-document', tooltipText: 'Open', id: 'openButton', click: openDocument.bind(this) }, + { prefixIcon: 'e-pv-bookmark-icon', tooltipText: 'Bookmark', id: 'bookmarkButton', click: bookmarkClicked }, + // tslint:disable-next-line:max-line-length + { prefixIcon: 'e-pv-previous-page-navigation-icon', id: 'previousPage', tooltipText: 'Previous Page', align: 'Center', click: previousClicked.bind(this) }, + // tslint:disable-next-line:max-line-length + { prefixIcon: 'e-pv-next-page-navigation-icon', id: 'nextPage', tooltipText: 'Next Page', align: 'Center', click: nextClicked.bind(this) }, + { template: inputTemplate, tooltipText: 'Page Number', align: 'Center' }, + { template: ele, tooltipText: 'Page Number', align: 'Center' }, + { prefixIcon: 'e-pv-search-icon', tooltipText: 'Text Search', align: 'Right', click: searchClicked.bind(this) }, + { prefixIcon: 'e-pv-print-document-icon', tooltipText: 'Print', align: 'Right', click: printClicked.bind(this) }, + { prefixIcon: 'e-pv-download-document-icon', tooltipText: 'Download', align: 'Right', click: downloadClicked.bind(this) } + ] + }); + toolbarObj.appendTo('#topToolbar'); + let magnificationToolbar: Tool = new Tool({ + items: [ + { prefixIcon: 'e-pv-fit-page-icon', id: 'fitPage', tooltipText: 'Fit to page', click: pageFitClicked.bind(this) }, + { prefixIcon: 'e-pv-zoom-in-icon', id: 'zoomIn', tooltipText: 'Zoom in', click: zoomInClicked.bind(this) }, + { prefixIcon: 'e-pv-zoom-out-icon', id: 'zoomOut', tooltipText: 'Zoom out', click: zoomOutClicked.bind(this) }, + ] + }); + magnificationToolbar.appendTo('#magnificationToolbar'); + viewer = new PdfViewer({ + enableToolbar: false, + enableThumbnail: false, + documentPath: 'https://cdn.syncfusion.com/content/pdf/hive-succinctly.pdf' + }); + viewer.appendTo('#pdfViewer'); + document.getElementById('fileUpload').addEventListener('change', readFile, false); + currentPageBox = document.getElementById('currentPage'); + (currentPageBox as HTMLInputElement).value = '1'; + searchInput = document.getElementById('searchInput'); + bookmarkPopup = new Dialog({ + showCloseIcon: true, header: 'Bookmarks', closeOnEscape: false, isModal: false, target: document.getElementById('pdfViewer'), + content: '
    ', + buttons: [{ + buttonModel: {}, + }], position: { X: 'left', Y: 'top' }, cssClass: 'e-bookmark-popup', beforeClose: (): void => { + isBookmarkOpen = false; + } + }); + bookmarkPopup.appendTo('#popup'); + + textSearchPopup = new Dialog({ + showCloseIcon: false, closeOnEscape: false, isModal: false, target: document.getElementById('pdfViewer'), + buttons: [{ + buttonModel: {}, + }], position: { X: 'right', Y: 'top' }, cssClass: 'e-text-search-popup', + }); + textSearchPopup.appendTo('#textSearchBox'); + + let previousSearch: Button = new Button({ iconCss: 'e-pv-previous-search' }); + previousSearch.appendTo('#previousSearch'); + + let nextSearch: Button = new Button({ iconCss: 'e-pv-next-search-btn' }); + nextSearch.appendTo('#nextSearch'); + + let matchCaseCheck: CheckBox = new CheckBox({ label: 'Match case', change: checkBoxChanged }); + matchCaseCheck.appendTo('#matchCase'); + + viewer.pageChange = (args: IPageChangeEventArgs): void => { + (currentPageBox as HTMLInputElement).value = viewer.currentPageNumber.toString(); + updatePageNavigation(); + }; + + viewer.documentLoad = (args: ILoadEventArgs): void => { + document.getElementById('totalPage').textContent = 'of ' + viewer.pageCount; + updatePageNavigation(); + }; + searchButton = document.getElementById('searchBtn'); + searchInput.addEventListener('focus', () => { searchInput.parentElement.classList.add('e-input-focus'); }); + searchInput.addEventListener('blur', () => { searchInput.parentElement.classList.remove('e-input-focus'); }); + searchInput.addEventListener('keypress', searchInputKeypressed); + document.getElementById('previousSearch').addEventListener('click', previousSearchClicked); + document.getElementById('nextSearch').addEventListener('click', nextSearchClicked); + currentPageBox.addEventListener('keypress', onCurrentPageBoxKeypress); + currentPageBox.addEventListener('click', onCurrentPageBoxClicked); + searchButton.addEventListener('click', searchClickHandler); + bookmarkPopup.hide(); + textSearchPopup.hide(); + enableNextButton(false); + enablePrevButton(false); + +``` +{% endhighlight %} +{% highlight ts tabtitle="Server-Backed" %} +```ts + +import { + PdfViewer, Toolbar, Magnification, Navigation, LinkAnnotation, BookmarkView, ThumbnailView, Print, + IPageChangeEventArgs, ILoadEventArgs, TextSearch, TextSelection +} from '@syncfusion/ej2-pdfviewer'; +import { Toolbar as Tool, TreeView, NodeSelectEventArgs } from '@syncfusion/ej2-navigations'; +import { ClickEventArgs, Button, CheckBox, ChangeEventArgs } from '@syncfusion/ej2-buttons'; +import { Dialog } from '@syncfusion/ej2-popups'; + +PdfViewer.Inject(Toolbar, Magnification, Navigation, LinkAnnotation, BookmarkView, ThumbnailView, Print, TextSearch, TextSelection); + +/** + * Default PdfViewer sample + */ + +let inputTemplate: string = '
    '; +let ele: string = '
    of 0
    '; +let isBookmarkOpen: boolean = false; +let isBookmarkClick: boolean = false; +let isTextSearchBoxOpen: boolean = false; +let bookmarkPopup: Dialog; +let textSearchPopup: Dialog; +let toolbarObj: Tool; +let viewer: PdfViewer; +let currentPageBox: HTMLElement; +let searchInput: HTMLElement; +let searchButton: HTMLElement; +let matchCase: boolean = false; + +function previousClicked(args: ClickEventArgs): void { + hidePopups(); + viewer.navigation.goToPreviousPage(); +} + +function hidePopups(): void { + isBookmarkOpen = false; + isTextSearchBoxOpen = false; + bookmarkPopup.hide(); + textSearchPopup.hide(); +} + +function bookmarkClicked(): void { + textSearchPopup.hide(); + if (!isBookmarkOpen) { + let bookmarkDetails: any = viewer.bookmark.getBookmarks(); + if (bookmarkDetails.bookmarks) { + let bookmarks: any = bookmarkDetails.bookmarks.bookMark; + let treeObj: TreeView = new TreeView({ + fields: + { + dataSource: bookmarks, + id: 'Id', + parentID: 'Pid', + text: 'Title', + hasChildren: 'HasChild', + }, nodeSelected: nodeClick + }); + treeObj.appendTo('#bookmarkview'); + bookmarkPopup.show(); + isBookmarkOpen = true; + isBookmarkClick = true; + } else { + toolbarObj.enableItems(document.getElementById('bookmarkButton'), false); + isBookmarkOpen = false; + } + } else { + if (!isBookmarkClick) { + bookmarkPopup.show(); + isBookmarkClick = true; + } else { + bookmarkPopup.hide(); + isBookmarkClick = false; + } + } +} + +function nextClicked(args: ClickEventArgs): void { + hidePopups(); + viewer.navigation.goToNextPage(); +} + +function searchClicked(args: ClickEventArgs): void { + bookmarkPopup.hide(); + if (!isTextSearchBoxOpen) { + textSearchPopup.show(); + } else { + viewer.textSearch.cancelTextSearch(); + textSearchPopup.hide(); + } + isTextSearchBoxOpen = !isTextSearchBoxOpen; +} + +function printClicked(args: ClickEventArgs): void { + hidePopups(); + viewer.print.print(); +} + +function downloadClicked(args: ClickEventArgs): void { + hidePopups(); + viewer.download(); +} + +function pageFitClicked(args: ClickEventArgs): void { + hidePopups(); + viewer.magnification.fitToPage(); + updateZoomButtons(); + toolbarObj.enableItems(document.getElementById('fitPage'), false); +} + +function zoomInClicked(args: ClickEventArgs): void { + hidePopups(); + viewer.magnification.zoomIn(); + updateZoomButtons(); +} + +function zoomOutClicked(args: ClickEventArgs): void { + hidePopups(); + viewer.magnification.zoomOut(); + updateZoomButtons(); +} + +function onCurrentPageBoxKeypress(event: KeyboardEvent): boolean { + if ((event.which < 48 || event.which > 57) && event.which !== 8 && event.which !== 13) { + event.preventDefault(); + return false; + } else { + // tslint:disable-next-line:radix + let currentPageNumber: number = parseInt((currentPageBox as HTMLInputElement).value); + if (event.which === 13) { + if (currentPageNumber > 0 && currentPageNumber <= viewer.pageCount) { + viewer.navigation.goToPage(currentPageNumber); + } else { + (currentPageBox as HTMLInputElement).value = viewer.currentPageNumber.toString(); + } + } + return true; + } +} + +function onCurrentPageBoxClicked(): void { + (currentPageBox as HTMLInputElement).select(); + (currentPageBox).focus(); +} + +function readFile(args: any): void { + // tslint:disable-next-line + let upoadedFiles: any = args.target.files; + if (args.target.files[0] !== null) { + let uploadedFile: File = upoadedFiles[0]; + if (uploadedFile) { + let reader: FileReader = new FileReader(); + let filename: string = upoadedFiles[0].name; + reader.readAsDataURL(uploadedFile); + // tslint:disable-next-line + reader.onload = (e: any): void => { + let uploadedFileUrl: string = e.currentTarget.result; + viewer.load(uploadedFileUrl, null); + viewer.fileName = filename; + (currentPageBox as HTMLInputElement).value = '1'; + document.getElementById('totalPage').textContent = 'of ' + viewer.pageCount; + document.getElementById('bookmarkview').innerHTML = ''; + isBookmarkOpen = false; + }; + } + } +} + +function openDocument(e: ClickEventArgs): void { + document.getElementById('fileUpload').click(); +} + +function updatePageNavigation(): void { + if (viewer.currentPageNumber === 1) { + toolbarObj.enableItems(document.getElementById('previousPage'), false); + toolbarObj.enableItems(document.getElementById('nextPage'), true); + } else if (viewer.currentPageNumber === viewer.pageCount) { + toolbarObj.enableItems(document.getElementById('previousPage'), true); + toolbarObj.enableItems(document.getElementById('nextPage'), false); + } else { + toolbarObj.enableItems(document.getElementById('previousPage'), true); + toolbarObj.enableItems(document.getElementById('nextPage'), true); + } +} + +function updateZoomButtons(): void { + if (viewer.zoomPercentage <= 50) { + toolbarObj.enableItems(document.getElementById('zoomIn'), true); + toolbarObj.enableItems(document.getElementById('zoomOut'), false); + toolbarObj.enableItems(document.getElementById('fitPage'), true); + } else if (viewer.zoomPercentage >= 400) { + toolbarObj.enableItems(document.getElementById('zoomIn'), false); + toolbarObj.enableItems(document.getElementById('zoomOut'), true); + toolbarObj.enableItems(document.getElementById('fitPage'), true); + } else { + toolbarObj.enableItems(document.getElementById('zoomIn'), true); + toolbarObj.enableItems(document.getElementById('zoomOut'), true); + toolbarObj.enableItems(document.getElementById('fitPage'), true); + } +} + +function nodeClick(args: NodeSelectEventArgs): boolean { + let bookmarksDetails: any = viewer.bookmark.getBookmarks(); + let bookmarksDestination: any = bookmarksDetails.bookmarksDestination; + let bookid: number = Number(args.nodeData.id); + let pageIndex: number = bookmarksDestination.bookMarkDestination[bookid].PageIndex; + let Y: number = bookmarksDestination.bookMarkDestination[bookid].Y; + viewer.bookmark.goToBookmark(pageIndex, Y); + return false; +} + +function searchInputKeypressed(event: KeyboardEvent): void { + enablePrevButton(true); + enableNextButton(true); + if (event.which === 13) { + initiateTextSearch(); + updateSearchInputIcon(false); + } +} + +function searchClickHandler(): void { + if (searchButton.classList.contains('e-pv-search-icon')) { + viewer.textSearch.cancelTextSearch(); + initiateTextSearch(); + } else if (searchButton.classList.contains('e-pv-search-close')) { + (searchInput as HTMLInputElement).value = ''; + searchInput.focus(); + viewer.textSearch.cancelTextSearch(); + } +} + +function initiateTextSearch(): void { + let searchString: string = (searchInput as HTMLInputElement).value; + viewer.textSearch.searchText(searchString, matchCase); +} + +function previousSearchClicked(): void { + let searchString: string = (searchInput as HTMLInputElement).value; + if (searchString) { + viewer.textSearch.searchPrevious(); + } +} + +function nextSearchClicked(): void { + let searchString: string = (searchInput as HTMLInputElement).value; + if (searchString) { + viewer.textSearch.searchNext(); + } +} + +function checkBoxChanged(args: ChangeEventArgs): void { + if (args.checked) { + matchCase = true; + } else { + matchCase = false; + } + initiateTextSearch(); +} + +function enablePrevButton(isEnable: boolean): void { + let previousSearchButton: HTMLElement = document.getElementById('previousSearch'); + if (isEnable) { + previousSearchButton.removeAttribute('disabled'); + } else { + (previousSearchButton as HTMLButtonElement).disabled = true; + } +} + +function enableNextButton(isEnable: boolean): void { + let nextSearchButton: HTMLElement = document.getElementById('nextSearch'); + if (isEnable) { + nextSearchButton.removeAttribute('disabled'); + } else { + (nextSearchButton as HTMLButtonElement).disabled = true; + } +} + +function updateSearchInputIcon(isEnable: boolean): void { + if (isEnable) { + searchButton.classList.remove('e-pv-search-close'); + searchButton.classList.add('e-pv-search-icon'); + } else { + searchButton.classList.remove('e-pv-search-icon'); + searchButton.classList.add('e-pv-search-close'); + } +} + + + toolbarObj = new Tool({ + items: [ + { prefixIcon: 'e-pv-open-document', tooltipText: 'Open', id: 'openButton', click: openDocument.bind(this) }, + { prefixIcon: 'e-pv-bookmark-icon', tooltipText: 'Bookmark', id: 'bookmarkButton', click: bookmarkClicked }, + // tslint:disable-next-line:max-line-length + { prefixIcon: 'e-pv-previous-page-navigation-icon', id: 'previousPage', tooltipText: 'Previous Page', align: 'Center', click: previousClicked.bind(this) }, + // tslint:disable-next-line:max-line-length + { prefixIcon: 'e-pv-next-page-navigation-icon', id: 'nextPage', tooltipText: 'Next Page', align: 'Center', click: nextClicked.bind(this) }, + { template: inputTemplate, tooltipText: 'Page Number', align: 'Center' }, + { template: ele, tooltipText: 'Page Number', align: 'Center' }, + { prefixIcon: 'e-pv-search-icon', tooltipText: 'Text Search', align: 'Right', click: searchClicked.bind(this) }, + { prefixIcon: 'e-pv-print-document-icon', tooltipText: 'Print', align: 'Right', click: printClicked.bind(this) }, + { prefixIcon: 'e-pv-download-document-icon', tooltipText: 'Download', align: 'Right', click: downloadClicked.bind(this) } + ] + }); + toolbarObj.appendTo('#topToolbar'); + let magnificationToolbar: Tool = new Tool({ + items: [ + { prefixIcon: 'e-pv-fit-page-icon', id: 'fitPage', tooltipText: 'Fit to page', click: pageFitClicked.bind(this) }, + { prefixIcon: 'e-pv-zoom-in-icon', id: 'zoomIn', tooltipText: 'Zoom in', click: zoomInClicked.bind(this) }, + { prefixIcon: 'e-pv-zoom-out-icon', id: 'zoomOut', tooltipText: 'Zoom out', click: zoomOutClicked.bind(this) }, + ] + }); + magnificationToolbar.appendTo('#magnificationToolbar'); + viewer = new PdfViewer({ + enableToolbar: false, + enableThumbnail: false, + documentPath: 'https://cdn.syncfusion.com/content/pdf/hive-succinctly.pdf' + }); + viewer.appendTo('#pdfViewer'); + document.getElementById('fileUpload').addEventListener('change', readFile, false); + currentPageBox = document.getElementById('currentPage'); + (currentPageBox as HTMLInputElement).value = '1'; + searchInput = document.getElementById('searchInput'); + bookmarkPopup = new Dialog({ + showCloseIcon: true, header: 'Bookmarks', closeOnEscape: false, isModal: false, target: document.getElementById('pdfViewer'), + content: '
    ', + buttons: [{ + buttonModel: {}, + }], position: { X: 'left', Y: 'top' }, cssClass: 'e-bookmark-popup', beforeClose: (): void => { + isBookmarkOpen = false; + } + }); + bookmarkPopup.appendTo('#popup'); + + textSearchPopup = new Dialog({ + showCloseIcon: false, closeOnEscape: false, isModal: false, target: document.getElementById('pdfViewer'), + buttons: [{ + buttonModel: {}, + }], position: { X: 'right', Y: 'top' }, cssClass: 'e-text-search-popup', + }); + textSearchPopup.appendTo('#textSearchBox'); + + let previousSearch: Button = new Button({ iconCss: 'e-pv-previous-search' }); + previousSearch.appendTo('#previousSearch'); + + let nextSearch: Button = new Button({ iconCss: 'e-pv-next-search-btn' }); + nextSearch.appendTo('#nextSearch'); + + let matchCaseCheck: CheckBox = new CheckBox({ label: 'Match case', change: checkBoxChanged }); + matchCaseCheck.appendTo('#matchCase'); + + viewer.pageChange = (args: IPageChangeEventArgs): void => { + (currentPageBox as HTMLInputElement).value = viewer.currentPageNumber.toString(); + updatePageNavigation(); + }; + + viewer.documentLoad = (args: ILoadEventArgs): void => { + document.getElementById('totalPage').textContent = 'of ' + viewer.pageCount; + updatePageNavigation(); + }; + searchButton = document.getElementById('searchBtn'); + searchInput.addEventListener('focus', () => { searchInput.parentElement.classList.add('e-input-focus'); }); + searchInput.addEventListener('blur', () => { searchInput.parentElement.classList.remove('e-input-focus'); }); + searchInput.addEventListener('keypress', searchInputKeypressed); + document.getElementById('previousSearch').addEventListener('click', previousSearchClicked); + document.getElementById('nextSearch').addEventListener('click', nextSearchClicked); + currentPageBox.addEventListener('keypress', onCurrentPageBoxKeypress); + currentPageBox.addEventListener('click', onCurrentPageBoxClicked); + searchButton.addEventListener('click', searchClickHandler); + bookmarkPopup.hide(); + textSearchPopup.hide(); + enableNextButton(false); + enablePrevButton(false); + +``` +{% endhighlight %} +{% endtabs %} + +Sample: +[https://document.syncfusion.com/demos/pdf-viewer/javascript/#/tailwind3/pdfviewer/custom-toolbar.html](https://document.syncfusion.com/demos/pdf-viewer/javascript/#/tailwind3/pdfviewer/custom-toolbar.html) \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es6/toolbar-customization/form-designer-toolbar-customization.md b/Document-Processing/PDF/PDF-Viewer/javascript-es6/toolbar-customization/form-designer-toolbar-customization.md new file mode 100644 index 000000000..12332c016 --- /dev/null +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es6/toolbar-customization/form-designer-toolbar-customization.md @@ -0,0 +1,130 @@ +--- +layout: post +title: Form Designer Toolbar Customization in TypeScript PDF Viewer Component | Syncfusion +description: Learn here all about form designer toolbar customization in Syncfusion TypeScript PDF Viewer component of Syncfusion Essential JS 2 and more. +platform: document-processing +control: PDF Viewer +documentation: ug +domainurl: ##DomainURL## +--- + +# Form Designer Toolbar Customization + +The form designer toolbar can be customized by showing or hiding default items and by controlling the order in which the items appear. + +## Show or hide the form designer toolbar + +Show or hide the form designer toolbar programmatically during initialization or at runtime. + +Use the [EnableFormDesigner](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/pdfViewerModel/#enableformdesigner) property or the [showFormDesignerToolbar](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/toolbar/#showformdesignertoolbar) method to toggle visibility. + +The following code snippet explains how to show or hide the toolbar using the `EnableFormDesigner` property. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} +import { PdfViewer, Toolbar, Magnification, Navigation, Annotation, LinkAnnotation, + ThumbnailView, BookmarkView, TextSelection, TextSearch, FormFields, FormDesigner} from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject( Toolbar, Magnification, Navigation, Annotation, LinkAnnotation, ThumbnailView, + BookmarkView, TextSelection, TextSearch, FormFields, FormDesigner ); + +let pdfviewer: PdfViewer = new PdfViewer({ + enableFormDesigner: false, + documentPath:'https://cdn.syncfusion.com/content/pdf/formdesigner.pdf', + resourceUrl:"https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib" +}); +pdfviewer.appendTo('#PdfViewer'); + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + + + + + + EJ2 PDF Viewer + + + + + + + + + + + + +
    Loading....
    +
    +
    +
    + + + +{% endhighlight %} +{% endtabs %} + +## How to customize the form designer toolbar + +Choose which tools appear and control their order in the form designer toolbar. + +Use [`PdfViewerToolbarSettings`](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/toolbarSettings/) with the [`FormDesignerToolbarItems`](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/toolbarSettings/#formdesignertoolbaritems) property to choose which form design tools are available. The property accepts a list of [`FormDesignerToolbarItem`](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/formDesignerToolbarItem/) values. The items you include are both displayed and rendered in the order listed; any items you omit are hidden. This provides a streamlined, user-friendly form design experience across devices. + +The following example demonstrates how to customize the form designer toolbar by configuring specific tools using `FormDesignerToolbarItem`. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} +import { PdfViewer, Toolbar, Magnification, Navigation, Annotation, LinkAnnotation, + ThumbnailView, BookmarkView, TextSelection, TextSearch, FormFields, FormDesigner, FormDesignerToolbarItem} from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject( Toolbar, Magnification, Navigation, Annotation, LinkAnnotation, ThumbnailView, + BookmarkView, TextSelection, TextSearch, FormFields, FormDesigner ); + +let pdfviewer: PdfViewer = new PdfViewer({ + documentPath:'https://cdn.syncfusion.com/content/pdf/formdesigner.pdf', + resourceUrl:"https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib" +}); +pdfviewer.toolbarSettings = { + formDesignerToolbarItems: [ + "TextboxTool", + "PasswordTool", + "CheckBoxTool", + "RadioButtonTool", + "DropdownTool", + "ListboxTool", + "DrawSignatureTool", + "DeleteTool" + ] + }; +pdfviewer.appendTo('#PdfViewer'); + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + + + + + + EJ2 PDF Viewer + + + + + + + + + + + + +
    Loading....
    +
    +
    +
    + + + +{% endhighlight %} +{% endtabs %} diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es6/mobile-toolbar.md b/Document-Processing/PDF/PDF-Viewer/javascript-es6/toolbar-customization/mobile-toolbar.md similarity index 88% rename from Document-Processing/PDF/PDF-Viewer/javascript-es6/mobile-toolbar.md rename to Document-Processing/PDF/PDF-Viewer/javascript-es6/toolbar-customization/mobile-toolbar.md index c504226cb..7b8befcfe 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es6/mobile-toolbar.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es6/toolbar-customization/mobile-toolbar.md @@ -1,21 +1,20 @@ --- layout: post -title: Mobile Toolbar Interface in Typescript Pdfviewer control | Syncfusion -description: Learn All About the Mobile Toolbar Interface in Syncfusion Typescript Pdfviewer control of Syncfusion Essential JS 2 and more. +title: Mobile Toolbar Interface in TypeScript PDF Viewer control | Syncfusion +description: Learn All About the Mobile Toolbar Interface in Syncfusion TypeScript PDF Viewer control of Syncfusion Essential JS 2 and more. platform: document-processing -control: Mobile Toolbar Interface -publishingplatform: Typescript +control: PDF Viewer documentation: ug domainurl: ##DomainURL## --- -# Mobile Toolbar Interface in Typescript Pdfviewer control +# Mobile Toolbar Interface in TypeScript PDF Viewer control The Mobile PDF Viewer offers a variety of features for viewing, searching, annotating, and managing PDF documents on mobile devices. It includes essential tools like search, download, bookmarking, annotation, and page organization. Users also have the option to enable desktop toolbar features in mobile mode, providing a more extensive set of actions. ## Mobile Mode Toolbar Configuration In mobile mode, the toolbar is optimized for ease of use on small screens, presenting users with the most common actions for interacting with a PDF document. Below are the key features available in mobile mode: -![Mobile toolbar with primary PDF interaction options](./images/mobileToolbar.png) +![Mobile toolbar with primary PDF interaction options](../images/mobileToolbar.png) ### Main Toolbar Options: @@ -23,17 +22,17 @@ In mobile mode, the toolbar is optimized for ease of use on small screens, prese **SearchOption:** Access the search bar to find text within the document. -![Search bar displayed for finding text within a PDF](./images/searchOption.png) +![Search bar displayed for finding text within a PDF](../images/searchOption.png) **UndoRedoTool:** Quickly undo or redo any annotations made. **OrganizePagesTool:** Enable or disable page organization features to modify document pages. -![Page organization interface for modifying PDF pages](./images/organizePages.png) +![Page organization interface for modifying PDF pages](../images/organizePages.png) **AnnotationEditTool:** Activate or deactivate annotation editing to add or modify annotations. -![Annotation editing toolbar allowing users to add, edit, or delete annotations on a PDF](./images/editAnnotation.png) +![Annotation editing toolbar allowing users to add, edit, or delete annotations on a PDF](../images/editAnnotation.png) N> In mobile mode, the annotation toolbar is conveniently displayed at the bottom of the viewer. @@ -45,11 +44,11 @@ When you open the "more options" menu, you will see additional actions such as: **BookmarkOption:** Allows you to view bookmarks within the document. -![More options menu showing additional actions like download and bookmark](./images/more-options.png) +![More options menu showing additional actions like download and bookmark](../images/more-options.png) ## Enabling Desktop Mode in Mobile -The desktop version of the toolbar can be enabled on mobile devices by using the `enableDesktopMode` API. This API allows you to bring desktop-like features to the mobile PDF viewer, providing access to additional toolbar actions that are typically available on desktop platforms. +The desktop version of the toolbar can be enabled on mobile devices by using the `enableDesktopMode` API. This API allows you to bring desktop-like features to the mobile PDF Viewer, providing access to additional toolbar actions that are typically available on desktop platforms. ### Steps to Enable Desktop Mode: @@ -66,7 +65,7 @@ PdfViewer.Inject(Toolbar, Magnification, Navigation, Annotation, LinkAnnotation, let pdfviewer: PdfViewer = new PdfViewer(); pdfviewer.documentPath = "https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf"; -pdfviewer.resourceUrl = "https://cdn.syncfusion.com/ej2/25.1.35/dist/ej2-pdfviewer-lib"; +pdfviewer.resourceUrl = "https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib"; pdfviewer.enableDesktopMode = true; pdfviewer.appendTo('#PdfViewer'); @@ -99,7 +98,7 @@ PdfViewer.Inject(Toolbar, Magnification, Navigation, Annotation, LinkAnnotation, let pdfviewer: PdfViewer = new PdfViewer(); pdfviewer.documentPath = "https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf"; -pdfviewer.resourceUrl = "https://cdn.syncfusion.com/ej2/25.1.35/dist/ej2-pdfviewer-lib"; +pdfviewer.resourceUrl = "https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib"; pdfviewer.enableDesktopMode = true; pdfviewer.enableTextSelection = false; pdfviewer.appendTo('#PdfViewer'); diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es6/toolbar-customization/primary-toolbar-customization.md b/Document-Processing/PDF/PDF-Viewer/javascript-es6/toolbar-customization/primary-toolbar-customization.md new file mode 100644 index 000000000..0c28a1368 --- /dev/null +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es6/toolbar-customization/primary-toolbar-customization.md @@ -0,0 +1,114 @@ +--- +layout: post +title: Primary Toolbar Customization in TypeScript PDF Viewer Component | Syncfusion +description: Learn here all about primary toolbar customization in Syncfusion TypeScript PDF Viewer component of Syncfusion Essential JS 2 and more. +platform: document-processing +control: PDF Viewer +documentation: ug +domainurl: ##DomainURL## +--- + +# Primary Toolbar Customization in PDF Viewer Control + +The primary toolbar of the PDF Viewer can be customized by rearranging existing items, disabling default items, and adding custom items. New items can be placed at specific index positions among the existing items. + +## Show or hide the primary toolbar + +Toggle the built-in primary toolbar to create custom toolbar experiences or simplify the UI. In scenarios where a custom toolbar is required, the built-in toolbar can be hidden. Use the [enableToolbar](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/pdfViewerModel/#enabletoolbar) property or the [showToolbar](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/toolbar/#showtoolbar) method to show or hide the primary toolbar. + +Show or hide the toolbar using the `enableToolbar` property: + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} +import { PdfViewer, Toolbar, Magnification, Navigation, Annotation, LinkAnnotation, + ThumbnailView, BookmarkView, TextSelection, TextSearch, FormFields, FormDesigner} from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject( Toolbar, Magnification, Navigation, Annotation, LinkAnnotation, ThumbnailView, + BookmarkView, TextSelection, TextSearch, FormFields, FormDesigner ); + +let pdfviewer: PdfViewer = new PdfViewer({ + enableToolbar: false, + documentPath:'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl:"https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib" +}); +pdfviewer.appendTo('#PdfViewer'); + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + + + + + + EJ2 PDF Viewer + + + + + + + + + + + + +
    Loading....
    +
    +
    +
    + + + +{% endhighlight %} +{% endtabs %} + +The following code snippet explains how to show or hide the toolbar using the `showToolbar` method. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} +import { PdfViewer, Toolbar, Magnification, Navigation, Annotation, LinkAnnotation, ThumbnailView, + BookmarkView, TextSelection, TextSearch, FormFields, FormDesigner} from '@syncfusion/ej2-pdfviewer'; + +PdfViewer.Inject( Toolbar, Magnification, Navigation, Annotation, LinkAnnotation, ThumbnailView, + BookmarkView, TextSelection, TextSearch, FormFields, FormDesigner ); + +let pdfviewer: PdfViewer = new PdfViewer({ + documentPath:'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', + resourceUrl:"https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib" +}); +pdfviewer.appendTo('#PdfViewer'); +document.getElementById('set').addEventListener('click', ()=> { + pdfviewer.toolbar.showToolbar(false); +}); + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + + + + + + EJ2 PDF Viewer + + + + + + + + + + + + +
    Loading....
    + +
    +
    +
    + + + +{% endhighlight %} +{% endtabs %} diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es6/toolbar.md b/Document-Processing/PDF/PDF-Viewer/javascript-es6/toolbar.md index 2b4fad1c5..c4773c112 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es6/toolbar.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es6/toolbar.md @@ -9,7 +9,7 @@ documentation: ug domainurl: ##DomainURL## --- -# Built-In Toolbar in Typescript Pdfviewer control +# Built-In Toolbar in Typescript PDF Viewer control The PDF Viewer comes with a powerful built-in toolbar to execute important actions such as page navigation, text search,view mode,download,print,bookmark, and thumbnails. diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es6/troubleshooting/cp-command-not-recognized.md b/Document-Processing/PDF/PDF-Viewer/javascript-es6/troubleshooting/cp-command-not-recognized.md index 747a51cc8..26a8f9f8d 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es6/troubleshooting/cp-command-not-recognized.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es6/troubleshooting/cp-command-not-recognized.md @@ -1,26 +1,31 @@ --- layout: post -title: Troubleshoot 'cp' is not recognized as a command in Typescript PDF Viewer control | Syncfusion -description: Learn here all about how to solve 'cp' is not recognized as a command in Syncfusion Essential JS 2 and more. +title: Fix "cp is not recognized" on Windows for the TypeScript PDF Viewer +description: Use Windows-friendly copy commands to replace Unix cp when copying ej2-pdfviewer-lib assets for the TypeScript PDF Viewer—examples for CMD (xcopy) and PowerShell (Copy-Item). platform: document-processing control: PDF Viewer -publishingplatform: Typescript documentation: ug -domainurl: ##DomainURL## --- # Troubleshoot error 'cp' is not recognized as a command -The error message you're seeing, "'cp' is not recognized as an internal or external command," is because the `cp` command you're trying to use is not recognized on Windows command prompt. +The Unix `cp` command is not available in the Windows Command Prompt. Use one of the following Windows-native alternatives to copy the required assets. -On Windows, you should use the `copy` command to copy files and directories instead of `cp`. The equivalent command in Windows to copy a directory and its contents recursively is: +- CMD (xcopy) — recursive directory copy: ```batch xcopy /s /e /i .\node_modules\@syncfusion\ej2-pdfviewer\dist\ej2-pdfviewer-lib src\ej2-pdfviewer-lib ``` -Here, `/s` indicates that you want to copy directories and subdirectories recursively. Also, note that Windows uses backslashes `\` as path separators, not forward slashes `/`. +- PowerShell (Copy-Item) — recursive directory copy: -Make sure to run this command in the appropriate directory where you want to perform the copy operation. +```powershell +Copy-Item .\node_modules\@syncfusion\ej2-pdfviewer\dist\ej2-pdfviewer-lib -Destination .\src\ej2-pdfviewer-lib -Recurse -Force +``` + +Notes: +- Run the command from the project root so the node_modules path resolves correctly. +- Windows paths use backslashes (\). Adjust paths if your project structure differs. +- Ensure sufficient permissions to write to the destination folder. -**Note:** If you encounter other issues or error messages while working with the Windows Command Prompt, make sure to double-check your command syntax and file paths for accuracy. Additionally, ensure that you have the necessary permissions to perform the copy operation in the specified directories. \ No newline at end of file +For cross-platform scripts in package.json, consider tools such as "shx" or "copyfiles" to avoid OS-specific commands. diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es6/troubleshooting/document-loading-issues.md b/Document-Processing/PDF/PDF-Viewer/javascript-es6/troubleshooting/document-loading-issues.md index 5afff5d92..6ddc55471 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es6/troubleshooting/document-loading-issues.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es6/troubleshooting/document-loading-issues.md @@ -1,18 +1,17 @@ --- layout: post -title: Document Loading Issues in Version 23.1 or Newer Typescript Pdfviewer Component -description: Learn here all about troubleshooting Document Loading Issues in Version 23.1 or newer in Typescript Pdfviewer of Syncfusion Essential JS 2 and more. +title: Fix document loading issues in v23.1+ for the TypeScript PDF Viewer component +description: Resolve document rendering failures in v23.1 or newer by calling dataBind before load, verifying source URLs, checking CORS and CSP, and confirming network connectivity in the TypeScript PDF Viewer. platform: document-processing control: PDF Viewer -publishingplatform: Typescript documentation: ug --- # Document Loading Issues in Version 23.1 or Newer -If you're experiencing problems with your document not rendering in the viewer, especially when using version 23.1 or a newer version, follow these troubleshooting steps to resolve the issue: +If the document does not render in the viewer when using version 23.1 or newer, follow these steps: -1. **Check for `viewer.dataBind()` Requirement**: Ensure that you have called `viewer.dataBind()` as required in version 23.1 or newer. This explicit call is essential for initializing data binding and document rendering correctly. It is must to call the dataBind() method before load. +1. Call `pdfviewer.dataBind()` before `load()`. Starting with v23.1, an explicit dataBind call is required to initialize data binding and render correctly. ```ts import { PdfViewer, Toolbar,Magnification,Navigation, Annotation, LinkAnnotation,ThumbnailView,BookmarkView, @@ -28,18 +27,12 @@ pdfviewer.dataBind(); pdfviewer.load('https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf', null); ``` -2. **Verify Document Source**: Confirm that the document source or URL you're trying to display is valid and accessible. Incorrect URLs or document paths can lead to loading issues. +2. Verify the document source. Ensure the URL or path is valid and accessible. +3. Check network connectivity. The viewer cannot fetch the document without a stable connection. +4. Inspect console errors. Use browser developer tools to identify issues. +5. Validate the initialization order. Initialize the viewer, call `dataBind()`, then call `load()`. +6. Update to the latest viewer version. Issues may be resolved in newer releases. +7. Configure CORS correctly for cross-domain documents. +8. Review Content Security Policy (CSP) settings. Ensure external resources are permitted. See the Content Security Policy troubleshooting guide in the Syncfusion documentation for details. -3. **Network Connectivity**: Ensure that your application has a stable network connection. Document rendering may fail if the viewer can't fetch the document due to network issues. - -4. **Console Errors**: Use your browser's developer tools to check for any error messages or warnings in the console. These messages can provide insights into what's causing the document not to load. - -5. **Loading Sequence**: Make sure that you're calling `viewer.dataBind()` and initiating document loading in the correct sequence. The viewer should be properly initialized before attempting to load a document. - -7. **Update Viewer**: Ensure that you're using the latest version of the viewer library or framework. Sometimes, issues related to document loading are resolved in newer releases. - -8. **Cross-Origin Resource Sharing (CORS)**: If you're loading documents from a different domain, ensure that CORS headers are correctly configured to allow cross-origin requests. - -9. **Content Security Policies (CSP)**: Check if your application's Content Security Policy allows the loading of external resources, as this can affect document loading. Refer [here](https://ej2.syncfusion.com/javascript/documentation/common/troubleshoot/content-security-policy) to troubleshoot. - -By following these troubleshooting steps, you should be able to address issues related to document loading in version 23.1 or newer, ensuring that your documents render correctly in the viewer. \ No newline at end of file +Following this checklist typically resolves document loading issues in v23.1 or newer. diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es6/troubleshooting/troubleshooting.md b/Document-Processing/PDF/PDF-Viewer/javascript-es6/troubleshooting/troubleshooting.md index e9da5416c..37c0020b5 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es6/troubleshooting/troubleshooting.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es6/troubleshooting/troubleshooting.md @@ -1,18 +1,19 @@ --- layout: post -title: Manually Copy Files from node_modules in Typescript PDF Viewer control | Syncfusion -description: Learn here all about why do i have to manually copy files from node_modules in Syncfusion Essential JS 2 and more. +title: Why manual copy from node_modules is required in the TypeScript PDF Viewer +description: Understand why certain lazy-loaded assets from ej2-pdfviewer-lib must be copied from node_modules when not using a bundler, how pdfium.js is handled, and when to reference assets directly in the TypeScript PDF Viewer. platform: document-processing control: PDF Viewer -publishingplatform: Typescript documentation: ug -domainurl: ##DomainURL## --- # Why Do I Have to Manually Copy Files from node_modules into My App? -PDF Viewer offers flexibility across different build systems, remaining both framework-agnostic and independent of bundlers. Even without a bundler, you can seamlessly integrate the PDF Viewer by directly linking its assets through standard HTML tags. +The PDF Viewer supports multiple build systems and can work without a bundler by referencing assets directly using HTML tags. To keep load times efficient, the library is split into smaller modules and uses lazy loading for certain assets. -Moreover, our codebase is meticulously divided into distinct files, enabling selective loading of components when required. This strategic approach to lazy loading prevents unwieldy file sizes that a single bundle might impose, which is often impractical. +- The primary entry point, "pdfium.js", is typically included by bundlers automatically. +- Additional resources under "ej2-pdfviewer-lib" are loaded on demand at runtime. Because the host app does not know about these lazy-loaded files, they are not automatically emitted by bundlers or available to static servers unless they are copied and referenced. -While 'pdfium.js,' the primary entry point, is commonly bundled automatically, the supplementary assets from 'ej2-pdfviewer-lib' need to be manually incorporated due to their on-demand loading. This necessity arises because the host application lacks inherent awareness of these assets' lazy loading behavior. \ No newline at end of file +When not using a bundler (or when the bundler does not emit these assets), copy the required files from node_modules to a web-accessible path in your app (for example, "src/ej2-pdfviewer-lib") and reference them accordingly. This ensures the viewer can fetch the lazy-loaded assets when needed and prevents runtime 404 errors. + +If a bundler is configured to emit static assets from node_modules, verify that the output contains the necessary files from "@syncfusion/ej2-pdfviewer/dist/ej2-pdfviewer-lib" and that your app serves them from a public path. Otherwise, perform a manual copy step during your build process. diff --git a/Document-Processing/PDF/PDF-Viewer/vue/annotation/annotation-event.md b/Document-Processing/PDF/PDF-Viewer/vue/annotation/annotation-event.md new file mode 100644 index 000000000..b20dc92e0 --- /dev/null +++ b/Document-Processing/PDF/PDF-Viewer/vue/annotation/annotation-event.md @@ -0,0 +1,1430 @@ +--- +layout: post +title: Annotation Events in Vue PDF Viewer control | Syncfusion +description: Learn here all about Annotation Events in Syncfusion Vue PDF Viewer component of Syncfusion Essential JS 2 and more. +control: Annotation Events +platform: document-processing +documentation: ug +domainurl: ##DomainURL## +--- + +# PDF Viewer Annotation events in Vue + +The PDF Viewer component triggers various events based on user interactions and changes in the component's state. These events can be used to perform actions when a specific event occurs. This section describes the events available in the PDF Viewer component. + +| Event | Description | +| ------------------------------------------------------------------ | ---------------------------------------------------------------------------------- | +| [`annotationAdd`](#annotationadd) | Triggers when an annotation is added to a page in the PDF document. | +| [`annotationDoubleClick`](#annotationdoubleclick) | Triggers when an annotation is double-clicked. | +| [`annotationMouseLeave`](#annotationmouseleave) | Triggers when the mouse pointer moves away from an annotation object. | +| [`annotationMouseover`](#annotationmouseover) | Triggers when the mouse pointer moves over an annotation object. | +| [`annotationMove`](#annotationmove) | Triggers when an annotation is moved on a page in the PDF document. | +| [`annotationMoving`](#annotationmoving) | Triggers while an annotation is being moved. | +| [`annotationPropertiesChange`](#annotationpropertieschange) | Triggers when the properties of an annotation are modified on a PDF page. | +| [`annotationRemove`](#annotationremove) | Triggers when an annotation is removed from a page in the PDF document. | +| [`annotationResize`](#annotationresize) | Triggers when an annotation is resized on a page in the PDF document. | +| [`annotationSelect`](#annotationselect) | Triggers when an annotation is selected on a page in the PDF document. | +| [`annotationUnSelect`](#annotationunselect) | Triggers when an annotation is unselected on a page in the PDF document. | +| [`beforeAddFreeText`](#beforeaddfreetext) | Triggers before adding a text in the freeText annotation. | +| [`addSignature`](#addsignature) | Triggers when a signature is added to a page in the PDF document. | +| [`removeSignature`](#removesignature) | Triggers when a signature is removed from a page in the PDF document. | +| [`resizeSignature`](#resizesignature) | Triggers when a signature is resized on a page in the PDF document. | +| [`signaturePropertiesChange`](#signaturepropertieschange) | Triggers when the properties of a signature are changed on a page in the PDF document. | +| [`signatureSelect`](#signatureselect) | Triggers when a signature is selected on a page in the PDF document. | +| [`signatureUnselect`](#signatureunselect) | Triggers when a signature is unselected on a page in the PDF document. | + +### annotationAdd + +The [annotationAdd](https://ej2.syncfusion.com/vue/documentation/api/pdfviewer/annotationAddEventArgs/) event is triggered when an annotation is added to a PDF document's page. + +#### Event Arguments + +For event data, see [AnnotationAddEventArgs](https://ej2.syncfusion.com/vue/documentation/api/pdfviewer/annotationAddEventArgs/). It provides properties such as `annotationId`, `pageNumber`, `annotationType`, and `bounds`. + +The following example illustrates how to handle the `annotationAdd` event. + +{% tabs %} +{% highlight html tabtitle="Composition API (~/src/App.vue)" %} + + + + + +{% endhighlight %} +{% highlight html tabtitle="Options API (~/src/App.vue)" %} + + + + + +{% endhighlight %} +{% endtabs %} + +### annotationDoubleClick + +The [annotationDoubleClick](https://ej2.syncfusion.com/vue/documentation/api/pdfviewer/annotationDoubleClickEventArgs/) event is triggered when an annotation is double-clicked. + +#### Event Arguments + +For event data, see [AnnotationDoubleClickEventArgs](https://ej2.syncfusion.com/vue/documentation/api/pdfviewer/annotationDoubleClickEventArgs/). + +The following example illustrates how to handle the `annotationDoubleClick` event. + +{% tabs %} +{% highlight html tabtitle="Composition API (~/src/App.vue)" %} + + + + + +{% endhighlight %} +{% highlight html tabtitle="Options API (~/src/App.vue)" %} + + + + + +{% endhighlight %} +{% endtabs %} + +### annotationMouseLeave + +The [annotationMouseLeave](https://ej2.syncfusion.com/vue/documentation/api/pdfviewer/annotationMouseLeaveEventArgs/) event is triggered when the user's mouse pointer moves away from an annotation object. + +#### Event Arguments + +For event data, see [AnnotationMouseLeaveEventArgs](https://ej2.syncfusion.com/vue/documentation/api/pdfviewer/annotationMouseLeaveEventArgs/). + +The following example illustrates how to handle the `annotationMouseLeave` event. + +{% tabs %} +{% highlight html tabtitle="Composition API (~/src/App.vue)" %} + + + + + +{% endhighlight %} +{% highlight html tabtitle="Options API (~/src/App.vue)" %} + + + + + +{% endhighlight %} +{% endtabs %} + +### annotationMouseover + +The [annotationMouseover](https://ej2.syncfusion.com/vue/documentation/api/pdfviewer/annotationMouseOverEventArgs/) event is triggered when the mouse is moved over an annotation object. + +#### Event Arguments + +For event data, see [AnnotationMouseOverEventArgs](https://ej2.syncfusion.com/vue/documentation/api/pdfviewer/annotationMouseOverEventArgs/). + +The following example illustrates how to handle the `annotationMouseover` event. + +{% tabs %} +{% highlight html tabtitle="Composition API (~/src/App.vue)" %} + + + + + +{% endhighlight %} +{% highlight html tabtitle="Options API (~/src/App.vue)" %} + + + + + +{% endhighlight %} +{% endtabs %} + +### annotationMove + +The [annotationMove](https://ej2.syncfusion.com/vue/documentation/api/pdfviewer/annotationMoveEventArgs/) event is triggered when an annotation is moved over the page of the PDF document. + +#### Event Arguments + +For event data, see [AnnotationMoveEventArgs](https://ej2.syncfusion.com/vue/documentation/api/pdfviewer/annotationMoveEventArgs/). + +The following example illustrates how to handle the `annotationMove` event. + +{% tabs %} +{% highlight html tabtitle="Composition API (~/src/App.vue)" %} + + + + + +{% endhighlight %} +{% highlight html tabtitle="Options API (~/src/App.vue)" %} + + + + + +{% endhighlight %} +{% endtabs %} + +### annotationMoving + +The [annotationMoving](https://ej2.syncfusion.com/vue/documentation/api/pdfviewer/annotationMovingEventArgs/) event is triggered while an annotation is being moved. + +#### Event Arguments + +For event data, see [AnnotationMovingEventArgs](https://ej2.syncfusion.com/vue/documentation/api/pdfviewer/annotationMovingEventArgs/). + +The following example illustrates how to handle the `annotationMoving` event. + +{% tabs %} +{% highlight html tabtitle="Composition API (~/src/App.vue)" %} + + + + + +{% endhighlight %} +{% highlight html tabtitle="Options API (~/src/App.vue)" %} + + + + + +{% endhighlight %} +{% endtabs %} + +### annotationPropertiesChange + +The [annotationPropertiesChange](https://ej2.syncfusion.com/vue/documentation/api/pdfviewer/annotationPropertiesChangeEventArgs/) event is triggered when an annotation's property is modified on a PDF document page. + +#### Event Arguments + +For event data, see [AnnotationPropertiesChangeEventArgs](https://ej2.syncfusion.com/vue/documentation/api/pdfviewer/annotationPropertiesChangeEventArgs/). It provides properties such as `annotationId`, `pageNumber`, and `action`. + +The following example illustrates how to handle the `annotationPropertiesChange` event. + +{% tabs %} +{% highlight html tabtitle="Composition API (~/src/App.vue)" %} + + + + + +{% endhighlight %} +{% highlight html tabtitle="Options API (~/src/App.vue)" %} + + + + + +{% endhighlight %} +{% endtabs %} + +### annotationRemove + +The [annotationRemove](https://ej2.syncfusion.com/vue/documentation/api/pdfviewer/annotationRemoveEventArgs/) event is triggered when an annotation is removed from a PDF document's page. + +#### Event Arguments + +For event data, see [AnnotationRemoveEventArgs](https://ej2.syncfusion.com/vue/documentation/api/pdfviewer/annotationRemoveEventArgs/). It provides properties such as `annotationId` and `pageNumber`. + +The following example illustrates how to handle the `annotationRemove` event. + +{% tabs %} +{% highlight html tabtitle="Composition API (~/src/App.vue)" %} + + + + + +{% endhighlight %} +{% highlight html tabtitle="Options API (~/src/App.vue)" %} + + + + + +{% endhighlight %} +{% endtabs %} + +### annotationResize + +The [annotationResize](https://ej2.syncfusion.com/vue/documentation/api/pdfviewer/annotationResizeEventArgs/) event is triggered when an annotation is resized on a PDF document page. + +#### Event Arguments + +For event data, see [AnnotationResizeEventArgs](https://ej2.syncfusion.com/vue/documentation/api/pdfviewer/annotationResizeEventArgs/). + +The following example illustrates how to handle the `annotationResize` event. + +{% tabs %} +{% highlight html tabtitle="Composition API (~/src/App.vue)" %} + + + + + +{% endhighlight %} +{% highlight html tabtitle="Options API (~/src/App.vue)" %} + + + + + +{% endhighlight %} +{% endtabs %} + +### annotationSelect + +The [annotationSelect](https://ej2.syncfusion.com/vue/documentation/api/pdfviewer/annotationSelectEventArgs/) event is triggered when an annotation is selected on a PDF document's page. + +#### Event Arguments + +For event data, see [AnnotationSelectEventArgs](https://ej2.syncfusion.com/vue/documentation/api/pdfviewer/annotationSelectEventArgs/). + +The following example illustrates how to handle the `annotationSelect` event. + +{% tabs %} +{% highlight html tabtitle="Composition API (~/src/App.vue)" %} + + + + + +{% endhighlight %} +{% highlight html tabtitle="Options API (~/src/App.vue)" %} + + + + + +{% endhighlight %} +{% endtabs %} + +### annotationUnselect + +The [annotationUnselect](https://ej2.syncfusion.com/vue/documentation/api/pdfviewer/annotationUnSelectEventArgs/) event is triggered when an annotation is unselected from the PDF document's page. + +#### Event Arguments + +For event data, see [AnnotationUnSelectEventArgs](https://ej2.syncfusion.com/vue/documentation/api/pdfviewer/annotationUnSelectEventArgs/). + +The following example illustrates how to handle the `annotationUnselect` event. + +{% tabs %} +{% highlight html tabtitle="Composition API (~/src/App.vue)" %} + + + + + +{% endhighlight %} +{% highlight html tabtitle="Options API (~/src/App.vue)" %} + + + + + +{% endhighlight %} +{% endtabs %} + +### beforeAddFreeText + +The [beforeAddFreeText](https://ej2.syncfusion.com/vue/documentation/api/pdfviewer/beforeAddFreeTextEventArgs/) event is triggered before adding a text in the freeText annotation. + +#### Event Arguments + +For event data, see [BeforeAddFreeTextEventArgs](https://ej2.syncfusion.com/vue/documentation/api/pdfviewer/beforeAddFreeTextEventArgs/). + +The following example illustrates how to handle the `beforeAddFreeText` event. + +{% tabs %} +{% highlight html tabtitle="Composition API (~/src/App.vue)" %} + + + + + +{% endhighlight %} +{% highlight html tabtitle="Options API (~/src/App.vue)" %} + + + + + +{% endhighlight %} +{% endtabs %} + +## Signature-related events + +### addSignature + +The [addSignature](https://ej2.syncfusion.com/vue/documentation/api/pdfviewer/addSignatureEventArgs/) event is triggered when a signature is added to a page of a PDF document. + +#### Event Arguments + +For event data, see [AddSignatureEventArgs](https://ej2.syncfusion.com/vue/documentation/api/pdfviewer/addSignatureEventArgs/). It provides properties such as `pageNumber`. + +The following example illustrates how to handle the `addSignature` event. + +{% tabs %} +{% highlight html tabtitle="Composition API (~/src/App.vue)" %} + + + + + +{% endhighlight %} +{% highlight html tabtitle="Options API (~/src/App.vue)" %} + + + + + +{% endhighlight %} +{% endtabs %} + +### removeSignature + +The [removeSignature](https://ej2.syncfusion.com/vue/documentation/api/pdfviewer/removeSignatureEventArgs/) event is triggered when the signature is removed from the page of a PDF document. + +#### Event Arguments + +For event data, see [RemoveSignatureEventArgs](https://ej2.syncfusion.com/vue/documentation/api/pdfviewer/removeSignatureEventArgs/). It provides properties such as `pageNumber`. + +The following example illustrates how to handle the `removeSignature` event. + +{% tabs %} +{% highlight html tabtitle="Composition API (~/src/App.vue)" %} + + + + + +{% endhighlight %} +{% highlight html tabtitle="Options API (~/src/App.vue)" %} + + + + + +{% endhighlight %} +{% endtabs %} + +### resizeSignature + +The [resizeSignature](https://ej2.syncfusion.com/vue/documentation/api/pdfviewer/resizeSignatureEventArgs/) event is triggered when the signature is resized and placed on a page of a PDF document. + +#### Event Arguments + +For event data, see [ResizeSignatureEventArgs](https://ej2.syncfusion.com/vue/documentation/api/pdfviewer/resizeSignatureEventArgs/). + +The following example illustrates how to handle the `resizeSignature` event. + +{% tabs %} +{% highlight html tabtitle="Composition API (~/src/App.vue)" %} + + + + + +{% endhighlight %} +{% highlight html tabtitle="Options API (~/src/App.vue)" %} + + + + + +{% endhighlight %} +{% endtabs %} + +### signaturePropertiesChange + +The [signaturePropertiesChange](https://ej2.syncfusion.com/vue/documentation/api/pdfviewer/signaturePropertiesChangeEventArgs/) event is triggered when the property of the signature is changed in the page of the PDF document. + +#### Event Arguments + +For event data, see [SignaturePropertiesChangeEventArgs](https://ej2.syncfusion.com/vue/documentation/api/pdfviewer/signaturePropertiesChangeEventArgs/). + +The following example illustrates how to handle the `signaturePropertiesChange` event. + +{% tabs %} +{% highlight html tabtitle="Composition API (~/src/App.vue)" %} + + + + + +{% endhighlight %} +{% highlight html tabtitle="Options API (~/src/App.vue)" %} + + + + + +{% endhighlight %} +{% endtabs %} + +### signatureSelect + +The [signatureSelect](https://ej2.syncfusion.com/vue/documentation/api/pdfviewer/signatureSelectEventArgs/) event is triggered when signature is selected over the page of the PDF document. + +#### Event Arguments + +For event data, see [SignatureSelectEventArgs](https://ej2.syncfusion.com/vue/documentation/api/pdfviewer/signatureSelectEventArgs/). + +The following example illustrates how to handle the `signatureSelect` event. + +{% tabs %} +{% highlight html tabtitle="Composition API (~/src/App.vue)" %} + + + + + +{% endhighlight %} +{% highlight html tabtitle="Options API (~/src/App.vue)" %} + + + + + +{% endhighlight %} +{% endtabs %} + +### signatureUnselect + +The [signatureUnselect](https://ej2.syncfusion.com/vue/documentation/api/pdfviewer/signatureUnSelectEventArgs/) event is triggered when signature is unselected over the page of the PDF document. + +#### Event Arguments + +For event data, see [SignatureUnSelectEventArgs](https://ej2.syncfusion.com/vue/documentation/api/pdfviewer/signatureUnSelectEventArgs/). + +The following example illustrates how to handle the `signatureUnselect` event. + +{% tabs %} +{% highlight html tabtitle="Composition API (~/src/App.vue)" %} + + + + + +{% endhighlight %} +{% highlight html tabtitle="Options API (~/src/App.vue)" %} + + + + + +{% endhighlight %} +{% endtabs %} diff --git a/Document-Processing/PDF/PDF-Viewer/vue/annotation/annotations-in-mobile-view.md b/Document-Processing/PDF/PDF-Viewer/vue/annotation/annotations-in-mobile-view.md new file mode 100644 index 000000000..75875a422 --- /dev/null +++ b/Document-Processing/PDF/PDF-Viewer/vue/annotation/annotations-in-mobile-view.md @@ -0,0 +1,122 @@ +--- +layout: post +title: Annotations in mobile view in Vue PDF Viewer component | Syncfusion +description: Learn how to use annotations in mobile view with the Syncfusion Vue PDF Viewer control (Essential JS 2). +platform: document-processing +control: PDF Viewer +documentation: ug +domainurl: ##DomainURL## +--- +# Annotations in mobile view in Vue PDF Viewer control + +## Open the annotation toolbar + +**Step 1:** Tap Edit Annotation on the toolbar to enable the annotation toolbar. + +![Enable the annotation toolbar](../images/editAnnotation.png) + +**Step 2:** The annotation toolbar appears below the main toolbar. + +![Annotation toolbar displayed](../images/after-enabling-annotation-toolbar.png) + +## Add sticky note annotations + +**Step 1:** Tap the Sticky Notes icon, then tap the page where the note should be placed. + +![Open sticky note tool](../images/add-sticky-notes.png) + +**Step 2:** Tap the page to add the sticky note annotation. + +![Sticky note annotation added on the page](../images/sticky-notes-in-page.png) + +## Add text markup annotations + +**Step 1:** Tap a text markup icon, select the text to mark, then tap the selection to apply the markup. + +![Select text for markup](../images/select-text.png) + +**Step 2:** The text markup annotation is applied to the selected text. + +![Text markup applied on the page](../images/add-text-markup.png) + +## Add shape and measurement annotations + +**Step 1:** Tap the Shape or Measure icon to open the corresponding toolbar. + +![Open shape and measurement tools](../images/add-shapes.png) + +**Step 2:** Choose a shape or measurement type, then draw it on the page. + +![Select measurement type](../images/open-radius.png) + +**Step 3:** The annotation appears on the PDF page. + +![Measurement annotation placed on the page](../images/radius-annotation.png) + +## Add stamp annotations + +**Step 1:** Tap the Stamp icon and select a stamp type from the menu. + +![Open stamp tool](../images/open-stamp.png) + +**Step 2:** Tap the page to place the stamp annotation. + +![Stamp annotation added on the page](../images/add-revised.png) + +## Add signature annotations + +**Step 1:** Tap the Signature icon to open the canvas. Draw the signature, tap Create, then tap the viewer to place it. + +![Open signature canvas](../images/add-signature.png) + +**Step 2:** The signature is added to the page. + +![Signature placed on the page](../images/adding-signature.png) + +## Add ink annotations + +**Step 1:** Tap the Ink tool and draw on the page. + +![Open ink tool](../images/open-ink.png) + +**Step 2:** The ink annotation appears on the page. + +![Ink annotation drawn on the page](../images/ink-annotation.png) + +## Change annotation properties (before adding) + +**Step 1:** Change properties before placing the annotation. + +**Step 2:** Tap the annotation icon to open the property toolbar, adjust properties, then place the annotation on the page. + +![Adjust fill color before adding](../images/open-fillcolor.png) + +## Change annotation properties (after adding) + +**Step 1:** Change annotation properties after adding the annotation. + +**Step 2:** Select the annotation to show the property toolbar, then adjust the properties. + +![Edit annotation properties after adding](../images/change-property.png) + +## Delete annotations + +**Step 1:** Select the annotation to show the property toolbar, then tap the Delete icon to remove it. + +![Delete icon in the property toolbar](../images/delete-icon.png) + +## Open the comment panel + +**Step 1:** Open the comment panel using the icon in the property toolbar or the annotation toolbar. + +![Open the comment panel](../images/open-comment.png) + +**Step 2:** The comment panel appears. + +![Comment panel displayed](../images/comment-panel.png) + +## Close the comment panel + +**Step 1:** Tap the Close button to close the comment panel. + +![Close the comment panel](../images/close-comment-panel.png) From 195d927b1727cdd113997b63c52536f7490ad102 Mon Sep 17 00:00:00 2001 From: MuralidharanGSF4527 Date: Mon, 27 Oct 2025 19:09:30 +0530 Subject: [PATCH 073/163] 986927: UG Docs Revamp: Annotation Events, Toolbar Restructure & Feature Enhancements for Vue Platform --- Document-Processing-toc.html | 69 +- .../PDF/PDF-Viewer/vue/accessibility.md | 71 +- .../PDF/PDF-Viewer/vue/annotation/comments.md | 148 +- .../vue/annotation/free-text-annotation.md | 116 +- .../vue/annotation/ink-annotation.md | 82 +- .../vue/annotation/line-angle-constraints.md | 45 +- .../vue/annotation/measurement-annotation.md | 76 +- .../vue/annotation/shape-annotation.md | 70 +- .../vue/annotation/signature-annotation.md | 60 +- .../vue/annotation/stamp-annotation.md | 50 +- .../vue/annotation/sticky-notes-annotation.md | 75 +- .../vue/annotation/text-markup-annotation.md | 142 +- .../PDF-Viewer/vue/content-security-policy.md | 12 +- .../PDF/PDF-Viewer/vue/download.md | 18 +- .../PDF/PDF-Viewer/vue/event.md | 3896 +++++++++++++++++ .../PDF/PDF-Viewer/vue/feature-module.md | 40 +- .../form-designer/create-programmatically.md | 2423 +--------- .../create-with-user-interface-interaction.md | 54 +- .../vue/form-designer/form-field-events.md | 58 +- .../PDF/PDF-Viewer/vue/form-filling.md | 138 + .../vue/getting-started-application.md | 48 +- .../vue/getting-started-with-server-backed.md | 63 +- .../PDF/PDF-Viewer/vue/getting-started.md | 44 +- .../PDF/PDF-Viewer/vue/globalization.md | 18 +- .../PDF/PDF-Viewer/vue/how-to-overview.md | 63 + .../how-to/add-annotation-in-text-search.md | 16 +- .../PDF-Viewer/vue/how-to/add-header-value.md | 52 + .../PDF-Viewer/vue/how-to/add-save-button.md | 35 +- .../vue/how-to/annotation-selectors.md | 125 + .../vue/how-to/authorization-token.md | 6 +- ...e-author-name-using-annotation-settings.md | 120 + .../configure-annotation-selector-setting.md | 40 +- .../PDF/PDF-Viewer/vue/how-to/conformance.md | 32 +- .../how-to/control-annotation-visibility.md | 14 +- ...pdf-library-bounds-to-pdf-viewer-bounds.md | 20 +- .../convert-pixel-to-point-in-server-side.md | 6 +- .../how-to/create-pdfviewer-service-core.md | 429 ++ .../vue/how-to/create-pdfviewer-service.md | 278 ++ .../vue/how-to/custom-context-menu.md | 30 +- .../vue/how-to/custom-font-signature-field.md | 23 +- .../PDF/PDF-Viewer/vue/how-to/custom-fonts.md | 25 +- .../vue/how-to/customize-text-search-color.md | 91 + .../vue/how-to/delete-annotation.md | 12 +- .../vue/how-to/disable-context-menu.md | 82 + .../vue/how-to/disable-tile-rendering.md | 70 + .../display-custom-tool-tip-for-annotation.md | 109 + .../vue/how-to/download-start-event.md | 14 +- .../vue/how-to/enable-local-storage.md | 18 +- .../vue/how-to/enable-text-selection.md | 28 +- .../PDF-Viewer/vue/how-to/export-as-image.md | 34 +- .../vue/how-to/extract-text-completed.md | 10 +- .../vue/how-to/extract-text-option.md | 12 +- .../PDF/PDF-Viewer/vue/how-to/extract-text.md | 35 +- .../PDF-Viewer/vue/how-to/find-text-async.md | 28 +- .../PDF/PDF-Viewer/vue/how-to/get-base64.md | 10 +- .../PDF/PDF-Viewer/vue/how-to/getPageInfo.md | 16 +- .../highlight-underline-strikeout-text.md | 74 + .../how-to/identify-added-annotation-mode.md | 67 + .../vue/how-to/import-annotations.md | 243 + .../vue/how-to/import-export-annotation.md | 14 +- .../PDF-Viewer/vue/how-to/load-documents.md | 14 +- .../vue/how-to/load-n-number-page.md | 4 +- .../PDF/PDF-Viewer/vue/how-to/min-max-zoom.md | 18 +- .../PDF-Viewer/vue/how-to/open-bookmark.md | 16 +- .../PDF-Viewer/vue/how-to/open-thumbnail.md | 8 +- .../vue/how-to/overlapped-annotation.md | 47 + .../pagerenderstarted-pagerendercompleted.md | 12 +- ...lve-unable-to-find-an-entry-point-error.md | 18 +- .../how-to/restricting-zoom-in-mobile-mode.md | 10 +- .../PDF-Viewer/vue/how-to/retry-timeout.md | 4 +- .../vue/how-to/select-annotation.md | 6 +- .../vue/how-to/show-custom-stamp-item.md | 14 +- .../vue/how-to/show-hide-annotation.md | 12 +- .../signatureselect-signatureunselect.md | 20 +- .../PDF-Viewer/vue/how-to/unload-document.md | 6 +- .../vue/how-to/webservice-not-listening.md | 2 +- .../PDF/PDF-Viewer/vue/images/add-revised.png | Bin 0 -> 28372 bytes .../PDF/PDF-Viewer/vue/images/add-shapes.png | Bin 0 -> 19221 bytes .../PDF-Viewer/vue/images/add-signature.png | Bin 0 -> 22529 bytes .../vue/images/add-sticky-notes.png | Bin 0 -> 20021 bytes .../PDF-Viewer/vue/images/add-text-markup.png | Bin 0 -> 23517 bytes .../vue/images/adding-signature.png | Bin 0 -> 19302 bytes .../after-enabling-annotation-toolbar.png | Bin 0 -> 18960 bytes .../PDF-Viewer/vue/images/change-property.png | Bin 0 -> 23044 bytes .../vue/images/close-comment-panel.png | Bin 0 -> 6322 bytes .../PDF-Viewer/vue/images/comment-panel.png | Bin 0 -> 18581 bytes .../PDF/PDF-Viewer/vue/images/delete-icon.png | Bin 0 -> 23763 bytes .../vue/images/form-filling-signature-del.png | Bin 0 -> 73116 bytes .../images/form-filling-signature-dialog.png | Bin 0 -> 81767 bytes .../images/form-filling-signature-signed.png | Bin 0 -> 69868 bytes .../vue/images/form-filling-signature.png | Bin 0 -> 65093 bytes .../PDF-Viewer/vue/images/form-filling.png | Bin 0 -> 69993 bytes .../PDF-Viewer/vue/images/ink-annotation.png | Bin 0 -> 28262 bytes .../PDF-Viewer/vue/images/open-comment.png | Bin 0 -> 23349 bytes .../PDF-Viewer/vue/images/open-fillcolor.png | Bin 0 -> 21372 bytes .../PDF/PDF-Viewer/vue/images/open-ink.png | Bin 0 -> 18662 bytes .../PDF/PDF-Viewer/vue/images/open-radius.png | Bin 0 -> 19925 bytes .../PDF/PDF-Viewer/vue/images/open-stamp.png | Bin 0 -> 28981 bytes .../vue/images/radius-annotation.png | Bin 0 -> 22784 bytes .../PDF/PDF-Viewer/vue/images/select-text.png | Bin 0 -> 23051 bytes .../vue/images/sticky-notes-in-page.png | Bin 0 -> 20085 bytes .../PDF/PDF-Viewer/vue/interaction-mode.md | 28 +- .../bookmark-navigation.md | 371 ++ .../hyperlink-navigation.md | 478 ++ .../page-navigation.md | 533 +++ .../page-thumbnail-navigation.md | 199 + .../PDF/PDF-Viewer/vue/magnification.md | 17 +- .../PDF/PDF-Viewer/vue/mobile-toolbar.md | 10 +- .../PDF/PDF-Viewer/vue/navigation.md | 34 +- .../vue/open-pdf-file/from-amazon-s3.md | 36 +- .../from-azure-active-directory.md | 92 +- .../open-pdf-file/from-azure-blob-storage.md | 38 +- .../from-box-cloud-file-storage.md | 49 +- .../from-dropbox-cloud-file-storage.md | 101 +- .../from-google-cloud-storage.md | 24 +- .../vue/open-pdf-file/from-google-drive.md | 22 +- .../vue/open-pdf-file/from-one-drive.md | 24 +- .../PDF/PDF-Viewer/vue/open-pdf-files.md | 60 +- .../PDF-Viewer/vue/organize-pdf-overview.md | 38 + .../PDF/PDF-Viewer/vue/organize-pdf.md | 6 +- .../organize-pdf/organize-page-mobile-view.md | 34 + .../vue/organize-pdf/organize-pdf-events.md | 197 + .../programmatic-support-for-organize-page.md | 292 ++ .../vue/organize-pdf/toolbar-organize-page.md | 250 ++ .../ui-interactions-organize-page.md | 95 + .../PDF/PDF-Viewer/vue/overview.md | 8 +- .../PDF/PDF-Viewer/vue/print.md | 628 ++- .../PDF/PDF-Viewer/vue/quasar.md | 16 +- .../vue/save-pdf-file/to-amazon-s3.md | 36 +- .../to-azure-active-directory.md | 58 +- .../save-pdf-file/to-azure-blob-storage.md | 42 +- .../to-box-cloud-file-storage.md | 27 +- .../to-dropbox-cloud-file-storage.md | 46 +- .../save-pdf-file/to-google-cloud-storage.md | 24 +- .../vue/save-pdf-file/to-google-drive.md | 28 +- .../vue/save-pdf-file/to-one-drive.md | 34 +- .../PDF/PDF-Viewer/vue/save-pdf-files.md | 62 +- .../PDF-Viewer/vue/text-markup-annotation.md | 4 +- .../PDF/PDF-Viewer/vue/text-search.md | 328 +- .../PDF/PDF-Viewer/vue/textselection.md | 450 ++ .../annotation-toolbar-customization.md | 387 ++ .../toolbar-customization/custom-toolbar.md | 436 ++ .../form-designer-toolbar-customization.md | 354 ++ .../toolbar-customization/mobile-toolbar.md | 305 ++ .../primary-toolbar-customization.md | 178 + .../PDF/PDF-Viewer/vue/toolbar.md | 35 - .../cp-command-not-recognized.md | 21 +- .../document-loading-issues.md | 30 +- .../vue/troubleshooting/troubleshooting.md | 13 +- 149 files changed, 12981 insertions(+), 3905 deletions(-) create mode 100644 Document-Processing/PDF/PDF-Viewer/vue/event.md create mode 100644 Document-Processing/PDF/PDF-Viewer/vue/form-filling.md create mode 100644 Document-Processing/PDF/PDF-Viewer/vue/how-to-overview.md create mode 100644 Document-Processing/PDF/PDF-Viewer/vue/how-to/add-header-value.md create mode 100644 Document-Processing/PDF/PDF-Viewer/vue/how-to/annotation-selectors.md create mode 100644 Document-Processing/PDF/PDF-Viewer/vue/how-to/change-author-name-using-annotation-settings.md create mode 100644 Document-Processing/PDF/PDF-Viewer/vue/how-to/create-pdfviewer-service-core.md create mode 100644 Document-Processing/PDF/PDF-Viewer/vue/how-to/create-pdfviewer-service.md create mode 100644 Document-Processing/PDF/PDF-Viewer/vue/how-to/customize-text-search-color.md create mode 100644 Document-Processing/PDF/PDF-Viewer/vue/how-to/disable-context-menu.md create mode 100644 Document-Processing/PDF/PDF-Viewer/vue/how-to/disable-tile-rendering.md create mode 100644 Document-Processing/PDF/PDF-Viewer/vue/how-to/display-custom-tool-tip-for-annotation.md create mode 100644 Document-Processing/PDF/PDF-Viewer/vue/how-to/highlight-underline-strikeout-text.md create mode 100644 Document-Processing/PDF/PDF-Viewer/vue/how-to/identify-added-annotation-mode.md create mode 100644 Document-Processing/PDF/PDF-Viewer/vue/how-to/import-annotations.md create mode 100644 Document-Processing/PDF/PDF-Viewer/vue/how-to/overlapped-annotation.md create mode 100644 Document-Processing/PDF/PDF-Viewer/vue/images/add-revised.png create mode 100644 Document-Processing/PDF/PDF-Viewer/vue/images/add-shapes.png create mode 100644 Document-Processing/PDF/PDF-Viewer/vue/images/add-signature.png create mode 100644 Document-Processing/PDF/PDF-Viewer/vue/images/add-sticky-notes.png create mode 100644 Document-Processing/PDF/PDF-Viewer/vue/images/add-text-markup.png create mode 100644 Document-Processing/PDF/PDF-Viewer/vue/images/adding-signature.png create mode 100644 Document-Processing/PDF/PDF-Viewer/vue/images/after-enabling-annotation-toolbar.png create mode 100644 Document-Processing/PDF/PDF-Viewer/vue/images/change-property.png create mode 100644 Document-Processing/PDF/PDF-Viewer/vue/images/close-comment-panel.png create mode 100644 Document-Processing/PDF/PDF-Viewer/vue/images/comment-panel.png create mode 100644 Document-Processing/PDF/PDF-Viewer/vue/images/delete-icon.png create mode 100644 Document-Processing/PDF/PDF-Viewer/vue/images/form-filling-signature-del.png create mode 100644 Document-Processing/PDF/PDF-Viewer/vue/images/form-filling-signature-dialog.png create mode 100644 Document-Processing/PDF/PDF-Viewer/vue/images/form-filling-signature-signed.png create mode 100644 Document-Processing/PDF/PDF-Viewer/vue/images/form-filling-signature.png create mode 100644 Document-Processing/PDF/PDF-Viewer/vue/images/form-filling.png create mode 100644 Document-Processing/PDF/PDF-Viewer/vue/images/ink-annotation.png create mode 100644 Document-Processing/PDF/PDF-Viewer/vue/images/open-comment.png create mode 100644 Document-Processing/PDF/PDF-Viewer/vue/images/open-fillcolor.png create mode 100644 Document-Processing/PDF/PDF-Viewer/vue/images/open-ink.png create mode 100644 Document-Processing/PDF/PDF-Viewer/vue/images/open-radius.png create mode 100644 Document-Processing/PDF/PDF-Viewer/vue/images/open-stamp.png create mode 100644 Document-Processing/PDF/PDF-Viewer/vue/images/radius-annotation.png create mode 100644 Document-Processing/PDF/PDF-Viewer/vue/images/select-text.png create mode 100644 Document-Processing/PDF/PDF-Viewer/vue/images/sticky-notes-in-page.png create mode 100644 Document-Processing/PDF/PDF-Viewer/vue/interactive-pdf-navigation/bookmark-navigation.md create mode 100644 Document-Processing/PDF/PDF-Viewer/vue/interactive-pdf-navigation/hyperlink-navigation.md create mode 100644 Document-Processing/PDF/PDF-Viewer/vue/interactive-pdf-navigation/page-navigation.md create mode 100644 Document-Processing/PDF/PDF-Viewer/vue/interactive-pdf-navigation/page-thumbnail-navigation.md create mode 100644 Document-Processing/PDF/PDF-Viewer/vue/organize-pdf-overview.md create mode 100644 Document-Processing/PDF/PDF-Viewer/vue/organize-pdf/organize-page-mobile-view.md create mode 100644 Document-Processing/PDF/PDF-Viewer/vue/organize-pdf/organize-pdf-events.md create mode 100644 Document-Processing/PDF/PDF-Viewer/vue/organize-pdf/programmatic-support-for-organize-page.md create mode 100644 Document-Processing/PDF/PDF-Viewer/vue/organize-pdf/toolbar-organize-page.md create mode 100644 Document-Processing/PDF/PDF-Viewer/vue/organize-pdf/ui-interactions-organize-page.md create mode 100644 Document-Processing/PDF/PDF-Viewer/vue/textselection.md create mode 100644 Document-Processing/PDF/PDF-Viewer/vue/toolbar-customization/annotation-toolbar-customization.md create mode 100644 Document-Processing/PDF/PDF-Viewer/vue/toolbar-customization/custom-toolbar.md create mode 100644 Document-Processing/PDF/PDF-Viewer/vue/toolbar-customization/form-designer-toolbar-customization.md create mode 100644 Document-Processing/PDF/PDF-Viewer/vue/toolbar-customization/mobile-toolbar.md create mode 100644 Document-Processing/PDF/PDF-Viewer/vue/toolbar-customization/primary-toolbar-customization.md diff --git a/Document-Processing-toc.html b/Document-Processing-toc.html index 32f21d3bb..5a3f37d8a 100644 --- a/Document-Processing-toc.html +++ b/Document-Processing-toc.html @@ -787,8 +787,7 @@
    diff --git a/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Aqua.png b/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Aqua.png new file mode 100644 index 0000000000000000000000000000000000000000..a0cd024e9363698a47ad575146089cd1f71f4268 GIT binary patch literal 226 zcmeAS@N?(olHy`uVBq!ia0vp^y+EwO!3HF^`0i{5QjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`ISV`@iy0XB4ude`@%$AjK*4fP7srr_xVM)U3La2kIB?+7)Eo88Wla4K zAN@})ITn*$FYu?lLHzQBnQdoGQkE$i^UlmX;p3bpWkiwC8wRNp%tG(w^qv5nz~JfX K=d#Wzp$P!}q)#FM literal 0 HcmV?d00001 diff --git a/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Black.png b/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Black.png new file mode 100644 index 0000000000000000000000000000000000000000..605fca7d86b1f0a1f9b98f97fafbcad22102f85e GIT binary patch literal 286 zcmeAS@N?(olHy`uVBq!ia0vp^*MQiJgAGXTUY@=NNHG=%xjQkeJ16rJ$YDu$^mSxl z*x1kgCy^D%=PdAuEM{QfI}E~%$MaXD00lRDx;TbZ#J#<&$aFwK;J}9D|No6E-mLIW zsl9&Y4dc9D?->51>u^YLGaYMc*r<>&2$%&7ANm-xC;z{73Fv$VPgg&ebxsLQ0L1TF A9RL6T literal 0 HcmV?d00001 diff --git a/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/BlackCustom.png b/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/BlackCustom.png new file mode 100644 index 0000000000000000000000000000000000000000..e3f58c009786bfa290255fafe49e1171b97ae4af GIT binary patch literal 306 zcmeAS@N?(olHy`uVBq!ia0vp^pMlt#gAGWo^WF0dNHG=%xjQkeJ16rJ$YDu$^mSxl z*x1kgCy^D%=PdAuEM{QfI}E~%$MaXD00obGx;TbZ#J#<2D9E57a9{)b|9OeW8TY2V zxo2ve-thjdIYYgXvC9ler87K&X>ANn{1`ISV`@iy0XB4ude`@%$AjK*2|zE{-7;ac?hgWMoj_Y1r`Uzy0;Q;vQ~g z=gz!iu>8*N(EL;J)E|M=x(*|Imzna5&hQ65YuEVfJY~oTSIy{Q>hPMIv=-=F22WQ% Jmvv4FO#qHyhI{}3 literal 0 HcmV?d00001 diff --git a/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/BlueCustom.png b/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/BlueCustom.png new file mode 100644 index 0000000000000000000000000000000000000000..8f6e4e0029d882243cd57bf20cf4cb6a70e1bbdd GIT binary patch literal 329 zcmeAS@N?(olHy`uVBq!ia0vp^zkt}8gAGV-)s$!eQjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`ISV`@iy0XB4ude`@%$AjK*4*SE{-7;ac?hgWMoj_Y1r`Uzy0fXoRfOq zteIKN_TyF^^9T9G&J7n854;daDB&=$Vv&$#>fvK_YiAe&!UtIA#4)w>@osho`jo-b L)z4*}Q$iB}+h1fB literal 0 HcmV?d00001 diff --git a/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Blue_grey.png b/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Blue_grey.png new file mode 100644 index 0000000000000000000000000000000000000000..6ff382a4de2ecda429486bc8a1754da07189afbb GIT binary patch literal 329 zcmeAS@N?(olHy`uVBq!ia0vp^-+Nn{1`ISV`@iy0XB4ude`@%$AjK*4*SE{-7;ac?gh3La2kIB+0nV}+CM8w-W+ z_G#y56u;&7`1zh;&-ohyDLEWQW-OA@O+CDh$J!K3|K literal 0 HcmV?d00001 diff --git a/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Bright_green.png b/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Bright_green.png new file mode 100644 index 0000000000000000000000000000000000000000..9533b280a633de78f9290e19ab72ee0026ebfd49 GIT binary patch literal 328 zcmeAS@N?(olHy`uVBq!ia0vp^-+|bfgAGVJT%T+Jq!^2X+?^QKos)S9a~60+7BevL9R^{>b6~@v|Mt`83M*Bg znP+Tm?Qrfd^M!=G4kL4ynbM2S@CH6>(Nn{1`ISV`@iy0XB4ude`@%$AjK*1NDE{-7;ac?hg6l4%!IN-1*CF=4eX~pmH z%g)ac=!^BlJGYM`*^1CWs8oN1O3e4 M>FVdQ&MBb@0L}Mp(*OVf literal 0 HcmV?d00001 diff --git a/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Custom0.png b/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Custom0.png new file mode 100644 index 0000000000000000000000000000000000000000..b751410890ab5a851fc8db77089028bc22af3761 GIT binary patch literal 318 zcmeAS@N?(olHy`uVBq!ia0vp^pMcn&gAGXDlAC%CNHG=%xjQkeJ16rJ$YDu$^mSxl z*x1kgCy^D%=PdAuEM{QfI}E~%$MaXD00l35x;TbZ#J#<2D9E57a9{)b|9OeW8TY2V zxo2ve-mw0yIm3TLBNhosrXC(fw>Ac4=Z1-j2Tlkiq;MDvQsD!v##a~60+7BevL9R^{>KbH0196oq1 zE}x(KyJ5|LUWe|JiszmPq!)Dy0PPImia+K?YA( KKbLh*2~7Ya>v*F8 literal 0 HcmV?d00001 diff --git a/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Custom10.png b/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Custom10.png new file mode 100644 index 0000000000000000000000000000000000000000..878a4b3ebbe0e35ea1d4b69b6c68a1c7e50ae827 GIT binary patch literal 323 zcmeAS@N?(olHy`uVBq!ia0vp^-+|bXgAF7iZ)6Rm7>k44ofy`glX(f`u%tWsIx;Y9 z?C1WI$O`0h7I;J!GcfQS24TkI`72U@f;T)}978JN-d;8oWKa+|uz~%lMY}BL-jp}@ zOpD(!SpMdBXx^!K>W)BaUWbvn%S`D-XLtjjwP_SPPZ`w0E7+SfnHU)+nTr7Z$l&Sf K=d#Wzp$Pztk8~OU literal 0 HcmV?d00001 diff --git a/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Custom11.png b/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Custom11.png new file mode 100644 index 0000000000000000000000000000000000000000..c0665a23417759bc57b0f6fdf681332b5188f357 GIT binary patch literal 326 zcmeAS@N?(olHy`uVBq!ia0vp^KY-YYgAGVlHAqVUDaPU;cPEB*=VV?2IV|apzK#qG z8~eHcB(eheoCO|{#S9F5he4R}c>anMpx|v!7srr_xVM)L1sN0s4j4H6v~HK>+?(>| zp6%v$Oq0&ZH}Ew(&p4=f=7B(30f(_gi=@mU9==4jc7wq#yn$We8B;TBcwsuwn+%?= KelF{r5}E)e@MmHG literal 0 HcmV?d00001 diff --git a/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Custom12.png b/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Custom12.png new file mode 100644 index 0000000000000000000000000000000000000000..c3c941ed244ca2104435194fc515147f215976e1 GIT binary patch literal 329 zcmeAS@N?(olHy`uVBq!ia0vp^Ux3(|gAGWoexP9tq!^2X+?^QKos)S9a~60+7BevL9R^{>Nn{1`ISV`@iy0XB4ude`@%$AjK*6h?E{-7;ac?gh3Nk1N958VBY27Z%xi{s_ zy}fDgm?oW*Z{TZoo^ep|%mab60uEz~7D<^yJba04?FNHbSZa~60+7BevL9R^{>Py0tSbc5b++c;JOVLJ5a~6^n!{(-0FbU?|zed{)dQa~sg# N44$rjF6*2UngE$aYQg{j literal 0 HcmV?d00001 diff --git a/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Custom15.png b/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Custom15.png new file mode 100644 index 0000000000000000000000000000000000000000..e0c1f3bc6ac5c497db018b55c66333cdf78c79fd GIT binary patch literal 330 zcmeAS@N?(olHy`uVBq!ia0vp^zk%49gAGVVy)NDdq!^2X+?^QKos)S9a~60+7BevL9R^{>;*}3JW;-NPJiDexI)-E$-mCo=94gui~=I+PLtm1s%y?|b2 N@O1TaS?83{1OPrJcNG8t literal 0 HcmV?d00001 diff --git a/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Custom16.png b/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Custom16.png new file mode 100644 index 0000000000000000000000000000000000000000..2a70e3c354a25dfc80116a08a173b1f906431cb2 GIT binary patch literal 327 zcmeAS@N?(olHy`uVBq!ia0vp^zk%3^gAGVd+`d2>NHG=%xjQkeJ16rJ$YDu$^mSxl z*x1kgCy^D%=PdAuEM{QfI}E~%$MaXD00r-Ox;TbZ#J#<|k&!`w;ef%P{|(tU=Po#T zV{h^MVzv)^zp_2>PiyDc?A&rw@z5KA#IgNn{1`ISV`@iy0XB4ude`@%$AjK*3v{E{-7;ac?gh3La2kIN)#~$oApNtkZGq zPyQW$GxPoC{fsfWf0+y9m7Na~60+7BevL9R^{>rax3X@zopr00=vA^8f$< literal 0 HcmV?d00001 diff --git a/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Custom19.png b/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Custom19.png new file mode 100644 index 0000000000000000000000000000000000000000..d0880cc5df0680b8b2ac9db26c68eb746fc10dad GIT binary patch literal 351 zcmeAS@N?(olHy`uVBq!ia0vp^|A5$wgAGW|KKs%LNHG=%xjQkeJ16rJ$YDu$^mSxl z*x1kgCy^D%=PdAuEM{QfI}E~%$MaXD00qBzx;TbZ#J#<2$ap|O;J|^P|Cc^|dE=o_ zp8Rc%t+D)sPxl!s=6_T?@k1b`hQr8?MN+=0hu`s7yTW7V2}4x)0;3EYOYG0U(A_}) OGkCiCxvXa~60+7BevL9R^{>a~60+7BevL9R^{>anMpx|v!7srr_xVM)L1sN0s4j4H6v~HK>+?(>| zUTyk2rb*}I8~B=?XB<>K^FSc2fWz3LMN;Mv4__i%yTM==-oUPZjk(Fode3^GHyJ!# L{an^LB{Ts5C!c5$ literal 0 HcmV?d00001 diff --git a/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Custom22.png b/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Custom22.png new file mode 100644 index 0000000000000000000000000000000000000000..be1ab47d0707a81ba866c5d8b6bfac53541e97fc GIT binary patch literal 323 zcmeAS@N?(olHy`uVBq!ia0vp^-+Nn{1`ISV`@iy0XB4ude`@%$AjK*1ZHE{-7;ac?gh3La2kIN-1%;>x4WcNPlY z?bFW7WY1?@Qd7=wFFl9D$c#l&x~YfP@mQNevh#$EiYIOeqzqo+3;Zs#m^Q9oXqXK2 OBZH@_pUXO@geCwM%4k#o literal 0 HcmV?d00001 diff --git a/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Custom23.png b/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Custom23.png new file mode 100644 index 0000000000000000000000000000000000000000..396e876cec6cff77ba39379fcbf7478b7177a26a GIT binary patch literal 318 zcmeAS@N?(olHy`uVBq!ia0vp^KY-YtgAGWYwP9rkQjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`ISV`@iy0XB4ude`@%$AjK*7tNE{-7;ac?gh3Nk1N956Vrf6I3kYoV%> zH}+OPyT__B*PcO^t=*v6dB#D-GYgAGV>zIp_r7>k44ofy`glX(f`u%tWsIx;Y9 z?C1WI$O=+Z;1OBOz`%DHgc*a~60+7BevL9R^{>b6~@v|Mt`83M*Bg znYVefwZpl;%oh^!I*iO+W=bzQ!yEXlO{3U(%1*^ocLY+0hOjNe4CdB6+sElZzcP5b L`njxgN@xNAKE!-r literal 0 HcmV?d00001 diff --git a/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Custom26.png b/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Custom26.png new file mode 100644 index 0000000000000000000000000000000000000000..359d1bd902974e87f5c68032ac448f27c27f0838 GIT binary patch literal 331 zcmeAS@N?(olHy`uVBq!ia0vp^KY-YUgAGWox%qO>_%)r2R7=#&*=dVZs3O?|3aSW-5dwY2!FM|TlfenZL+fSb>tWxz)$_iZ;-%44$rj JF6*2UngDDFY)}9I literal 0 HcmV?d00001 diff --git a/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Custom27.png b/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Custom27.png new file mode 100644 index 0000000000000000000000000000000000000000..69833b79df2fc47e0c557874a8653ed4aa4794f2 GIT binary patch literal 335 zcmeAS@N?(olHy`uVBq!ia0vp^Ux3(^gAGX5?mVprq!^2X+?^QKos)S9a~60+7BevL9R^{>n}c_rQK0Ud6UH0cYoqg^EWm2qa~27@D+5NI4A|;S;RFbD7(pX^F=J{mbC# L>gTe~DWM4f9)x5h literal 0 HcmV?d00001 diff --git a/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Custom28.png b/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Custom28.png new file mode 100644 index 0000000000000000000000000000000000000000..60275b6f279ba947e19f1863d2872dfb4ebb3095 GIT binary patch literal 317 zcmeAS@N?(olHy`uVBq!ia0vp^-+|bkgAGX9n8$SiDaPU;cPEB*=VV?2IV|apzK#qG z8~eHcB(eheoCO|{#S9F5he4R}c>anMpx`A>7srr_xVM)L1sN0s4j4H6v~HK>+?(>| zo^AF!rlNE54Q$2EQ+6tzx+9R9*I{JtGE;id8Q#EWZ5o4B*!E~VQ|;or%dZ1{$KdJe K=d#Wzp$PzX>2!wx literal 0 HcmV?d00001 diff --git a/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Custom29.png b/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Custom29.png new file mode 100644 index 0000000000000000000000000000000000000000..b0be935fd7e9d9a2a08651ea7ff3b005d9783d27 GIT binary patch literal 316 zcmeAS@N?(olHy`uVBq!ia0vp^-+a~60+7BevL9R^{>|++>&^ zvg`XTa~60+7BevL9R^{>fvK_YiAfr!aD-WnYz6Gon!*~n8DN4 K&t;ucLK6Tmp=llf literal 0 HcmV?d00001 diff --git a/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Custom30.png b/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Custom30.png new file mode 100644 index 0000000000000000000000000000000000000000..a04ef2b602e1ff3adf243123215c06c5d46e8e78 GIT binary patch literal 320 zcmeAS@N?(olHy`uVBq!ia0vp^-+Nn{1`ISV`@iy0XB4ude`@%$AjK*6h?E{-7;ac?hg6l4%!IN;!uS6n51;_vjA z#>elaGibi%J@CJW*YQ}JLbCIOjfy932&Ck27@4t1N;eH+;a!@)nCdM|wk`*HkipZ{ K&t;ucLK6VKpJ`eE literal 0 HcmV?d00001 diff --git a/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Custom31.png b/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Custom31.png new file mode 100644 index 0000000000000000000000000000000000000000..35db40ec82a05308465f676251e05b08d6e5f5ef GIT binary patch literal 320 zcmeAS@N?(olHy`uVBq!ia0vp^-+Nn{1`ISV`@iy0XB4ude`@%$AjK*6h?E{-7;ac?gh3Nk1N9N57Ae_rBo#=R+T z?wJ;!W6=D~d*FW$uj8>cg=FUm8x>F75J<`4FfwD2lx`Zt!n=(1nCgs+awh^k$l&Sf K=d#Wzp$P!AkZ5`U literal 0 HcmV?d00001 diff --git a/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Custom32.png b/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Custom32.png new file mode 100644 index 0000000000000000000000000000000000000000..1071027c20d89e2ed00f56924fe15c457c0b28c1 GIT binary patch literal 324 zcmeAS@N?(olHy`uVBq!ia0vp^zkt}0gAGXjc(}70NHG=%xjQkeJ16rJ$YDu$^mSxl z*x1kgCy^D%=PdAuEM{QfI}E~%$MaXD00nP)x;TbZ#J#<|k&!`w;ef%P`dRaD%w2Hu z#@^yL#cUt8er0=L@7B(+*ty}N;(-?e2_+l`RxA>-Og(&zgIidyb1Sn?gU{S2Kuh($ literal 0 HcmV?d00001 diff --git a/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Custom33.png b/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Custom33.png new file mode 100644 index 0000000000000000000000000000000000000000..691f38c85da973aeace3711b4e4c4b10dbf7c383 GIT binary patch literal 317 zcmeAS@N?(olHy`uVBq!ia0vp^-+a~60+7BevL9R^{>a~60+7BevL9R^{>{j9k!auvSE zFFSuHeLkbg8gqvKMkXy1QcgU)ifwHI&dwbR6^~pHNXp$$a~60+7BevL9R^{>;L z%=3R||Gs10u;wfKf}=+S(vv!j4Uf!}c;v%VsMcm7>^!Ga@!Sv){?0I4mHB1Zk*{Zg Po@MZK^>bP0l+XkK+`@Kv literal 0 HcmV?d00001 diff --git a/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Custom37.png b/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Custom37.png new file mode 100644 index 0000000000000000000000000000000000000000..92b9464b226ea9595d56be24a7b20c0509434116 GIT binary patch literal 333 zcmeAS@N?(olHy`uVBq!ia0vp^-+a~60+7BevL9R^{>vq$88hClN+DxSC@kdnh;WX2*X-PFVDc&tq!*?Gbc5Pre9>p%0$s-ORW Qo@HS0boFyt=akR{0QN?2vj6}9 literal 0 HcmV?d00001 diff --git a/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Custom38.png b/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Custom38.png new file mode 100644 index 0000000000000000000000000000000000000000..cef33b01690ae0b6ef72d8794fa42636dfa84b29 GIT binary patch literal 337 zcmeAS@N?(olHy`uVBq!ia0vp^KY`elgAGV_xI4@PQjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`ISV`@iy0XB4ude`@%$AjK*498E{-7;ac?gh@-iqe956VrpV8(aXPt`9 z+nx2F-&C_t*!quQ%M6)EK7560?G}@r=bThL_e3DQsKeOu$jqT4yo3GVVdl3jZ~dKs PK4$QA^>bP0l+XkKls|sL literal 0 HcmV?d00001 diff --git a/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Custom39.png b/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Custom39.png new file mode 100644 index 0000000000000000000000000000000000000000..ed656683a769c1b76e72d7197f080205078ee8bb GIT binary patch literal 282 zcmeAS@N?(olHy`uVBq!ia0vp^CxF<3gAGXTIJLbUNHG=%xjQkeJ16rJ$YDu$^mSxl z*x1kgCy^D%=PdAuEM{QfI}E~%$MaXD00q~3x;TbZ#J#<|k@tWC!vTX+|M@=z*Dq2Q xT2<6&n|6Nl{jKaDvhOik@Gu=z5EyvEuIm)@<*K;;XrR*>JYD@<);T3K0RSypNech~ literal 0 HcmV?d00001 diff --git a/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Custom4.png b/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Custom4.png new file mode 100644 index 0000000000000000000000000000000000000000..32374bb09455678e08aa6bdc59e096478ee30519 GIT binary patch literal 266 zcmeAS@N?(olHy`uVBq!ia0vp^CxO_QgAGX9p4X`YQjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`ISV`@iy0XB4ude`@%$AjK*9N*E{-7;ac?hgtxv|D5l@bWepDEKLJK?2$8NN@@Ghw;SkG22WQ%mvv4FO#l+eQIh}w literal 0 HcmV?d00001 diff --git a/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Custom40.png b/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Custom40.png new file mode 100644 index 0000000000000000000000000000000000000000..1b240b5949660c33a275d514e7db41283a9abc2e GIT binary patch literal 274 zcmeAS@N?(olHy`uVBq!ia0vp^$AH+3gAGW|;e6%-q!^2X+?^QKos)S9a~60+7BevL9R^{>Mp xdRTvE-p=!TnSVt5XOLi?WT+s)+%#~6jpcP_X6APG{Xi!(c)I$ztaD0e0szc3L*D=Z literal 0 HcmV?d00001 diff --git a/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Custom41.png b/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Custom41.png new file mode 100644 index 0000000000000000000000000000000000000000..cadd4cba14f001b3de8b9c3cd9e0136693aa48b2 GIT binary patch literal 283 zcmeAS@N?(olHy`uVBq!ia0vp^XMxy^gAGWgyp-Jxq!^2X+?^QKos)S9a~60+7BevL9R^{>sCW;R=1s;*b3=DjSL74G){)!Z!;8sr;$B>G+x0g3^9xxC%;BfqR|FpSwdk+eH zEniw?`*~gD0sY@R2j(U!81S&PH3F4LurVEWNRZ&*VQw5K!4Hg)(#%%5dV3Ur9$@fv L^>bP0l+XkK4xvwD literal 0 HcmV?d00001 diff --git a/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Custom44.png b/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Custom44.png new file mode 100644 index 0000000000000000000000000000000000000000..91a32e8a7f3245862604389ed2eac25cc6030174 GIT binary patch literal 288 zcmeAS@N?(olHy`uVBq!ia0vp^r-0akgAGXTu}|Lxq!^2X+?^QKos)S9a~60+7BevL9R^{>@aNvN+A5M|C<^D@f zF}!noU-v9_b3^=Zo&#q!1SD9Q7CR(}aP%-W1}YeEvA8uJ7%0IX3>S)+*`FG1+5q$b NgQu&X%Q~loCICyuPn`e& literal 0 HcmV?d00001 diff --git a/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Custom45.png b/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Custom45.png new file mode 100644 index 0000000000000000000000000000000000000000..52785abd1ee195621c50153991c0e0bb1472bbf8 GIT binary patch literal 273 zcmeAS@N?(olHy`uVBq!ia0vp^$AQ?CgAGW2jsJfINHG=%xjQkeJ16rJ$YDu$^mSxl z*x1kgCy^D%=PdAuEM{QfI}E~%$MaXD00ozMx;TbZ#J#<2D0sj?;J^lxgwyj6mYmdKI;Vst04d*8X8-^I literal 0 HcmV?d00001 diff --git a/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Custom46.png b/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Custom46.png new file mode 100644 index 0000000000000000000000000000000000000000..45f0547233178c89018c34d32856f4ec43f82a74 GIT binary patch literal 276 zcmeAS@N?(olHy`uVBq!ia0vp^CxO_EgAGXLGVKL%7>k44ofy`glX(f`u%tWsIx;Y9 z?C1WI$O`0h7I;J!GcfQS24TkI`72U@f-5~;978JN-d^6wdq9EVfWd=^x<|LlmIX~^ we`8qv?A~+91M9!?9yqHa;KOuqAc=>pb<3G9usPX306Ln%)78&qol`;+01t;x5dZ)H literal 0 HcmV?d00001 diff --git a/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Custom47.png b/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Custom47.png new file mode 100644 index 0000000000000000000000000000000000000000..c537c9ee5c17b645b0d4e4b12ef68713697536ac GIT binary patch literal 271 zcmeAS@N?(olHy`uVBq!ia0vp^r-0aqgAGW^E^)a7q!^2X+?^QKos)S9a~60+7BevL9R^{>f$_pWCZ@eCSz(%ub!YP#_?jIII9LXpXyN5gV_LY=ez`r+?F^o-elF{r5}E+yu}7W& literal 0 HcmV?d00001 diff --git a/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Custom5.png b/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Custom5.png new file mode 100644 index 0000000000000000000000000000000000000000..be2a84a5b369e55955bbd393528dbd2b705a0943 GIT binary patch literal 275 zcmeAS@N?(olHy`uVBq!ia0vp^r-9gngAGWk*q`|iq!^2X+?^QKos)S9a~60+7BevL9R^{>1n+%9R2Cv*g6vMOzMND=Ee!!(h;g6u~=FsF*1*PjP;GlQqA KpUXO@geCw8!&c@1 literal 0 HcmV?d00001 diff --git a/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Custom50.png b/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Custom50.png new file mode 100644 index 0000000000000000000000000000000000000000..275e838441e3991425062057dbaaa7463241bb31 GIT binary patch literal 298 zcmeAS@N?(olHy`uVBq!ia0vp^r-0aogAGWkuTxzEq!^2X+?^QKos)S9a~60+7BevL9R^{>@aNt0`##H-lW&TS} zFuZenU-xWoe#7dm><>~zIC_{G0~HLoSlk*9Xb4EKGA(vU7h{P&a@S9Oc}eg}Gm N!PC{xWt~$(69CF`P~QLm literal 0 HcmV?d00001 diff --git a/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Custom51.png b/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Custom51.png new file mode 100644 index 0000000000000000000000000000000000000000..55d1be41de530c0133db5cb7c31fb9dc4c2b9721 GIT binary patch literal 279 zcmeAS@N?(olHy`uVBq!ia0vp^XMot0gAF9IpG6r+F%}28J29*~C-V}>VM%xNb!1@J z*w6hZkrl}2EbxddW?*Or3Bd zum7g;b*X9w|9$lg?|7IS6BP`2SlSv77zjwPF&%bDkl>)ZAp6YCjOX1NtwezCX7F_N Kb6Mw<&;$S-c1h^~ literal 0 HcmV?d00001 diff --git a/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Custom52.png b/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Custom52.png new file mode 100644 index 0000000000000000000000000000000000000000..7f569e8b63fd6854a2132086abc1818ba957a8ee GIT binary patch literal 277 zcmeAS@N?(olHy`uVBq!ia0vp^r-9gngAGWk*q`|iq!^2X+?^QKos)S9a~60+7BevL9R^{>Nn{1`ISV`@iy0XB4ude`@%$AjK*7bHE{-7;ac?hgNn{1`ISV`@iy0XB4ude`@%$AjK*7zPE{-7;ac?hgbj@5%3M~h wib?3dY5d*pJVV{udmdKI;Vst00#v}b^rhX literal 0 HcmV?d00001 diff --git a/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Custom55.png b/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Custom55.png new file mode 100644 index 0000000000000000000000000000000000000000..bcfc00c23a5226e535663922c45a29fbfd11816d GIT binary patch literal 277 zcmeAS@N?(olHy`uVBq!ia0vp^r-0amgAGWY{=57jkYX$ja(7}_cTVOdki(Mh=Nn{1`ISV`@iy0XB4ude`@%$AjK*436E{-7;ac?hg6g;3HaA1S_@Ao{cu@?CX tQ{U}POXL6W;~(RWGmHmi1O}Agn`6tEy=T$6cA$$HJYD@<);T3K0RTi{ShD~C literal 0 HcmV?d00001 diff --git a/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Custom6.png b/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Custom6.png new file mode 100644 index 0000000000000000000000000000000000000000..1fb3a34727b171aad0133d6e80868f52033f1163 GIT binary patch literal 275 zcmeAS@N?(olHy`uVBq!ia0vp^r-0amgAGWY{=57jkYX$ja(7}_cTVOdki(Mh=pF>~sn?Gt!`Zf5Xw L^>bP0l+XkKdB;kV literal 0 HcmV?d00001 diff --git a/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Custom7.png b/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Custom7.png new file mode 100644 index 0000000000000000000000000000000000000000..487dca007107c1265ebb87eb160ad9b736870961 GIT binary patch literal 284 zcmeAS@N?(olHy`uVBq!ia0vp^CxO_CgAGVZ9jM&|q!^2X+?^QKos)S9a~60+7BevL9R^{>Nq!^2X+?^QKos)S9a~60+7BevL9R^{>Iz=iQ vcVF5&zxgRHrXH)gUlc`D2pAmUHQJjUmDc+;zau4V9a^>bP0l+XkKI%rc{ literal 0 HcmV?d00001 diff --git a/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Custom9.png b/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Custom9.png new file mode 100644 index 0000000000000000000000000000000000000000..37d3fed61b6a28e8b40d316e370bb25aa0f713bf GIT binary patch literal 286 zcmeAS@N?(olHy`uVBq!ia0vp^r-0akgAGXTu}|Lxq!^2X+?^QKos)S9a~60+7BevL9R^{>Nn{1`ISV`@iy0XB4ude`@%$AjK*4pME{-7;ac?hg!PC{xWt~$(6980hMV0^n literal 0 HcmV?d00001 diff --git a/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Dark_blue.png b/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Dark_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..0c93b54fdea1b19c507e0770dd236272f708f6c2 GIT binary patch literal 280 zcmeAS@N?(olHy`uVBq!ia0vp^CxF<3gAGXTIJLbUNHG=%xjQkeJ16rJ$YDu$^mSxl z*x1kgCy^D%=PdAuEM{QfI}E~%$MaXD00q~2x;TbZ#J#<|k@J9oz<~q(>gS(%W*WE& w-zO_G8Ny%l97q%3U~5bmaN+~ANjl^E*>ihW10Bxb>FVdQ&MBb@0Q_x9ssI20 literal 0 HcmV?d00001 diff --git a/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Dark_green.png b/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Dark_green.png new file mode 100644 index 0000000000000000000000000000000000000000..d7002fefcf0861be2dfc74f243d9943fa2b0ae2f GIT binary patch literal 285 zcmeAS@N?(olHy`uVBq!ia0vp^r-9gn2NHG=%xjQkeJ16rJ$YDu$^mSxl z*x1kgCy^D%=PdAuEM{QfI}E~%$MaXD00lRBx;TbZ#J#<2$a}y*;J|@=jj8tA%KDX# zGQ4wpU-xWoe#7dm><`Z92+U+v+U$@b)^UbuVx)o*w@X^%i2)J3$j|n2NHG=%xjQkeJ16rJ$YDu$^mSxl z*x1kgCy^D%=PdAuEM{QfI}E~%$MaXD00lRCx;TbZ#J#<|k+;D>;J^X($(t>|1TLv) z*nMg5{PJhg53=4eS{QS?q&1$<5tzxUwAmp=tm6#R#7G6B0TKMdJjIRit@xiGx Nc)I$ztaD0e0ss~OToC{O literal 0 HcmV?d00001 diff --git a/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Dark_teal.png b/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Dark_teal.png new file mode 100644 index 0000000000000000000000000000000000000000..39a4320df6113f3c00c9da01f356deb58a9b1f0c GIT binary patch literal 272 zcmeAS@N?(olHy`uVBq!ia0vp^$AH+BgAGVZ&7JZJNHG=%xjQkeJ16rJ$YDu$^mSxl z*x1kgCy^D%=PdAuEM{QfI}E~%$MaXD00ozNx;TbZ#J#<2D0o1D;ef*mRhx(R8RtG! ydRTvEp5-+=<{dTp3_Xk|B?NjH4-OFVkUiuV6Vv7l)_9a~60+7BevL9R^{>*?|fMTr6&l2Q&mESeX_(B#3bIFf|U8U;)GSJxuvCleo=*&S&s+ L^>bP0l+XkKK%GrO literal 0 HcmV?d00001 diff --git a/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Gold.png b/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Gold.png new file mode 100644 index 0000000000000000000000000000000000000000..112b0e0520d264bdc172a10d4154fdea5ef0ced9 GIT binary patch literal 280 zcmeAS@N?(olHy`uVBq!ia0vp^r-9g%gAGW&PnM4YQjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`ISV`@iy0XB4ude`@%$AjK*6=1E{-7;ac?gh@*Xe{IB>w^&%&vf%lnnC zGQ4wpU-v9_b3^=Zo&$3u6^yuD(i%_b2+U+v+U$@b)^UbuBE1D)Fmtgmo7|UMq6Tz0 NgQu&X%Q~loCIC`RShD~C literal 0 HcmV?d00001 diff --git a/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Green.png b/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Green.png new file mode 100644 index 0000000000000000000000000000000000000000..0c94fcb7909b1187ec883928558a9364cf1c49a3 GIT binary patch literal 284 zcmeAS@N?(olHy`uVBq!ia0vp^r-0a;gAGXfW?sz)QjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`ISV`@iy0XB4ude`@%$AjK*5ckE{-7;ac?hgqzfR1PI MboFyt=akR{0H!=mH~;_u literal 0 HcmV?d00001 diff --git a/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Grey_25_percent.png b/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Grey_25_percent.png new file mode 100644 index 0000000000000000000000000000000000000000..34ca2340f71a626d76af609904872c45623b0501 GIT binary patch literal 275 zcmeAS@N?(olHy`uVBq!ia0vp^$AQ?4gAGU)pYE*!QjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`ISV`@iy0XB4ude`@%$AjK*1HBE{-7;ac?gh3LY>JIIzLwkE8A8vKQ0l vNO~+Tw>SQ*_h8d`hCgQ*56TD(C}H<8nR&H@&D2Jqn;AS^{an^LB{Ts56-8M^ literal 0 HcmV?d00001 diff --git a/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Grey_40_percent.png b/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Grey_40_percent.png new file mode 100644 index 0000000000000000000000000000000000000000..e1e6d98676ccc2ad49d001c4ea3c521216ee3164 GIT binary patch literal 287 zcmeAS@N?(olHy`uVBq!ia0vp^r-9glgAGUq|K(``QjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`ISV`@iy0XB4ude`@%$AjK*24ZE{-7;ac?g#
      @aNvN+@5k}mpN1}} zXt2(Bm!5WyHRf$S!?`m|6C)LjxLwj3Pv{8DWL4VikRsMGP=bs2OY)fwmz-U*8R&in MPgg&ebxsLQ00+HXsQ>@~ literal 0 HcmV?d00001 diff --git a/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Grey_50_percent.png b/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Grey_50_percent.png new file mode 100644 index 0000000000000000000000000000000000000000..05164882b7c781614e8dea55fbd0ab690220ef5d GIT binary patch literal 286 zcmeAS@N?(olHy`uVBq!ia0vp^r-9glgAGUq|K(``QjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`ISV`@iy0XB4ude`@%$AjK*7zPE{-7;ac?hgo~(SF;c;3pakt^Ok{c=o;o`f=zIoG LS3j3^P6VM%xNb!1@J z*w6hZkrl}2EbxddW?H{an^LB{Ts5fAK}N literal 0 HcmV?d00001 diff --git a/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Indigo.png b/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Indigo.png new file mode 100644 index 0000000000000000000000000000000000000000..d65b469f664bcb93ad064d83ca0f4eb19761c015 GIT binary patch literal 272 zcmeAS@N?(olHy`uVBq!ia0vp^XMos@t}Rq!^2X+?^QKos)S9a~60+7BevL9R^{>Nn{1`ISV`@iy0XB4ude`@%$AjK*80XE{-7;ac?hgbP0l+XkKsIgf{ literal 0 HcmV?d00001 diff --git a/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Light_blue.png b/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Light_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..3d4bf4ac09ae45388cdeaaff8ac2733b7e906cac GIT binary patch literal 267 zcmeAS@N?(olHy`uVBq!ia0vp^CxO_AgAGW2oBaPikYX$ja(7}_cTVOdki(Mh=VM%xNb!1@J z*w6hZkrl}2EbxddW?H56n$eFyLWnYXmBhU}HM$kRZXq!`w)3!3V4%A6OV(U%l7@bU1^j LtDnm{r-UW|r43Fw literal 0 HcmV?d00001 diff --git a/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Light_orange.png b/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Light_orange.png new file mode 100644 index 0000000000000000000000000000000000000000..630be5855f9c4e3b73f11d7d2b1934542175ec1d GIT binary patch literal 280 zcmeAS@N?(olHy`uVBq!ia0vp^r-0a$gAGVBEG$U@l8nVc?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`ISV`@iy0XB4ude`@%$Aa9cw*Z978JN-d;B3JzyYk;DE^=PLa3e{!30V zymNbB_bhgEL;P=^17|e^Bv_diJ0ys3^e{CBDj0CFxHTT2x8Mgxy>w>AC(AWNfDUKy MboFyt=akR{04NtrhX4Qo literal 0 HcmV?d00001 diff --git a/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Light_turquoise.png b/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Light_turquoise.png new file mode 100644 index 0000000000000000000000000000000000000000..b4b5f0b910f1aa01eb046df097d35896dba30079 GIT binary patch literal 278 zcmeAS@N?(olHy`uVBq!ia0vp^CxFVM%xNb!1@J z*w6hZkrl}2EbxddW?f!z(kGOW)|}w((iqM&Svm*^>bP0l+XkKNQ_5= literal 0 HcmV?d00001 diff --git a/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Light_yellow.png b/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Light_yellow.png new file mode 100644 index 0000000000000000000000000000000000000000..3100da6d0065600db0a6102eda8f49e04b902c5d GIT binary patch literal 281 zcmeAS@N?(olHy`uVBq!ia0vp^CxO_4gAGWAbKKbpq!^2X+?^QKos)S9a~60+7BevL9R^{>@aNvN+A5M|C<#|g^ wu)K47Uzc_-^1xL)<`3yY9BPdT15SKkJo$`;O_5Jr4d`+PPgg&ebxsLQ06pYNO8@`> literal 0 HcmV?d00001 diff --git a/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Lime.png b/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Lime.png new file mode 100644 index 0000000000000000000000000000000000000000..54f166037a417684ae5e10843527d1353d0afeb5 GIT binary patch literal 272 zcmeAS@N?(olHy`uVBq!ia0vp^$AQ>{gAGX9G3yipDaPU;cPEB*=VV?2IV|apzK#qG z8~eHcB(eheoCO|{#S9F5he4R}c>anMpx{zZ7srr_xVM)L1rI1N9B}BWXRcVa+-Sqa x?&kl7)$_jg44$rjF6*2UngCKcTEzeW literal 0 HcmV?d00001 diff --git a/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Magenta.png b/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Magenta.png new file mode 100644 index 0000000000000000000000000000000000000000..2d0f93bebd9e8acbf9379d7208e02135a3a4b004 GIT binary patch literal 286 zcmeAS@N?(olHy`uVBq!ia0vp^r-9glgAGUq|K(``QjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`ISV`@iy0XB4ude`@%$AjK*7zPE{-7;ac?hgNn{1`ISV`@iy0XB4ude`@%$AjK*80XE{-7;ac?hgawZ?Ckjv vzwG>->N$)y*W?+J9gNsmk{t{Nh}bb-nDM+5!}mQv*D`pz`njxgN@xNAZbU(f literal 0 HcmV?d00001 diff --git a/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Orange.png b/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Orange.png new file mode 100644 index 0000000000000000000000000000000000000000..eda35a1fdfcdfdc2f8c9eb1708631d0bac31bd8b GIT binary patch literal 280 zcmeAS@N?(olHy`uVBq!ia0vp^r-9g%gAGW&PnM4YQjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`ISV`@iy0XB4ude`@%$AjK*6=1E{-7;ac?gh@*Xe{IB>uu;q?52<^4)m z8Q!_QuX`4|xgq{H&w;s-3P#*6X^kgz1ZJ`-ZFWcz>o~(Sk=}wYn7{Qgos%`Pu>v}r N!PC{xWt~$(695$a~60+7BevL9R^{>lY~t xttx7?O*_B&-d^?(+4mSNc$f|<2n-Zqcm5so>1p?JwgVl^;OXk;vd$@?2>=zfN5%jE literal 0 HcmV?d00001 diff --git a/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Pink.png b/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Pink.png new file mode 100644 index 0000000000000000000000000000000000000000..660ac4170fed81df743f25b5ee53ae51d3bf710d GIT binary patch literal 278 zcmeAS@N?(olHy`uVBq!ia0vp^r-0a$gAGVBEG$U@l8nVc?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`ISV`@iy0XB4ude`@%$Aa9jiTE978JN-d^6w%b+N5z~INeP zm($PBiac<+oc+Oh4FL&Oro|2kA{;$Tje!aVTr6&l2k0$W!0^U{Io;2CW+%|u44$rj JF6*2UngG2EN*w?I literal 0 HcmV?d00001 diff --git a/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Plum.png b/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Plum.png new file mode 100644 index 0000000000000000000000000000000000000000..2e0a9ce9d023e8b8c80e4d6384d2f484ca9bebbe GIT binary patch literal 279 zcmeAS@N?(olHy`uVBq!ia0vp^r-9gngAGWk*q`|iq!^2X+?^QKos)S9a~60+7BevL9R^{>A!^S3w7^m zs}wcZrk($~=C|yD^_6T7W=AR*al527p3o7P$*Q#3Aw{g?4AVsV3QDWSGtG3At^Eje OH-o3EpUXO@geCy%fLKug literal 0 HcmV?d00001 diff --git a/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Red.png b/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Red.png new file mode 100644 index 0000000000000000000000000000000000000000..da30922cf0ba959099474ac3d98e11de753e6f90 GIT binary patch literal 273 zcmeAS@N?(olHy`uVBq!ia0vp^r-0a)gAGVt`!T%|NHG=%xjQkeJ16rJ$YDu$^mSxl z*x1kgCy^D%=PdAuEM{QfI}E~%$MaXD00ozMx;TbZ#J#<|k@tWB&jADT|Nq~-;|+Mh zP;_NodU{zy{B!As*?|fMTr6&l2Q&mESeX_(B#3bIFg4Oqu!8Y{6jO?`?>T>rf| literal 0 HcmV?d00001 diff --git a/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Red2.png b/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Red2.png new file mode 100644 index 0000000000000000000000000000000000000000..cd9afa0e94020a1236b86e1ece83042128f8fe38 GIT binary patch literal 270 zcmeAS@N?(olHy`uVBq!ia0vp^r-9grgAGW2O4EM?q!^2X+?^QKos)S9a~60+7BevL9R^{>Nn{1`ISV`@iy0XB4ude`@%$AjK*7bHE{-7;ac?hgeK-4u?0bwBJWK}_1O|k7$oz2y^GV|gDocURW$<+Mb6Mw<&;$UcRz+R_ literal 0 HcmV?d00001 diff --git a/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Sea_green.png b/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Sea_green.png new file mode 100644 index 0000000000000000000000000000000000000000..795e178da686676bdc41b11bfe19c76886fce61e GIT binary patch literal 289 zcmeAS@N?(olHy`uVBq!ia0vp^r-0akgAGXTu}|Lxq!^2X+?^QKos)S9a~60+7BevL9R^{>A!^S3w7^y zw-hzlrk&q9@3-uM^_6T7PHPBAure)nND$%ZVQLIiFyLZwYdkPef;T*sm=Nq!^2X+?^QKos)S9a~60+7BevL9R^{>lYb& ygvxC={-*NV?r#irXRR63Cp#E$vJ4Q>!oMe-`LuCX-4dXK89ZJ6T-G@yGywoi07u{e literal 0 HcmV?d00001 diff --git a/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Teal.png b/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/Teal.png new file mode 100644 index 0000000000000000000000000000000000000000..a42cf8d3c9c2aae81573bd66a560488a5d1fb863 GIT binary patch literal 268 zcmeAS@N?(olHy`uVBq!ia0vp^$AQ>{gAGX9G3yipDaPU;cPEB*=VV?2IV|apzK#qG z8~eHcB(eheoCO|{#S9F5he4R}c>anMpx{DJ7srr_xVM)V3La2kINNn{1`ISV`@iy0XB4ude`@%$AjK*0^3E{-7;ac?hga~60+7BevL9R^{>+d(x4?Mpn{lMLgLD`{)!L31pv4_EsNrEwn#enGuM*>TS-~kQ+M4lH-N%&O Te1!8a&}9ssu6{1-oD!MNn{1`ISV`@iy0XB4ude`@%$Aa9jiQD978JN-d^6w%b+N5V8iq8_kX@{bdo%v zcRBs+nVJKa>)9TpiE#8VH3ljeaIv^G9?%ewU}akDkU($28z-l+q}}O1xC`iN22WQ% Jmvv4FO#lI{P8t9J literal 0 HcmV?d00001 diff --git a/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/WhiteCustom.png b/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/WhiteCustom.png new file mode 100644 index 0000000000000000000000000000000000000000..30b6701b55fed26d9ee59de45f123877fe417307 GIT binary patch literal 264 zcmeAS@N?(olHy`uVBq!ia0vp^CxF<9gAGVZ22Obhq!^2X+?^QKos)S9a~60+7BevL9R^{>Nn{1`ISV`@iy0XB4ude`@%$AjK*3d>E{-7;ac?gx3Na`O95C4N|9|Dj4(V6I zk@sykr!k)2XU*{6hk0VAf)TIFvc?l80yEi^E<2=1b=LrS9|~f literal 0 HcmV?d00001 diff --git a/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/YellowCustom.png b/Document-Processing/Excel/Excel-Library/NET/faqs/ExcelKnownColors_images/YellowCustom.png new file mode 100644 index 0000000000000000000000000000000000000000..f0e27f52b1b9ed7b224dda20d64e9044a4fcf10a GIT binary patch literal 271 zcmeAS@N?(olHy`uVBq!ia0vp^CxF + + + +Name + + +Description + + +Color + + + +AquaAqua colorAqua +BlackBlack colorBlack +BlackCustomBlackCustom colorBlackCustom +BlueBlue colorBlue +Blue_greyBlue_grey colorBlue_grey +BlueCustomBlueCustom colorBlueCustom +Bright_greenBright_green colorBright_green +BrownBrown colorBrown +Custom0Custom0Custom0 +Custom1Custom1Custom1 +Custom10Custom10Custom10 +Custom11Custom11Custom11 +Custom12Custom12Custom12 +Custom13Custom13Custom13 +Custom14Custom14Custom14 +Custom15Custom15Custom15 +Custom16Custom16Custom16 +Custom17Custom17Custom17 +Custom18Custom18Custom18 +Custom19Custom19Custom19 +Custom2Custom2Custom2 +Custom20Custom20Custom20 +Custom21Custom21Custom21 +Custom22Custom22Custom22 +Custom23Custom23Custom23 +Custom24Custom24Custom24 +Custom25Custom25Custom25 +Custom26Custom26Custom26 +Custom27Custom27Custom27 +Custom28Custom28Custom28 +Custom29Custom29Custom29 +Custom3Custom3Custom3 +Custom30Custom30Custom30 +Custom31Custom31Custom31 +Custom32Custom32Custom32 +Custom33Custom33Custom33 +Custom34Custom34Custom34 +Custom35Custom35Custom35 +Custom36Custom36Custom36 +Custom37Custom37Custom37 +Custom38Custom38Custom38 +Custom39Custom39Custom39 +Custom4Custom4Custom4 +Custom40Custom40Custom40 +Custom41Custom41Custom41 +Custom42Custom42Custom42 +Custom43Custom43Custom43 +Custom44Custom44Custom44 +Custom45Custom45Custom45 +Custom46Custom46Custom46 +Custom47Custom47Custom47 +Custom48Custom48Custom48 +Custom49Custom49Custom49 +Custom5Custom5Custom5 +Custom50Custom50Custom50 +Custom51Custom51Custom51 +Custom52Custom52Custom52 +Custom53Custom53Custom53 +Custom54Custom54Custom54 +Custom55Custom55Custom55 +Custom56Custom56Custom56 +Custom6Custom6Custom6 +Custom7Custom7Custom7 +Custom8Custom8Custom8 +Custom9Custom9Custom9 +CyanCyan colorCyan +Dark_blueDark_blue colorDark_blue +Dark_greenDark_green colorDark_green +Dark_redDark_red colorDark_red +Dark_tealDark_teal colorDark_teal +Dark_yellowDark_yellow colorDark_yellow +GoldGold colorGold +GreenGreen colorGreen +Grey_25_percentGrey_25_percent colorGrey_25_percent +Grey_40_percentGrey_40_percent colorGrey_40_percent +Grey_50_percentGrey_50_percent colorGrey_50_percent +Grey_80_percentGrey_80_percent colorGrey_80_percent +IndigoIndigo colorIndigo +LavenderLavender colorLavender +Light_blueLight_blue colorLight_blue +Light_greenLight_green colorLight_green +Light_orangeLight_orange colorLight_orange +Light_turquoiseLight_turquoise colorLight_turquoise +Light_yellowLight_yellow colorLight_yellow +LightGreenLightGreen colorLightGreen +LimeLime colorLime +MagentaMagenta colorMagenta +NoneNo colorNone +Olive_greenOlive_green colorOlive_green +OrangeOrange colorOrange +Pale_bluePale_blue colorPale_blue +PinkPink colorPink +PlumPlum colorPlum +RedRed colorRed +Red2Red2 colorRed2 +RoseRose colorRose +Sea_greenSea_green colorSea_green +Sky_blueSky_blue colorSky_blue +TanTan colorTan +TealTeal colorTeal +TurquoiseTurquoise colorTurquoise +VioletViolet colorViolet +WhiteWhite colorWhite +WhiteCustomWhiteCustom colorWhiteCustom +YellowYellow colorYellow +YellowCustomYellowCustom colorYellowCustom + \ No newline at end of file From eea57f7fa8fc7e648e986fef555184a95daa3d4a Mon Sep 17 00:00:00 2001 From: KarthikaSF4773 Date: Fri, 17 Oct 2025 11:20:01 +0530 Subject: [PATCH 101/163] 987470-ExcelKnownColors --- Document-Processing-toc.html | 2 +- ...hat-ExcelKnownColors-are-available-in-syncfusion-xlsio.md} | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) rename Document-Processing/Excel/Excel-Library/NET/faqs/{excel-known-colors-reference.md => what-ExcelKnownColors-are-available-in-syncfusion-xlsio.md} (98%) diff --git a/Document-Processing-toc.html b/Document-Processing-toc.html index 2a67133ad..741f636fd 100644 --- a/Document-Processing-toc.html +++ b/Document-Processing-toc.html @@ -5732,7 +5732,7 @@ Does XlsIO support internal links when converting Excel to PDF?
    • - ExcelKnownColors Reference + What ExcelKnownColors are available in Syncfusion XlsIO?
    diff --git a/Document-Processing/Excel/Excel-Library/NET/faqs/excel-known-colors-reference.md b/Document-Processing/Excel/Excel-Library/NET/faqs/what-ExcelKnownColors-are-available-in-syncfusion-xlsio.md similarity index 98% rename from Document-Processing/Excel/Excel-Library/NET/faqs/excel-known-colors-reference.md rename to Document-Processing/Excel/Excel-Library/NET/faqs/what-ExcelKnownColors-are-available-in-syncfusion-xlsio.md index 358d46cce..03b5127bb 100644 --- a/Document-Processing/Excel/Excel-Library/NET/faqs/excel-known-colors-reference.md +++ b/Document-Processing/Excel/Excel-Library/NET/faqs/what-ExcelKnownColors-are-available-in-syncfusion-xlsio.md @@ -6,9 +6,9 @@ control: XlsIO documentation: UG --- -# ExcelKnownColors Reference +# What ExcelKnownColors are available in Syncfusion XlsIO? -The following table lists ExcelKnownColors with their names, short descriptions, and color reference images. +This FAQ lists all ExcelKnownColors available in Syncfusion XlsIO, including names, brief descriptions, and color reference images. From 2c1f0a1618ef383847a76eacee4c43d8068ae393 Mon Sep 17 00:00:00 2001 From: KarthikaSF4773 Date: Tue, 28 Oct 2025 12:00:36 +0530 Subject: [PATCH 102/163] 987470-ExcelKnownColors --- ...olors-are-available-in-syncfusion-xlsio.md | 219 +++++++++--------- 1 file changed, 108 insertions(+), 111 deletions(-) diff --git a/Document-Processing/Excel/Excel-Library/NET/faqs/what-ExcelKnownColors-are-available-in-syncfusion-xlsio.md b/Document-Processing/Excel/Excel-Library/NET/faqs/what-ExcelKnownColors-are-available-in-syncfusion-xlsio.md index 03b5127bb..0d5200107 100644 --- a/Document-Processing/Excel/Excel-Library/NET/faqs/what-ExcelKnownColors-are-available-in-syncfusion-xlsio.md +++ b/Document-Processing/Excel/Excel-Library/NET/faqs/what-ExcelKnownColors-are-available-in-syncfusion-xlsio.md @@ -1,6 +1,6 @@ --- title: Excel Known Colors Reference in XlsIO | Syncfusion -description: This section lists ExcelKnownColors with name, description, and color images for quick reference. +description: This section lists ExcelKnownColors with name and color images for quick reference. platform: document-processing control: XlsIO documentation: UG @@ -8,7 +8,7 @@ documentation: UG # What ExcelKnownColors are available in Syncfusion XlsIO? -This FAQ lists all ExcelKnownColors available in Syncfusion XlsIO, including names, brief descriptions, and color reference images. +This FAQ lists all ExcelKnownColors available in Syncfusion XlsIO, including names and color reference images.
    @@ -17,117 +17,114 @@ This FAQ lists all ExcelKnownColors available in Syncfusion XlsIO, including nam Name - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    -Description - Color
    AquaAqua colorAqua
    BlackBlack colorBlack
    BlackCustomBlackCustom colorBlackCustom
    BlueBlue colorBlue
    Blue_greyBlue_grey colorBlue_grey
    BlueCustomBlueCustom colorBlueCustom
    Bright_greenBright_green colorBright_green
    BrownBrown colorBrown
    Custom0Custom0Custom0
    Custom1Custom1Custom1
    Custom10Custom10Custom10
    Custom11Custom11Custom11
    Custom12Custom12Custom12
    Custom13Custom13Custom13
    Custom14Custom14Custom14
    Custom15Custom15Custom15
    Custom16Custom16Custom16
    Custom17Custom17Custom17
    Custom18Custom18Custom18
    Custom19Custom19Custom19
    Custom2Custom2Custom2
    Custom20Custom20Custom20
    Custom21Custom21Custom21
    Custom22Custom22Custom22
    Custom23Custom23Custom23
    Custom24Custom24Custom24
    Custom25Custom25Custom25
    Custom26Custom26Custom26
    Custom27Custom27Custom27
    Custom28Custom28Custom28
    Custom29Custom29Custom29
    Custom3Custom3Custom3
    Custom30Custom30Custom30
    Custom31Custom31Custom31
    Custom32Custom32Custom32
    Custom33Custom33Custom33
    Custom34Custom34Custom34
    Custom35Custom35Custom35
    Custom36Custom36Custom36
    Custom37Custom37Custom37
    Custom38Custom38Custom38
    Custom39Custom39Custom39
    Custom4Custom4Custom4
    Custom40Custom40Custom40
    Custom41Custom41Custom41
    Custom42Custom42Custom42
    Custom43Custom43Custom43
    Custom44Custom44Custom44
    Custom45Custom45Custom45
    Custom46Custom46Custom46
    Custom47Custom47Custom47
    Custom48Custom48Custom48
    Custom49Custom49Custom49
    Custom5Custom5Custom5
    Custom50Custom50Custom50
    Custom51Custom51Custom51
    Custom52Custom52Custom52
    Custom53Custom53Custom53
    Custom54Custom54Custom54
    Custom55Custom55Custom55
    Custom56Custom56Custom56
    Custom6Custom6Custom6
    Custom7Custom7Custom7
    Custom8Custom8Custom8
    Custom9Custom9Custom9
    CyanCyan colorCyan
    Dark_blueDark_blue colorDark_blue
    Dark_greenDark_green colorDark_green
    Dark_redDark_red colorDark_red
    Dark_tealDark_teal colorDark_teal
    Dark_yellowDark_yellow colorDark_yellow
    GoldGold colorGold
    GreenGreen colorGreen
    Grey_25_percentGrey_25_percent colorGrey_25_percent
    Grey_40_percentGrey_40_percent colorGrey_40_percent
    Grey_50_percentGrey_50_percent colorGrey_50_percent
    Grey_80_percentGrey_80_percent colorGrey_80_percent
    IndigoIndigo colorIndigo
    LavenderLavender colorLavender
    Light_blueLight_blue colorLight_blue
    Light_greenLight_green colorLight_green
    Light_orangeLight_orange colorLight_orange
    Light_turquoiseLight_turquoise colorLight_turquoise
    Light_yellowLight_yellow colorLight_yellow
    LightGreenLightGreen colorLightGreen
    LimeLime colorLime
    MagentaMagenta colorMagenta
    NoneNo colorNone
    Olive_greenOlive_green colorOlive_green
    OrangeOrange colorOrange
    Pale_bluePale_blue colorPale_blue
    PinkPink colorPink
    PlumPlum colorPlum
    RedRed colorRed
    Red2Red2 colorRed2
    RoseRose colorRose
    Sea_greenSea_green colorSea_green
    Sky_blueSky_blue colorSky_blue
    TanTan colorTan
    TealTeal colorTeal
    TurquoiseTurquoise colorTurquoise
    VioletViolet colorViolet
    WhiteWhite colorWhite
    WhiteCustomWhiteCustom colorWhiteCustom
    YellowYellow colorYellow
    YellowCustomYellowCustom colorYellowCustom
    AquaAqua
    BlackBlack
    BlackCustomBlackCustom
    BlueBlue
    Blue_greyBlue_grey
    BlueCustomBlueCustom
    Bright_greenBright_green
    BrownBrown
    Custom0Custom0
    Custom1Custom1
    Custom10Custom10
    Custom11Custom11
    Custom12Custom12
    Custom13Custom13
    Custom14Custom14
    Custom15Custom15
    Custom16Custom16
    Custom17Custom17
    Custom18Custom18
    Custom19Custom19
    Custom2Custom2
    Custom20Custom20
    Custom21Custom21
    Custom22Custom22
    Custom23Custom23
    Custom24Custom24
    Custom25Custom25
    Custom26Custom26
    Custom27Custom27
    Custom28Custom28
    Custom29Custom29
    Custom3Custom3
    Custom30Custom30
    Custom31Custom31
    Custom32Custom32
    Custom33Custom33
    Custom34Custom34
    Custom35Custom35
    Custom36Custom36
    Custom37Custom37
    Custom38Custom38
    Custom39Custom39
    Custom4Custom4
    Custom40Custom40
    Custom41Custom41
    Custom42Custom42
    Custom43Custom43
    Custom44Custom44
    Custom45Custom45
    Custom46Custom46
    Custom47Custom47
    Custom48Custom48
    Custom49Custom49
    Custom5Custom5
    Custom50Custom50
    Custom51Custom51
    Custom52Custom52
    Custom53Custom53
    Custom54Custom54
    Custom55Custom55
    Custom56Custom56
    Custom6Custom6
    Custom7Custom7
    Custom8Custom8
    Custom9Custom9
    CyanCyan
    Dark_blueDark_blue
    Dark_greenDark_green
    Dark_redDark_red
    Dark_tealDark_teal
    Dark_yellowDark_yellow
    GoldGold
    GreenGreen
    Grey_25_percentGrey_25_percent
    Grey_40_percentGrey_40_percent
    Grey_50_percentGrey_50_percent
    Grey_80_percentGrey_80_percent
    IndigoIndigo
    LavenderLavender
    Light_blueLight_blue
    Light_greenLight_green
    Light_orangeLight_orange
    Light_turquoiseLight_turquoise
    Light_yellowLight_yellow
    LightGreenLightGreen
    LimeLime
    MagentaMagenta
    NoneNone
    Olive_greenOlive_green
    OrangeOrange
    Pale_bluePale_blue
    PinkPink
    PlumPlum
    RedRed
    Red2Red2
    RoseRose
    Sea_greenSea_green
    Sky_blueSky_blue
    TanTan
    TealTeal
    TurquoiseTurquoise
    VioletViolet
    WhiteWhite
    WhiteCustomWhiteCustom
    YellowYellow
    YellowCustomYellowCustom
    \ No newline at end of file From 273eedb09d8df080e8a61da2033af359d051057c Mon Sep 17 00:00:00 2001 From: KarthikaSF4773 Date: Tue, 21 Oct 2025 21:25:06 +0530 Subject: [PATCH 103/163] 986751-Autofit --- ...etting-row-height-for-individual-cells-in-Excel.md | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 Document-Processing/Excel/Excel-Library/NET/faqs/does-xlsio-support-setting-row-height-for-individual-cells-in-Excel.md diff --git a/Document-Processing/Excel/Excel-Library/NET/faqs/does-xlsio-support-setting-row-height-for-individual-cells-in-Excel.md b/Document-Processing/Excel/Excel-Library/NET/faqs/does-xlsio-support-setting-row-height-for-individual-cells-in-Excel.md new file mode 100644 index 000000000..e155e7ba2 --- /dev/null +++ b/Document-Processing/Excel/Excel-Library/NET/faqs/does-xlsio-support-setting-row-height-for-individual-cells-in-Excel.md @@ -0,0 +1,11 @@ +--- +title: XlsIO support for setting row height for individual cells | Syncfusion +description: Learn whether Syncfusion XlsIO supports setting row height for individual cells in Excel using Syncfusion .NET Excel library (XlsIO). +platform: document-processing +control: XlsIO +documentation: UG +--- + +# Does XlsIO support setting row height for individual cells in Excel? + +No, XlsIO does not support setting row heights on a per-cell basis. Row height is determined by the tallest content in the row and applied uniformly to all cells. \ No newline at end of file From 1f27acedfad18cf15ee62c85aa184b45e5044a26 Mon Sep 17 00:00:00 2001 From: DinakarSF4212 <147583019+DinakarSF4212@users.noreply.github.com> Date: Tue, 28 Oct 2025 17:16:47 +0530 Subject: [PATCH 104/163] 986127: Need to resolve the preview sample rendering issue in Ribbon section of Angular Spreadsheet documentation --- .../Excel/Spreadsheet/ASP-NET-CORE/getting-started-core.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Document-Processing/Excel/Spreadsheet/ASP-NET-CORE/getting-started-core.md b/Document-Processing/Excel/Spreadsheet/ASP-NET-CORE/getting-started-core.md index 6754c9d7f..752280b7a 100644 --- a/Document-Processing/Excel/Spreadsheet/ASP-NET-CORE/getting-started-core.md +++ b/Document-Processing/Excel/Spreadsheet/ASP-NET-CORE/getting-started-core.md @@ -20,7 +20,7 @@ This section briefly explains about how to include [ASP.NET Core Spreadsheet](ht * [Create a Project using Microsoft Templates](https://learn.microsoft.com/en-us/aspnet/core/tutorials/razor-pages/razor-pages-start?view=aspnetcore-8.0&tabs=visual-studio#create-a-razor-pages-web-app) -* [Create a Project using Syncfusion® ASP.NET Core Extension](https://ej2.syncfusion.com/aspnetcore/documentation/getting-started/project-template) +* [Create a Project using Syncfusion® ASP.NET Core Extension](https://ej2.syncfusion.com/aspnetcore/documentation/visual-studio-integration/create-project) ## Install ASP.NET Core package in the application From c300ec5b66f47baa8cb99f114e4329eafbf6878e Mon Sep 17 00:00:00 2001 From: Karan-SF4772 Date: Tue, 28 Oct 2025 17:23:57 +0530 Subject: [PATCH 105/163] Updated Hyperlinks. --- Document-Processing-toc.html | 24 ++++++++++++++++--- ...rPoint-to-Image-in-ASP-NET-Core-Web-API.md | 4 ++-- ...werPoint-to-PDF-in-ASP-NET-Core-Web-API.md | 8 +++---- ...nt-Presentation-in-ASP-NET-Core-WEB-API.md | 1 - ...nt-Presentation-in-ASP-NET-Core-WEB-API.md | 11 ++++----- ...cument-to-Image-in-ASP-NET-Core-WEB-API.md | 2 +- ...Document-to-PDF-in-ASP-NET-Core-WEB-API.md | 2 +- .../Word-Library/NET/Working-With-Images.md | 1 + .../NET/Working-with-Paragraph.md | 1 + 9 files changed, 36 insertions(+), 18 deletions(-) diff --git a/Document-Processing-toc.html b/Document-Processing-toc.html index 6645e8766..c0952f73f 100644 --- a/Document-Processing-toc.html +++ b/Document-Processing-toc.html @@ -3550,7 +3550,7 @@ Console
  • - ASP .NET Core Web API + ASP.NET Core Web API
  • Azure @@ -3684,7 +3684,7 @@ Console
  • - ASP .NET Core Web API + ASP.NET Core Web API
  • Azure @@ -4030,7 +4030,7 @@ Console
  • - ASP .NET Core Web API + ASP.NET Core Web API
  • Azure @@ -5977,6 +5977,9 @@
  • Console
  • +
  • + ASP.NET Web API +
  • Azure
      @@ -6105,6 +6108,9 @@
    • Console
    • +
    • + ASP.NET Core Web API +
    • Azure
        @@ -6294,6 +6300,9 @@
      • Console
      • +
      • + ASP.NET Core Web API +
      • Azure
          @@ -6377,6 +6386,9 @@
        • Console
        • +
        • + ASP.NET Core Web API +
        • Azure
            @@ -6494,6 +6506,9 @@
          • Console
          • +
          • + ASP.NET Core Web API +
          • Azure
              @@ -6610,6 +6625,9 @@
            • Console
            • +
            • + ASP.NET Core Web API +
            • Azure
                diff --git a/Document-Processing/PowerPoint/Conversions/PowerPoint-To-Image/NET/Convert-PowerPoint-to-Image-in-ASP-NET-Core-Web-API.md b/Document-Processing/PowerPoint/Conversions/PowerPoint-To-Image/NET/Convert-PowerPoint-to-Image-in-ASP-NET-Core-Web-API.md index 8c43e61b5..be1219780 100644 --- a/Document-Processing/PowerPoint/Conversions/PowerPoint-To-Image/NET/Convert-PowerPoint-to-Image-in-ASP-NET-Core-Web-API.md +++ b/Document-Processing/PowerPoint/Conversions/PowerPoint-To-Image/NET/Convert-PowerPoint-to-Image-in-ASP-NET-Core-Web-API.md @@ -102,7 +102,7 @@ Step 8: Run the project. Click the Start button (green arrow) or press F5 to run the app. -A complete working sample is available on [GitHub](https://github.com/SyncfusionExamples/PowerPoint-Examples/tree/master/Getting-started/ASP.NET-Core-Web-API/Create-PowerPoint-presentation). +A complete working sample is available on [GitHub](https://github.com/SyncfusionExamples/PowerPoint-Examples/tree/master/PPTX-to-Image-conversion/Convert-PowerPoint-presentation-to-Image/ASP.NET-Core-Web-API/Convert-PowerPoint-Presentation-to-Image). ## Steps for accessing the Web API using HTTP requests @@ -158,7 +158,7 @@ Step 4: Run the project. Click the Start button (green arrow) or press F5 to run the app. -A complete working sample is available on [GitHub](https://github.com/SyncfusionExamples/PowerPoint-Examples/tree/master/Getting-started/ASP.NET-Core-Web-API/Client-Application). +A complete working sample is available on [GitHub](https://github.com/SyncfusionExamples/PowerPoint-Examples/tree/master/PPTX-to-Image-conversion/Convert-PowerPoint-presentation-to-Image/ASP.NET-Core-Web-API/Client-Application). Upon executing the program, the **image** will be generated as follows. diff --git a/Document-Processing/PowerPoint/Conversions/PowerPoint-To-PDF/NET/Convert-PowerPoint-to-PDF-in-ASP-NET-Core-Web-API.md b/Document-Processing/PowerPoint/Conversions/PowerPoint-To-PDF/NET/Convert-PowerPoint-to-PDF-in-ASP-NET-Core-Web-API.md index d59e4fe01..a5807e042 100644 --- a/Document-Processing/PowerPoint/Conversions/PowerPoint-To-PDF/NET/Convert-PowerPoint-to-PDF-in-ASP-NET-Core-Web-API.md +++ b/Document-Processing/PowerPoint/Conversions/PowerPoint-To-PDF/NET/Convert-PowerPoint-to-PDF-in-ASP-NET-Core-Web-API.md @@ -39,7 +39,7 @@ using Syncfusion.Pdf; {% endhighlight %} {% endtabs %} -Step 5: Add a new action method ConvertPPTXToPdf in **ValuesController.cs** and include the below code snippet to convert an PowerPoint Presentation to image and download it. +Step 5: Add a new action method ConvertPPTXToPdf in **ValuesController.cs** and include the below code snippet to convert an PowerPoint Presentation to PDF and download it. {% tabs %} @@ -102,7 +102,7 @@ Step 8: Run the project. Click the Start button (green arrow) or press F5 to run the app. -A complete working sample is available on [GitHub](https://github.com/SyncfusionExamples/PowerPoint-Examples/tree/master/Getting-started/ASP.NET-Core-Web-API/Create-PowerPoint-presentation). +A complete working sample is available on [GitHub](https://github.com/SyncfusionExamples/PowerPoint-Examples/tree/master/PPTX-to-PDF-conversion/Convert-PowerPoint-presentation-to-PDF/ASP.NET-Core-Web-API/Convert-PowerPoint-Presentation-to-PDF). ## Steps for accessing the Web API using HTTP requests @@ -113,7 +113,7 @@ N> Ensure your ASP.NET Core Web API is running on the specified port before runn Step 2: Add the below code snippet in the **Program.cs** file for accessing the Web API using HTTP requests. -This method sends a GET request to the Web API endpoint to retrieve and save the converted Image. +This method sends a GET request to the Web API endpoint to retrieve and save the converted PDF. {% tabs %} @@ -158,7 +158,7 @@ Step 4: Run the project. Click the Start button (green arrow) or press F5 to run the app. -A complete working sample is available on [GitHub](https://github.com/SyncfusionExamples/PowerPoint-Examples/tree/master/Getting-started/ASP.NET-Core-Web-API/Client-Application). +A complete working sample is available on [GitHub](https://github.com/SyncfusionExamples/PowerPoint-Examples/tree/master/PPTX-to-PDF-conversion/Convert-PowerPoint-presentation-to-PDF/ASP.NET-Core-Web-API/Client%20Application). Upon executing the program, the **PDF** will be generated as follows. diff --git a/Document-Processing/PowerPoint/PowerPoint-Library/NET/Create-PowerPoint-Presentation-in-ASP-NET-Core-WEB-API.md b/Document-Processing/PowerPoint/PowerPoint-Library/NET/Create-PowerPoint-Presentation-in-ASP-NET-Core-WEB-API.md index 0b9cc4c80..65a89f82e 100644 --- a/Document-Processing/PowerPoint/PowerPoint-Library/NET/Create-PowerPoint-Presentation-in-ASP-NET-Core-WEB-API.md +++ b/Document-Processing/PowerPoint/PowerPoint-Library/NET/Create-PowerPoint-Presentation-in-ASP-NET-Core-WEB-API.md @@ -153,7 +153,6 @@ using (HttpClient client = new HttpClient()) { // Send a GET request to a URL HttpResponseMessage response = await client.GetAsync("https://localhost:7073/api/Values/api/PowerPoint"); - // Check if the response is successful if (response.IsSuccessStatusCode) { diff --git a/Document-Processing/PowerPoint/PowerPoint-Library/NET/Open-and-Save-PowerPoint-Presentation-in-ASP-NET-Core-WEB-API.md b/Document-Processing/PowerPoint/PowerPoint-Library/NET/Open-and-Save-PowerPoint-Presentation-in-ASP-NET-Core-WEB-API.md index 6e783a75f..407004159 100644 --- a/Document-Processing/PowerPoint/PowerPoint-Library/NET/Open-and-Save-PowerPoint-Presentation-in-ASP-NET-Core-WEB-API.md +++ b/Document-Processing/PowerPoint/PowerPoint-Library/NET/Open-and-Save-PowerPoint-Presentation-in-ASP-NET-Core-WEB-API.md @@ -12,7 +12,7 @@ Syncfusion® PowerPoint is a [.NET PowerPoint library](https://www ## Steps to Open and save a Presentation programmatically: -The below steps illustrate creating a simple PowerPoint Presentation in ASP.NET Core Web API. +The below steps illustrate Open and save a simple PowerPoint Presentation in ASP.NET Core Web API. Step 1: Create a new C# ASP.NET Core Web API project. @@ -20,7 +20,7 @@ Step 1: Create a new C# ASP.NET Core Web API project. Step 2: Install the [Syncfusion.Presentation.Net.Core](https://www.nuget.org/packages/Syncfusion.Presentation.Net.Core/) NuGet package as a reference to your project from [NuGet.org](https://www.nuget.org). -![Install Syncfusion.Presentation.Net.Core NuGet Package](ASP-NET-Core-WEB-API-images/Nuget-Package-NET-Core.png) +![Install Syncfusion.Presentation.Net.Core NuGet Package](ASP-NET-Core-WEB-API-images/ASP-NET-Core-Web-API-template-Open-Save.png) N> Starting with v16.2.0.x, if you reference Syncfusion® assemblies from trial setup or from the NuGet feed, you also have to add "Syncfusion.Licensing" assembly reference and include a license key in your projects. Please refer to this [link](https://help.syncfusion.com/common/essential-studio/licensing/overview) to know about registering Syncfusion® license key in your application to use our components. @@ -41,7 +41,7 @@ using Syncfusion.Presentation; {% endtabs %} -Step 5: Add a new action method DownloadPresentation in **ValuesController.cs** and include the below code snippet to create an PowerPoint Presentation and download it. +Step 5: Add a new action method DownloadPresentation in **ValuesController.cs** and include the below code snippet to Open and save an PowerPoint Presentation and download it. {% tabs %} @@ -105,7 +105,7 @@ Step 8: Run the project. Click the Start button (green arrow) or press F5 to run the app. -A complete working sample is available on [GitHub](https://github.com/SyncfusionExamples/PowerPoint-Examples/tree/master/Getting-started/ASP.NET-Core-Web-API/Create-PowerPoint-presentation). +A complete working sample is available on [GitHub](https://github.com/SyncfusionExamples/PowerPoint-Examples/tree/master/Read-and-save-PowerPoint-presentation/Open-and-save-PowerPoint/ASP.NET-Core-Web-API/Read-and-edit-PowerPoint-presentation). ## Steps for accessing the Web API using HTTP requests @@ -129,7 +129,6 @@ using (HttpClient client = new HttpClient()) { // Send a GET request to a URL HttpResponseMessage response = await client.GetAsync("https://localhost:7055/api/Values/api/PowerPoint"); - // Check if the response is successful if (response.IsSuccessStatusCode) { @@ -162,7 +161,7 @@ Step 4: Run the project. Click the Start button (green arrow) or press F5 to run the app. -A complete working sample is available on [GitHub](https://github.com/SyncfusionExamples/PowerPoint-Examples/tree/master/Getting-started/ASP.NET-Core-Web-API/Client-Application). +A complete working sample is available on [GitHub](https://github.com/SyncfusionExamples/PowerPoint-Examples/tree/master/Read-and-save-PowerPoint-presentation/Open-and-save-PowerPoint/ASP.NET-Core-Web-API/Client-Application). Upon executing the program, the **PowerPoint Presentation** will be generated as follows. diff --git a/Document-Processing/Word/Conversions/Word-To-Image/NET/Convert-Word-Document-to-Image-in-ASP-NET-Core-WEB-API.md b/Document-Processing/Word/Conversions/Word-To-Image/NET/Convert-Word-Document-to-Image-in-ASP-NET-Core-WEB-API.md index 8d5a2a85e..665cccfe8 100644 --- a/Document-Processing/Word/Conversions/Word-To-Image/NET/Convert-Word-Document-to-Image-in-ASP-NET-Core-WEB-API.md +++ b/Document-Processing/Word/Conversions/Word-To-Image/NET/Convert-Word-Document-to-Image-in-ASP-NET-Core-WEB-API.md @@ -115,7 +115,7 @@ N> Ensure your ASP.NET Core Web API is running on the specified port before runn Step 2: Add the below code snippet in the **Program.cs** file for accessing the Web API using HTTP requests. -This method sends a GET request to the Web API endpoint to retrieve and save the generated image. +This method sends a GET request to the Web API endpoint to retrieve and save the converted image. {% tabs %} diff --git a/Document-Processing/Word/Conversions/Word-To-PDF/NET/Convert-Word-Document-to-PDF-in-ASP-NET-Core-WEB-API.md b/Document-Processing/Word/Conversions/Word-To-PDF/NET/Convert-Word-Document-to-PDF-in-ASP-NET-Core-WEB-API.md index c5be1be1d..b0bac945e 100644 --- a/Document-Processing/Word/Conversions/Word-To-PDF/NET/Convert-Word-Document-to-PDF-in-ASP-NET-Core-WEB-API.md +++ b/Document-Processing/Word/Conversions/Word-To-PDF/NET/Convert-Word-Document-to-PDF-in-ASP-NET-Core-WEB-API.md @@ -120,7 +120,7 @@ N> Ensure your ASP.NET Core Web API is running on the specified port before runn Step 2: Add the below code snippet in the **Program.cs** file for accessing the Web API using HTTP requests. -This method sends a GET request to the Web API endpoint to retrieve and save the generated PDF document. +This method sends a GET request to the Web API endpoint to retrieve and save the converted PDF document. {% tabs %} diff --git a/Document-Processing/Word/Word-Library/NET/Working-With-Images.md b/Document-Processing/Word/Word-Library/NET/Working-With-Images.md index 47c173ea3..3cd1e5b43 100644 --- a/Document-Processing/Word/Word-Library/NET/Working-With-Images.md +++ b/Document-Processing/Word/Word-Library/NET/Working-With-Images.md @@ -711,6 +711,7 @@ You can download a complete working sample from [GitHub](https://github.com/Sync * [How to Apply Border to an Image in .NET Core Word Document?](https://support.syncfusion.com/kb/article/19726/how-to-apply-border-to-an-image-in-net-core-word-document) * [How to Find and Remove Corrupted Images in .NET Core Word Document?](https://support.syncfusion.com/kb/article/19605/how-to-find-and-remove-corrupted-images-in-net-core-word-document) * [How to Convert Excel Worksheets to Images in .NET Core Word document?](https://support.syncfusion.com/kb/article/20162/how-to-convert-excel-worksheets-to-images-in-net-core-word-document) +* [How to resize images to fit owner element in NET Core Word document?](https://support.syncfusion.com/kb/article/21490/how-to-resize-images-to-fit-owner-element-in-net-core-word-document) ## Frequently Asked Questions diff --git a/Document-Processing/Word/Word-Library/NET/Working-with-Paragraph.md b/Document-Processing/Word/Word-Library/NET/Working-with-Paragraph.md index a066cf7f9..4432322d6 100644 --- a/Document-Processing/Word/Word-Library/NET/Working-with-Paragraph.md +++ b/Document-Processing/Word/Word-Library/NET/Working-with-Paragraph.md @@ -1777,6 +1777,7 @@ You can download a complete working sample from [GitHub](https://github.com/Sync * [How to Keep Paragraphs Inside a Table in ASP.NET Core Word?](https://support.syncfusion.com/kb/article/19678/how-to-keep-paragraphs-inside-a-table-in-aspnet-core-word) * [How to apply highlight color to fields in a Word document?](https://support.syncfusion.com/kb/article/20092/how-to-apply-highlight-color-to-fields-in-a-word-document) * [How to Replace DISPLAYBARCODE Field with Image in DocIO .NET Core?](https://support.syncfusion.com/kb/article/19842/how-to-replace-displaybarcode-field-with-image-in-docio-net-core) +* [How to resize images to fit owner element in NET Core Word document?](https://support.syncfusion.com/kb/article/21490/how-to-resize-images-to-fit-owner-element-in-net-core-word-document) ## Frequently Asked Questions From 88cb36b5377648f4a2b9204fab9abaa8e9d60d96 Mon Sep 17 00:00:00 2001 From: Karan-SF4772 Date: Tue, 28 Oct 2025 17:38:36 +0530 Subject: [PATCH 106/163] Resolve CI Issue --- .../Word/Word-Library/NET/Working-with-Paragraph.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Document-Processing/Word/Word-Library/NET/Working-with-Paragraph.md b/Document-Processing/Word/Word-Library/NET/Working-with-Paragraph.md index 4432322d6..896576f5c 100644 --- a/Document-Processing/Word/Word-Library/NET/Working-with-Paragraph.md +++ b/Document-Processing/Word/Word-Library/NET/Working-with-Paragraph.md @@ -5,7 +5,7 @@ platform: document-processing control: DocIO documentation: UG --- -# Working with Paragraph +# Working with Paragraph in Word Library Paragraph is the basic element in a Word document that contains a textual and graphical contents. Each paragraph has its own formatting such as line spacing, alignment, indentation, and more. Within a paragraph, the contents are represented by one or more child elements such as [WTextRange](https://help.syncfusion.com/cr/document-processing/Syncfusion.DocIO.DLS.WTextRange.html), [WPicture](https://help.syncfusion.com/cr/document-processing/Syncfusion.DocIO.DLS.WPicture.html), and [Hyperlink](https://help.syncfusion.com/cr/document-processing/Syncfusion.DocIO.DLS.Hyperlink.html) and more. The [ParagraphItem](https://help.syncfusion.com/cr/document-processing/Syncfusion.DocIO.DLS.ParagraphItem.html) is the base class for the child elements of paragraph. The following elements can be the child elements of a paragraph: From 5963d5a6d34b5b9b205b00e0f175b4a57c23a4d2 Mon Sep 17 00:00:00 2001 From: MuralidharanGSF4527 Date: Tue, 28 Oct 2025 17:40:32 +0530 Subject: [PATCH 107/163] =?UTF-8?q?987016:=20PDF=20Viewer=20UG=20Documenta?= =?UTF-8?q?tion=20Revamp=20=E2=80=93=20Events=20&=20Folder=20Restructure?= =?UTF-8?q?=20for=20Core=20Platform?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Document-Processing-toc.html | 67 +- .../PDF-Viewer/asp-net-core/accessibility.md | 137 +- .../annotation/annotation-event.md | 853 ++++++ .../annotation/annotations-in-mobile-view.md | 121 + .../asp-net-core/annotation/comments.md | 165 +- .../annotation/free-text-annotation.md | 108 +- .../asp-net-core/annotation/ink-annotation.md | 98 +- .../annotation/line-angle-constraints.md | 47 +- .../annotation/measurement-annotation.md | 69 +- .../annotation/shape-annotation.md | 58 +- .../annotation/signature-annotation.md | 210 ++ .../annotation/stamp-annotation.md | 61 +- .../annotation/sticky-notes-annotation.md | 98 +- .../annotation/text-markup-annotation.md | 223 +- .../PDF/PDF-Viewer/asp-net-core/download.md | 13 +- .../PDF/PDF-Viewer/asp-net-core/event.md | 2353 +++++++++++++++++ .../PDF-Viewer/asp-net-core/feature-module.md | 40 +- .../form-designer/create-programmatically.md | 175 +- .../create-with-user-interface-interaction.md | 58 +- .../form-designer/form-field-events.md | 63 +- .../PDF-Viewer/asp-net-core/form-filling.md | 93 + .../getting-started-with-server-backed.md | 54 +- .../asp-net-core/getting-started.md | 61 +- .../PDF-Viewer/asp-net-core/globalization.md | 17 +- .../asp-net-core/hand-written-signature.md | 8 +- .../asp-net-core/how-to-overview.md | 65 + .../Instantiate-pdfviewer-dynamically.md | 21 +- .../how-to/add-annotation-in-text-search.md | 28 +- .../asp-net-core/how-to/add-save-button.md | 50 +- .../how-to/authorization-token.md | 19 +- .../how-to/capture-page-number.md | 19 +- .../configure-annotation-selector-setting.md | 11 +- .../how-to/control-annotation-visibility.md | 34 +- ...pdf-library-bounds-to-pdf-viewer-bounds.md | 26 +- .../how-to/custom-context-menu.md | 26 +- .../how-to/custom-font-signature-field.md | 23 +- .../asp-net-core/how-to/custom-fonts.md | 17 +- .../how-to/customize-text-search-color.md | 115 + .../how-to/delete-a-specific-annotation.md | 21 +- .../how-to/disable-context-menu.md | 44 + .../how-to/disable-tile-rendering.md | 48 + .../display-document-without-downloading.md | 18 +- .../how-to/download-start-event.md | 20 +- .../how-to/enable-local-storage.md | 30 +- .../asp-net-core/how-to/enable-resize.md | 42 + .../how-to/enable-text-selection.md | 32 +- .../how-to/export-as-image-standalone.md | 22 +- .../asp-net-core/how-to/export-as-image.md | 41 +- .../how-to/extract-text-completed.md | 14 +- .../how-to/extract-text-option.md | 27 +- .../extract-text-using-text-collections.md | 29 +- .../asp-net-core/how-to/extract-text.md | 60 +- .../asp-net-core/how-to/find-text-async.md | 52 +- .../asp-net-core/how-to/get-base64.md | 29 +- .../asp-net-core/how-to/get-page-info.md | 49 +- .../how-to/identify-added-annotation-mode.md | 56 + .../how-to/import-export-annotation.md | 26 +- .../asp-net-core/how-to/install-packages.md | 12 +- .../asp-net-core/how-to/load-documents.md | 31 +- .../asp-net-core/how-to/load-n-number-page.md | 15 +- .../asp-net-core/how-to/min-max-zoom.md | 20 +- .../asp-net-core/how-to/open-bookmark.md | 23 +- .../asp-net-core/how-to/open-thumbnail.md | 19 +- .../how-to/overlapped-annotation.md | 50 + .../pagerenderstarted-pagerendercompleted.md | 14 +- .../asp-net-core/how-to/print-document.md | 61 + ...lve-Unable-to-find-an-entry-point-error.md | 22 +- .../how-to/resolve-pdfium-issue.md | 55 +- .../how-to/restricting-zoom-in-mobile-mode.md | 10 +- .../asp-net-core/how-to/retry-timeout.md | 35 +- ...ve-original-document-at-the-server-side.md | 19 +- .../how-to/select-multi-page-annotations.md | 39 + .../asp-net-core/how-to/show-bookmark.md | 20 +- .../how-to/show-custom-stamp-item.md | 24 +- .../how-to/show-hide-annotation.md | 24 +- .../signatureselect-signatureunselect.md | 21 +- .../asp-net-core/how-to/unload-document.md | 18 +- .../how-to/webservice-not-listening.md | 61 +- .../images/Context-Menu-Page-Operations1.png | Bin 0 -> 25178 bytes .../asp-net-core/images/add-revised.png | Bin 0 -> 28372 bytes .../asp-net-core/images/add-shapes.png | Bin 0 -> 19221 bytes .../asp-net-core/images/add-signature.png | Bin 0 -> 22529 bytes .../asp-net-core/images/add-sticky-notes.png | Bin 0 -> 20021 bytes .../asp-net-core/images/add-text-markup.png | Bin 0 -> 23517 bytes .../asp-net-core/images/adding-signature.png | Bin 0 -> 19302 bytes .../after-enabling-annotation-toolbar.png | Bin 0 -> 18960 bytes .../asp-net-core/images/change-property.png | Bin 0 -> 23044 bytes .../images/close-comment-panel.png | Bin 0 -> 6322 bytes .../asp-net-core/images/comment-panel.png | Bin 0 -> 18581 bytes .../asp-net-core/images/delete-icon.png | Bin 0 -> 23763 bytes .../asp-net-core/images/edit-annotation.png | Bin 0 -> 16388 bytes .../images/form-filling-signature-del.png | Bin 0 -> 73116 bytes .../images/form-filling-signature-dialog.png | Bin 0 -> 81767 bytes .../images/form-filling-signature-signed.png | Bin 0 -> 69868 bytes .../images/form-filling-signature.png | Bin 0 -> 65093 bytes .../asp-net-core/images/form-filling.png | Bin 0 -> 69993 bytes .../asp-net-core/images/ink-annotation.png | Bin 0 -> 28262 bytes .../asp-net-core/images/open-comment.png | Bin 0 -> 23349 bytes .../asp-net-core/images/open-fillcolor.png | Bin 0 -> 21372 bytes .../asp-net-core/images/open-ink.png | Bin 0 -> 18662 bytes .../asp-net-core/images/open-radius.png | Bin 0 -> 19925 bytes .../asp-net-core/images/open-stamp.png | Bin 0 -> 28981 bytes .../asp-net-core/images/radius-annotation.png | Bin 0 -> 22784 bytes .../asp-net-core/images/select-text.png | Bin 0 -> 23051 bytes .../images/sticky-notes-in-page.png | Bin 0 -> 20085 bytes .../asp-net-core/interaction-mode.md | 24 +- .../bookmark-navigation.md | 143 + .../hyperlink-navigation.md | 193 ++ .../page-navigation.md | 140 + .../page-thumbnail-navigation.md | 45 + .../PDF-Viewer/asp-net-core/magnification.md | 26 +- .../PDF-Viewer/asp-net-core/mobile-toolbar.md | 49 +- .../PDF/PDF-Viewer/asp-net-core/navigation.md | 53 +- .../PDF-Viewer/asp-net-core/open-pdf-file.md | 15 +- .../open-pdf-file/from-amazon-s3.md | 20 +- .../from-azure-active-directory.md | 24 +- .../open-pdf-file/from-azure-blob-storage.md | 20 +- .../from-box-cloud-file-storage.md | 18 +- .../from-google-cloud-storage.md | 18 +- .../open-pdf-file/from-google-drive.md | 18 +- .../asp-net-core/organize-pdf-overview.md | 27 + .../PDF-Viewer/asp-net-core/organize-pdf.md | 16 +- .../organize-pdf/organize-page-mobile-view.md | 37 + .../organize-pdf/organize-pdf-events.md | 125 + .../programmatic-support-for-organize-page.md | 183 ++ .../organize-pdf/toolbar-organize-page.md | 112 + .../ui-interactions-organize-page.md | 97 + .../PDF/PDF-Viewer/asp-net-core/overview.md | 34 +- .../PDF/PDF-Viewer/asp-net-core/print.md | 198 +- .../save-pdf-file/to-amazon-s3.md | 36 +- .../to-azure-active-directory.md | 101 +- .../save-pdf-file/to-azure-blob-storage.md | 61 +- .../to-box-cloud-file-storage.md | 45 +- .../save-pdf-file/to-google-cloud-storage.md | 110 +- .../save-pdf-file/to-google-drive.md | 44 +- .../PDF-Viewer/asp-net-core/server-actions.md | 71 +- .../asp-net-core/text-markup-annotation.md | 4 +- .../PDF-Viewer/asp-net-core/text-search.md | 323 ++- .../PDF-Viewer/asp-net-core/textselection.md | 130 + .../annotation-toolbar-customization.md | 96 + .../toolbar-customization/custom-toolbar.md | 435 +++ .../form-designer-toolbar-customization.md | 77 + .../toolbar-customization/mobile-toolbar.md | 121 + .../primary-toolbar-customization.md | 322 +++ .../PDF/PDF-Viewer/asp-net-core/toolbar.md | 1 - .../document-loading-issues.md | 24 +- 146 files changed, 8761 insertions(+), 1832 deletions(-) create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-core/annotation/annotation-event.md create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-core/annotation/annotations-in-mobile-view.md create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-core/annotation/signature-annotation.md create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-core/event.md create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-core/form-filling.md create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-core/how-to-overview.md create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-core/how-to/customize-text-search-color.md create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-core/how-to/disable-context-menu.md create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-core/how-to/disable-tile-rendering.md create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-core/how-to/enable-resize.md create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-core/how-to/identify-added-annotation-mode.md create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-core/how-to/overlapped-annotation.md create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-core/how-to/print-document.md create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-core/how-to/select-multi-page-annotations.md create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-core/images/Context-Menu-Page-Operations1.png create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-core/images/add-revised.png create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-core/images/add-shapes.png create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-core/images/add-signature.png create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-core/images/add-sticky-notes.png create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-core/images/add-text-markup.png create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-core/images/adding-signature.png create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-core/images/after-enabling-annotation-toolbar.png create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-core/images/change-property.png create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-core/images/close-comment-panel.png create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-core/images/comment-panel.png create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-core/images/delete-icon.png create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-core/images/edit-annotation.png create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-core/images/form-filling-signature-del.png create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-core/images/form-filling-signature-dialog.png create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-core/images/form-filling-signature-signed.png create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-core/images/form-filling-signature.png create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-core/images/form-filling.png create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-core/images/ink-annotation.png create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-core/images/open-comment.png create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-core/images/open-fillcolor.png create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-core/images/open-ink.png create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-core/images/open-radius.png create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-core/images/open-stamp.png create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-core/images/radius-annotation.png create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-core/images/select-text.png create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-core/images/sticky-notes-in-page.png create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-core/interactive-pdf-navigation/bookmark-navigation.md create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-core/interactive-pdf-navigation/hyperlink-navigation.md create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-core/interactive-pdf-navigation/page-navigation.md create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-core/interactive-pdf-navigation/page-thumbnail-navigation.md create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-core/organize-pdf-overview.md create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-core/organize-pdf/organize-page-mobile-view.md create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-core/organize-pdf/organize-pdf-events.md create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-core/organize-pdf/programmatic-support-for-organize-page.md create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-core/organize-pdf/toolbar-organize-page.md create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-core/organize-pdf/ui-interactions-organize-page.md create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-core/textselection.md create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-core/toolbar-customization/annotation-toolbar-customization.md create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-core/toolbar-customization/custom-toolbar.md create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-core/toolbar-customization/form-designer-toolbar-customization.md create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-core/toolbar-customization/mobile-toolbar.md create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-core/toolbar-customization/primary-toolbar-customization.md diff --git a/Document-Processing-toc.html b/Document-Processing-toc.html index 3af7bb91b..76fb9fe0b 100644 --- a/Document-Processing-toc.html +++ b/Document-Processing-toc.html @@ -106,8 +106,7 @@
              • ASP.NET Core
                  -
                • - Getting Started +
                • Getting Started
                • +
                • Toolbar Customization + +
                • +
                • Interactive PDF Navigation + +
                • Accessibility
                • Toolbar
                • Navigation
                • Magnification
                • Text Search
                • -
                • - Annotation +
                • Annotation
                • -
                • Hand Written Signature
                • Interaction Mode
                • -
                • - Form Designer +
                • Form Designer +
                • +
                • Form Filling
                • +
                • Organize Pages +
                • -
                • Organize Pages
                • Print
                • Download
                • +
                • Event
                • +
                • Text Selection
                • Globalization
                • Server Actions
                • -
                • - How To +
                • How To
                • -
                • - Troubleshooting +
                • Troubleshooting diff --git a/Document-Processing/PDF/PDF-Viewer/asp-net-core/accessibility.md b/Document-Processing/PDF/PDF-Viewer/asp-net-core/accessibility.md index 47aa968b8..34917759e 100644 --- a/Document-Processing/PDF/PDF-Viewer/asp-net-core/accessibility.md +++ b/Document-Processing/PDF/PDF-Viewer/asp-net-core/accessibility.md @@ -1,29 +1,28 @@ --- layout: post title: Accessibility with EJ2 ASP.NET Core PDF Viewer | Syncfusion -description: Learn here all about accessibility in ASP.NET Core Pdfviewer component of Syncfusion Essential JS 2 and more. +description: Learn here all about accessibility in ASP.NET Core PDF Viewer component of Syncfusion Essential JS 2 and more. platform: document-processing control: PDF Viewer -publishingplatform: ASP.NET Core documentation: ug --- -# Accessibility in Syncfusion® PDF Viewer components +# Accessibility in Syncfusion PDF Viewer component -The PDF Viewer component followed the accessibility guidelines and standards, including [ADA](https://www.ada.gov/), [Section 508](https://www.section508.gov/), [WCAG 2.2](https://www.w3.org/TR/WCAG22/) standards, and [WCAG roles](https://www.w3.org/TR/wai-aria/#roles) that are commonly used to evaluate accessibility. +The PDF Viewer component adheres to accessibility guidelines and standards, including [ADA](https://www.ada.gov/), [Section 508](https://www.section508.gov/), and [WCAG 2.2](https://www.w3.org/TR/WCAG22/). It also integrates [WCAG roles](https://www.w3.org/TR/wai-aria/#roles) commonly used for accessibility evaluation. -The accessibility compliance for the PDF Viewer component is outlined below. +Below is an outline of the accessibility compliance for the PDF Viewer component: | Accessibility Criteria | Compatibility | -| -- | -- | -| [WCAG 2.2 Support]| Yes | -| [Section 508 Support] | Yes | -| [Screen Reader Support]| Yes | -| [Right-To-Left Support]| Yes | -| [Color Contrast] | Yes | -| [Mobile Device Support]| Intermediate | -| [Keyboard Navigation Support]| Yes | -| [Accessibility Checker Validation] | Yes | -| [Axe-core Accessibility Validation]| Yes | +| --- | --- | +| WCAG 2.2 Support | Yes | +| Section 508 Support | Yes | +| Screen Reader Support | Yes | +| Right-To-Left Support | Yes | +| Color Contrast | Yes | +| Mobile Device Support | Intermediate | +| Keyboard Navigation Support | Yes | +| Accessibility Checker Validation | Yes | +| Axe-core Accessibility Validation | Yes | +``` + +N> The icons are embedded in the font file used in the previous code snippet. + +**Step 5:** Add the following scripts to perform user interactions in the PDF Viewer: + +{% tabs %} +{% highlight js tabtitle="Standalone" %} + + + +{% endhighlight %} +{% highlight js tabtitle="Server-Backed" %} + + + +{% endhighlight %} +{% endtabs %} + +Sample: +[https://document.syncfusion.com/demos/pdf-viewer/asp-net-core/pdfviewer/customtoolbar#/tailwind](https://document.syncfusion.com/demos/pdf-viewer/asp-net-core/pdfviewer/customtoolbar#/tailwind) diff --git a/Document-Processing/PDF/PDF-Viewer/asp-net-core/toolbar-customization/form-designer-toolbar-customization.md b/Document-Processing/PDF/PDF-Viewer/asp-net-core/toolbar-customization/form-designer-toolbar-customization.md new file mode 100644 index 000000000..cc8dc7177 --- /dev/null +++ b/Document-Processing/PDF/PDF-Viewer/asp-net-core/toolbar-customization/form-designer-toolbar-customization.md @@ -0,0 +1,77 @@ +--- +layout: post +title: Form Designer Toolbar Customization in ASP.NET Core PDF Viewer Component | Syncfusion +description: Learn here all about form designer toolbar customization in Syncfusion ASP.NET Core PDF Viewer component of Syncfusion Essential JS 2 and more. +platform: document-processing +control: PDF Viewer +publishingplatform: ASP.NET Core +documentation: ug +--- + +# Form Designer Toolbar Customization + +The form designer toolbar can be customized by showing or hiding default items and by controlling the order in which the items appear. + +## Show or hide the form designer toolbar + +Show or hide the form designer toolbar programmatically during initialization or at runtime. + +Use the [EnableFormDesigner](https://help.syncfusion.com/cr/aspnetcore-js2/syncfusion.ej2.pdfviewer.pdfviewer.html#Syncfusion_EJ2_PdfViewer_PdfViewer_EnableFormDesigner) property or the [showFormDesignerToolbar](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/toolbar/#showformdesignertoolbar) method to toggle visibility. + +The following code snippet explains how to show or hide the toolbar using the `EnableFormDesigner` property. + +{% tabs %} +{% highlight cshtml tabtitle="Standalone" %} + +
                  + + +
                  + +{% endhighlight %} +{% highlight cshtml tabtitle="Server-Backed" %} + +
                  + + +
                  + +{% endhighlight %} +{% endtabs %} + +## How to customize the form designer toolbar + +Choose which tools appear and control their order in the form designer toolbar. + +Use [`PdfViewerToolbarSettings`](https://help.syncfusion.com/cr/aspnetcore-js2/Syncfusion.EJ2.PdfViewer.PdfViewerToolbarSettings.html/) with the [`FormDesignerToolbarItems`](https://help.syncfusion.com/cr/aspnetcore-js2/Syncfusion.EJ2.PdfViewer.PdfViewerToolbarSettings.html#Syncfusion_EJ2_PdfViewer_PdfViewerToolbarSettings_FormDesignerToolbarItems) property to choose which form design tools are available. The property accepts a list of [`FormDesignerToolbarItem`](https://help.syncfusion.com/cr/aspnetcore-js2/Syncfusion.EJ2.PdfViewer.PdfViewerToolbarSettings.html#Syncfusion_EJ2_PdfViewer_PdfViewerToolbarSettings_FormDesignerToolbarItems/) values. The items you include are both displayed and rendered in the order listed; any items you omit are hidden. This provides a streamlined, user-friendly form design experience across devices. + +The following example demonstrates how to customize the form designer toolbar by configuring specific tools using `FormDesignerToolbarItem`. + +{% tabs %} +{% highlight cshtml tabtitle="Standalone" %} + +
                  + + +
                  + +{% endhighlight %} +{% highlight cshtml tabtitle="Server-Backed" %} + +
                  + + +
                  + +{% endhighlight %} +{% endtabs %} \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/asp-net-core/toolbar-customization/mobile-toolbar.md b/Document-Processing/PDF/PDF-Viewer/asp-net-core/toolbar-customization/mobile-toolbar.md new file mode 100644 index 000000000..4edf01ef4 --- /dev/null +++ b/Document-Processing/PDF/PDF-Viewer/asp-net-core/toolbar-customization/mobile-toolbar.md @@ -0,0 +1,121 @@ +--- +layout: post +title: Mobile Toolbar Interface in ASP.NET Core PDF Viewer control | Syncfusion +description: Learn All About the Mobile Toolbar Interface in Syncfusion ASP.NET Core PDF Viewer control of Syncfusion Essential JS 2 and more. +platform: document-processing +control: PDF Viewer +publishingplatform: ASP.NET Core +documentation: ug +--- +# Mobile Toolbar Interface in ASP.NET Core PDF Viewer control + +The Mobile PDF Viewer offers a variety of features for viewing, searching, annotating, and managing PDF documents on mobile devices. It includes essential tools like search, download, bookmarking, annotation, and page organization. Users also have the option to enable desktop toolbar features in mobile mode, providing a more extensive set of actions. + +## Mobile Mode Toolbar Configuration +In mobile mode, the toolbar is optimized for ease of use on small screens, presenting users with the most common actions for interacting with a PDF document. Below are the key features available in mobile mode: + +![Mobile toolbar with primary PDF interaction options](../images/mobileToolbar.png) + +### Main Toolbar Options: + +**OpenOption:** Tap to load a PDF document. + +**SearchOption:** Access the search bar to find text within the document. + +![Search bar displayed for finding text within a PDF](../images/searchOption.png) + +**UndoRedoTool:** Quickly undo or redo any annotations made. + +**OrganizePagesTool:** Enable or disable page organization features to modify document pages. + +![Page organization interface for modifying PDF pages](../images/organizePages.png) + +**AnnotationEditTool:** Activate or deactivate annotation editing to add or modify annotations. + +![Annotation editing toolbar allowing users to add, edit, or delete annotations on a PDF](../images/editAnnotation.png) + + +N> In mobile mode, the annotation toolbar is conveniently displayed at the bottom of the viewer. + +### More Options Menu: +When you open the "more options" menu, you will see additional actions such as: + +**DownloadOption:** Tap to download the currently opened PDF document. + +**BookmarkOption:** Allows you to view bookmarks within the document. + +![More options menu showing additional actions like download and bookmark](../images/more-options.png) + +## Enabling Desktop Mode in Mobile + +The desktop version of the toolbar can be enabled on mobile devices by using the `enableDesktopMode` API. This API allows you to bring desktop-like features to the mobile PDF viewer, providing access to additional toolbar actions that are typically available on desktop platforms. + +### Steps to Enable Desktop Mode: + +**Step 1:** Set `enableDesktopMode` to true in the API configuration. + +**Step 2:** This will replace the mobile toolbar with the desktop toolbar layout, allowing access to more actions and controls. + +{% tabs %} +{% highlight cshtml tabtitle="Standalone" %} + +
                  + + +
                  + +{% endhighlight %} +{% highlight cshtml tabtitle="Server-Backed" %} + +
                  + + +
                  + +{% endhighlight %} +{% endtabs %} + +## Enable Scrolling in Desktop Mode with Touch Gestures + +To ensure smooth scrolling of PDF documents on a mobile device in desktop mode, it is important to enable touch gesture scrolling. You can achieve this by setting the `enableTextSelection` option to **false**. + +{% tabs %} +{% highlight cshtml tabtitle="Standalone" %} + +
                  + + +
                  + +{% endhighlight %} +{% highlight cshtml tabtitle="Server-Backed" %} + +
                  + + +
                  + +{% endhighlight %} +{% endtabs %} + +## Print Option Not Available + +The Print option is not available in mobile mode by default. However, if you need to use the print functionality on mobile devices, we recommend enabling the desktop toolbar on mobile using the `enableDesktopMode` API. + +### How to Use Print on Mobile: + +**Enable Desktop Mode:** Set `enableDesktopMode` to true to load the desktop version of the toolbar on your mobile device. + +**Print Option:** Once desktop mode is enabled, the print option will be available, allowing you to print the document directly from your mobile device. + +N> In mobile mode, the print functionality will not be available unless desktop mode is enabled. \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/asp-net-core/toolbar-customization/primary-toolbar-customization.md b/Document-Processing/PDF/PDF-Viewer/asp-net-core/toolbar-customization/primary-toolbar-customization.md new file mode 100644 index 000000000..4ec6e1c1d --- /dev/null +++ b/Document-Processing/PDF/PDF-Viewer/asp-net-core/toolbar-customization/primary-toolbar-customization.md @@ -0,0 +1,322 @@ +--- +layout: post +title: Primary Toolbar Customization in ASP.NET Core PDF Viewer Component | Syncfusion +description: Learn here all about primary toolbar customization in Syncfusion ASP.NET Core PDF Viewer component of Syncfusion Essential JS 2 and more. +platform: document-processing +control: PDF Viewer +publishingplatform: ASP.NET Core +documentation: ug +--- + +# Primary Toolbar Customization in PDF Viewer Component + +The primary toolbar of the PDF Viewer can be customized by rearranging existing items, disabling default items, and adding custom items. New items can be placed at specific index positions among the existing items. + +## Show or hide the primary toolbar + +Toggle the built-in primary toolbar to create custom toolbar experiences or simplify the UI. In scenarios where a custom toolbar is required, the built-in toolbar can be hidden. Use the [enableToolbar](https://help.syncfusion.com/cr/aspnetcore-js2/syncfusion.ej2.pdfviewer.pdfviewer.html#Syncfusion_EJ2_PdfViewer_PdfViewer_EnableToolbar) property or the [showToolbar](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/toolbar/#showtoolbar) method to show or hide the primary toolbar. + +Show or hide the toolbar using the `enableToolbar` property: + +{% tabs %} +{% highlight cshtml tabtitle="Standalone" %} + +
                  + + +
                  + +{% endhighlight %} +{% highlight cshtml tabtitle="Server-Backed" %} + +
                  + + +
                  + +{% endhighlight %} +{% endtabs %} + +The following code snippet explains how to show or hide the toolbar using the `showToolbar` method. + +{% tabs %} +{% highlight cshtml tabtitle="Standalone" %} + +
                  + + +
                  + + + +{% endhighlight %} +{% highlight cshtml tabtitle="Server-Backed" %} + +
                  + + +
                  + + + +{% endhighlight %} +{% endtabs %} + +## Show or hide toolbar items + +The PDF Viewer has an option to show or hide these grouped items in the built-in toolbar. + +* Show or hide toolbar items using toolbarSettings: + +{% tabs %} +{% highlight cshtml tabtitle="Standalone" %} + +
                  + + +
                  + +{% endhighlight %} +{% highlight cshtml tabtitle="Server-Backed" %} + +
                  + + +
                  + +{% endhighlight %} +{% endtabs %} + +* Show or hide toolbar items using showToolbarItem: + +{% tabs %} +{% highlight cshtml tabtitle="Standalone" %} + +
                  + + +
                  + + + +{% endhighlight %} +{% highlight cshtml tabtitle="Server-Backed" %} + +
                  + + +
                  + + + +{% endhighlight %} +{% endtabs %} + +## Customize the built-in toolbar + +The PDF Viewer allows you to customize (add, show, hide, enable, and disable) existing items in the toolbar. + +- Add: Define new items using **CustomToolbarItemModel** and include them with existing items via the [**ToolbarSettings**](https://help.syncfusion.com/cr/aspnetcore-js2/Syncfusion.EJ2.PdfViewer.PdfViewerToolbarSettings.html) property. Handle clicks in the toolbarClick event. + +- Show/Hide: Show or hide existing items using the [**ToolbarSettings**](https://help.syncfusion.com/cr/aspnetcore-js2/Syncfusion.EJ2.PdfViewer.PdfViewerToolbarSettings.html) property. Predefined toolbar items are available via [`ToolbarItem`](https://help.syncfusion.com/cr/aspnetcore-js2/Syncfusion.EJ2.PdfViewer.PdfViewerToolbarSettings.html#Syncfusion_EJ2_PdfViewer_PdfViewerToolbarSettings_ToolbarItems). + +- Enable/Disable: Toolbar items can be enabled or disabled using enableToolbarItem. + +{% tabs %} +{% highlight html tabtitle="Standalone" %} + +@page "{handler?}" +@model IndexModel +@{ + ViewData["Title"] = "Home page"; +} + +
                  + + +
                  + + + +{% endhighlight %} +{% highlight html tabtitle="Server-Backed" %} + +@page "{handler?}" +@model IndexModel +@using Syncfusion.EJ2.PdfViewer +@using Newtonsoft.Json +@{ + ViewData["Title"] = "Home page"; + CustomToolbarItems customToolbarItems = new CustomToolbarItems(); + var toolItem1 = new { id = "submit_form", text = "Submit Form", tooltipText = "Custom toolbar item", align = "Center", cssClass = "custom_button" }; + customToolbarItems.ToolbarItems = new List { toolItem1, "OpenOption", "PageNavigationTool", "MagnificationTool", "PanTool", "SelectionTool", "SearchOption", "PrintOption", "DownloadOption", "UndoRedoTool", "AnnotationEditTool", "FormDesignerEditTool", "CommentTool" }; + PdfViewerToolbarSettings toolbarSettings = new PdfViewerToolbarSettings() + { + ShowTooltip = true, + ToolbarItems = customToolbarItems.ToolbarItems + }; +} + +
                  + + +
                  + + + + + + +{% endhighlight %} +{% endtabs %} + +N> Default toolbar items: ['OpenOption', 'PageNavigationTool','MagnificationTool', 'PanTool', 'SelectionTool', 'SearchOption', 'PrintOption', 'DownloadOption','UndoRedoTool', 'AnnotationEditTool', 'FormDesignerEditTool', 'CommentTool', 'SubmitForm'] + +### Align property + +The Align property specifies the alignment of a toolbar item within the toolbar. + +`Left`: Aligns the item to the left side of the toolbar. +`Right`: Aligns the item to the right side of the toolbar. + +### Tooltip property + +The Tooltip property sets the tooltip text for a toolbar item. Tooltips provide additional information when a user hovers over the item. + +### CssClass property + +The CssClass property applies custom CSS classes to a toolbar item for custom styling. + +### Prefix property + +The Prefix property sets the CSS class or icon added as a prefix to the existing content of the toolbar item. + +### ID property + +The Id property of a CustomToolbarItemModel uniquely identifies a toolbar item and is required for customization. + +When defining or customizing toolbar items, assign a specific and descriptive Id to each item. +These properties are commonly used when defining custom toolbar items with the CustomToolbarItemModel in the context of the Syncfusion PDF Viewer. When configuring the toolbar using the ToolbarSettings property, you can include these properties to customize the appearance and behavior of each toolbar item. + +N> When customizing toolbar items, you have the flexibility to include either icons or text based on your design preference. + +[View sample in GitHub](https://github.com/SyncfusionExamples/asp-core-pdf-viewer-examples/tree/master/How%20to/Customize%20existing%20toolbar) diff --git a/Document-Processing/PDF/PDF-Viewer/asp-net-core/toolbar.md b/Document-Processing/PDF/PDF-Viewer/asp-net-core/toolbar.md index b724676b5..a4f4de080 100644 --- a/Document-Processing/PDF/PDF-Viewer/asp-net-core/toolbar.md +++ b/Document-Processing/PDF/PDF-Viewer/asp-net-core/toolbar.md @@ -4,7 +4,6 @@ title: Toolbar in ASP.NET Core Pdfviewer Component|Syncfusion description: Learn here all about Toolbar in Syncfusion ASP.NET Core Pdfviewer component of Syncfusion Essential JS 2 and more. platform: document-processing control: Toolbar -publishingplatform: ASP.NET Core documentation: ug --- diff --git a/Document-Processing/PDF/PDF-Viewer/asp-net-core/troubleshooting/document-loading-issues.md b/Document-Processing/PDF/PDF-Viewer/asp-net-core/troubleshooting/document-loading-issues.md index aedb51e6c..76d41cd66 100644 --- a/Document-Processing/PDF/PDF-Viewer/asp-net-core/troubleshooting/document-loading-issues.md +++ b/Document-Processing/PDF/PDF-Viewer/asp-net-core/troubleshooting/document-loading-issues.md @@ -1,7 +1,7 @@ --- layout: post -title: Document Loading Issues in Version 23.1 or Newer ASP.NET Core Pdfviewer Component -description: Learn here all about troubleshooting Document Loading Issues in Version 23.1 or newer in ASP.NET Core Pdfviewer of Syncfusion Essential JS 2 and more. +title: Fix document loading issues in v23.1+ for the ASP.NET Core PDF Viewer component +description: Resolve document rendering failures in v23.1 or newer by calling dataBind before load, verifying source URLs, checking CORS and CSP, and confirming network connectivity in the ASP.NET Core PDF Viewer. platform: document-processing control: PDF Viewer publishingplatform: ASP.NET Core @@ -10,9 +10,9 @@ documentation: ug # Document Loading Issues in Version 23.1 or Newer -If you're experiencing problems with your document not rendering in the viewer, especially when using version 23.1 or a newer version, follow these troubleshooting steps to resolve the issue: +If the document does not render in the viewer when using version 23.1 or newer, follow these steps: -1. **Check for `viewer.dataBind()` Requirement**: Ensure that you have called `viewer.dataBind()` as required in version 23.1 or newer. This explicit call is essential for initializing data binding and document rendering correctly. It is must to call the dataBind() method before load. +1. Call `pdfViewer.dataBind()` before `load()`. Starting with v23.1, an explicit dataBind call is required to initialize data binding and render correctly. ```html @@ -31,18 +31,18 @@ If you're experiencing problems with your document not rendering in the viewer, ``` -2. **Verify Document Source**: Confirm that the document source or URL you're trying to display is valid and accessible. Incorrect URLs or document paths can lead to loading issues. +2. Verify the document source. Ensure the URL or path is valid and accessible. -3. **Network Connectivity**: Ensure that your application has a stable network connection. Document rendering may fail if the viewer can't fetch the document due to network issues. +3. Check network connectivity. The viewer cannot fetch the document without a stable connection. -4. **Console Errors**: Use your browser's developer tools to check for any error messages or warnings in the console. These messages can provide insights into what's causing the document not to load. +4. Inspect console errors. Use browser developer tools to identify issues. -5. **Loading Sequence**: Make sure that you're calling `viewer.dataBind()` and initiating document loading in the correct sequence. The viewer should be properly initialized before attempting to load a document. +5. Validate the initialization order. Initialize the viewer, call `dataBind()`, then call `load()`. -7. **Update Viewer**: Ensure that you're using the latest version of the viewer library or framework. Sometimes, issues related to document loading are resolved in newer releases. +6. Update to the latest viewer version. Issues may be resolved in newer releases. -8. **Cross-Origin Resource Sharing (CORS)**: If you're loading documents from a different domain, ensure that CORS headers are correctly configured to allow cross-origin requests. +7. Configure CORS correctly for cross-domain documents. -9. **Content Security Policies (CSP)**: Check if your application's Content Security Policy allows the loading of external resources, as this can affect document loading. Refer [here](https://ej2.syncfusion.com/javascript/documentation/common/troubleshoot/content-security-policy) to troubleshoot. +8. Review Content Security Policy (CSP) settings. Ensure external resources are permitted. See the [Content Security Policy troubleshooting guide](https://ej2.syncfusion.com/javascript/documentation/common/troubleshoot/content-security-policy) for details. -By following these troubleshooting steps, you should be able to address issues related to document loading in version 23.1 or newer, ensuring that your documents render correctly in the viewer. \ No newline at end of file +Following this checklist typically resolves document loading issues in v23.1 or newer. From 60aa0ec6ae172ced94fad85b89800b05b0d65363 Mon Sep 17 00:00:00 2001 From: KarthikaSF4773 Date: Tue, 28 Oct 2025 17:36:27 +0530 Subject: [PATCH 108/163] 988804-ModifyStreams --- .../NET/Working-with-Excel-Tables.md | 96 +++++-------------- 1 file changed, 25 insertions(+), 71 deletions(-) diff --git a/Document-Processing/Excel/Excel-Library/NET/Working-with-Excel-Tables.md b/Document-Processing/Excel/Excel-Library/NET/Working-with-Excel-Tables.md index 134bf26db..b30bfa503 100644 --- a/Document-Processing/Excel/Excel-Library/NET/Working-with-Excel-Tables.md +++ b/Document-Processing/Excel/Excel-Library/NET/Working-with-Excel-Tables.md @@ -26,8 +26,7 @@ using (ExcelEngine excelEngine = new ExcelEngine()) { IApplication application = excelEngine.Excel; application.DefaultVersion = ExcelVersion.Xlsx; - FileStream inputStream = new FileStream(Path.GetFullPath(@"Data/InputTemplate.xlsx"), FileMode.Open, FileAccess.Read); - IWorkbook workbook = application.Workbooks.Open(inputStream); + IWorkbook workbook = application.Workbooks.Open(Path.GetFullPath(@"Data/InputTemplate.xlsx")); IWorksheet worksheet = workbook.Worksheets[0]; //Create for the given data @@ -35,13 +34,8 @@ using (ExcelEngine excelEngine = new ExcelEngine()) #region Save //Saving the workbook - FileStream outputStream = new FileStream(Path.GetFullPath("Output/CreateTable.xlsx"), FileMode.Create, FileAccess.Write); - workbook.SaveAs(outputStream); + workbook.SaveAs(Path.GetFullPath("Output/CreateTable.xlsx")); #endregion - - //Dispose streams - inputStream.Dispose(); - outputStream.Dispose(); } {% endhighlight %} @@ -89,8 +83,7 @@ using (ExcelEngine excelEngine = new ExcelEngine()) { IApplication application = excelEngine.Excel; application.DefaultVersion = ExcelVersion.Xlsx; - FileStream inputStream = new FileStream(Path.GetFullPath(@"Data/InputTemplate.xlsx"), FileMode.Open, FileAccess.Read); - IWorkbook workbook = application.Workbooks.Open(inputStream); + IWorkbook workbook = application.Workbooks.Open(Path.GetFullPath(@"Data/InputTemplate.xlsx")); IWorksheet worksheet = workbook.Worksheets[0]; //Accessing first table in the sheet @@ -101,13 +94,8 @@ using (ExcelEngine excelEngine = new ExcelEngine()) #region Save //Saving the workbook - FileStream outputStream = new FileStream(Path.GetFullPath("Output/ReadTable.xlsx"), FileMode.Create, FileAccess.Write); - workbook.SaveAs(outputStream); + workbook.SaveAs(Path.GetFullPath("Output/ReadTable.xlsx")); #endregion - - //Dispose streams - inputStream.Dispose(); - outputStream.Dispose(); } {% endhighlight %} @@ -163,8 +151,7 @@ using (ExcelEngine excelEngine = new ExcelEngine()) { IApplication application = excelEngine.Excel; application.DefaultVersion = ExcelVersion.Xlsx; - FileStream inputStream = new FileStream(Path.GetFullPath(@"Data/InputTemplate.xlsx"), FileMode.Open, FileAccess.Read); - IWorkbook workbook = application.Workbooks.Open(inputStream); + IWorkbook workbook = application.Workbooks.Open(Path.GetFullPath(@"Data/InputTemplate.xlsx")); IWorksheet worksheet = workbook.Worksheets[0]; //Creating a table @@ -175,13 +162,8 @@ using (ExcelEngine excelEngine = new ExcelEngine()) #region Save //Saving the workbook - FileStream outputStream = new FileStream(Path.GetFullPath("Output/FormatTable.xlsx"), FileMode.Create, FileAccess.Write); - workbook.SaveAs(outputStream); + workbook.SaveAs(Path.GetFullPath("Output/FormatTable.xlsx")); #endregion - - //Dispose streams - inputStream.Dispose(); - outputStream.Dispose(); } {% endhighlight %} @@ -323,12 +305,8 @@ using (ExcelEngine excelEngine = new ExcelEngine()) #region Save //Saving the workbook - FileStream outputStream = new FileStream(Path.GetFullPath("Output/CustomTableStyle.xlsx"), FileMode.Create, FileAccess.Write); - workbook.SaveAs(outputStream); + workbook.SaveAs(Path.GetFullPath("Output/CustomTableStyle.xlsx")); #endregion - - //Dispose streams - outputStream.Dispose(); } {% endhighlight %} @@ -540,8 +518,7 @@ using (ExcelEngine excelEngine = new ExcelEngine()) { IApplication application = excelEngine.Excel; application.DefaultVersion = ExcelVersion.Xlsx; - FileStream inputStream = new FileStream(Path.GetFullPath(@"Data/InputTemplate.xlsx"), FileMode.Open, FileAccess.Read); - IWorkbook workbook = application.Workbooks.Open(inputStream); + IWorkbook workbook = application.Workbooks.Open(Path.GetFullPath(@"Data/InputTemplate.xlsx")); IWorksheet worksheet = workbook.Worksheets[0]; //Creating a table @@ -552,13 +529,8 @@ using (ExcelEngine excelEngine = new ExcelEngine()) #region Save //Saving the workbook - FileStream outputStream = new FileStream(Path.GetFullPath("Output/InsertTableColumn.xlsx"), FileMode.Create, FileAccess.Write); - workbook.SaveAs(outputStream); + workbook.SaveAs(Path.GetFullPath("Output/InsertTableColumn.xlsx")); #endregion - - //Dispose streams - inputStream.Dispose(); - outputStream.Dispose(); } {% endhighlight %} @@ -622,8 +594,7 @@ using (ExcelEngine excelEngine = new ExcelEngine()) { IApplication application = excelEngine.Excel; application.DefaultVersion = ExcelVersion.Xlsx; - FileStream inputStream = new FileStream(Path.GetFullPath(@"Data/InputTemplate.xlsx"), FileMode.Open, FileAccess.Read); - IWorkbook workbook = application.Workbooks.Open(inputStream); + IWorkbook workbook = application.Workbooks.Open(Path.GetFullPath(@"Data/InputTemplate.xlsx")); IWorksheet worksheet = workbook.Worksheets[0]; //Creating a table @@ -637,13 +608,8 @@ using (ExcelEngine excelEngine = new ExcelEngine()) #region Save //Saving the workbook - FileStream outputStream = new FileStream(Path.GetFullPath("Output/AddTotalRow.xlsx"), FileMode.Create, FileAccess.Write); - workbook.SaveAs(outputStream); + workbook.SaveAs(Path.GetFullPath("Output/AddTotalRow.xlsx")); #endregion - - //Dispose streams - inputStream.Dispose(); - outputStream.Dispose(); } {% endhighlight %} @@ -742,9 +708,8 @@ using (ExcelEngine excelEngine = new ExcelEngine()) //Auto-fits the columns worksheet.UsedRange.AutofitColumns(); - //Saving the workbook as stream - FileStream stream = new FileStream("Output.xlsx", FileMode.Create, FileAccess.Write); - workbook.SaveAs(stream); + //Saving the workbook + workbook.SaveAs("Output.xlsx"); } //Helper method to get data table using OLEDB connection @@ -911,8 +876,7 @@ using (ExcelEngine excelEngine = new ExcelEngine()) { IApplication application = excelEngine.Excel; application.DefaultVersion = ExcelVersion.Excel2016; - FileStream inputStream = new FileStream("ExistingDataSource.xlsx", FileMode.Open, FileAccess.Read); - IWorkbook workbook = application.Workbooks.Open(inputStream); + IWorkbook workbook = application.Workbooks.Open("ExistingDataSource.xlsx"); IWorksheet worksheet = workbook.Worksheets[0]; //Accessing a connection from the workbook @@ -924,9 +888,8 @@ using (ExcelEngine excelEngine = new ExcelEngine()) listObject.Refresh(); } - //Saving the workbook as stream - FileStream outputStream = new FileStream("Output.xlsx", FileMode.Create, FileAccess.Write); - workbook.SaveAs(outputStream); + //Saving the workbook + workbook.SaveAs("Output.xlsx"); } {% endhighlight %} @@ -988,8 +951,7 @@ The following code example illustrates how to set parameter through **prompt** e using (ExcelEngine excelEngine = new ExcelEngine()) { IApplication application = excelEngine.Excel; - FileStream fileStream = new FileStream("QueryTable.xlsx", FileMode.Open, FileAccess.Read); - IWorkbook workbook = application.Workbooks.Open(fileStream, ExcelOpenType.Automatic); + IWorkbook workbook = application.Workbooks.Open("QueryTable.xlsx", ExcelOpenType.Automatic); IWorksheet worksheet = workbook.Worksheets[0]; ///Get query table from list objects. @@ -1004,10 +966,8 @@ using (ExcelEngine excelEngine = new ExcelEngine()) //Set parameter value through prompt. parameter.SetParam(ExcelParameterType.Prompt, "Prompt"); - //Saving the workbook as stream - FileStream stream = new FileStream("PromptParameter.xlsx", FileMode.Create, FileAccess.ReadWrite); - workbook.SaveAs(stream); - stream.Dispose(); + //Saving the workbook + workbook.SaveAs("PromptParameter.xlsx"); } {% endhighlight %} @@ -1089,8 +1049,7 @@ The following code example illustrates how to set parameter through **constant** using (ExcelEngine excelEngine = new ExcelEngine()) { IApplication application = excelEngine.Excel; - FileStream fileStream = new FileStream("QueryTable.xlsx", FileMode.Open, FileAccess.Read); - IWorkbook workbook = application.Workbooks.Open(fileStream, ExcelOpenType.Automatic); + IWorkbook workbook = application.Workbooks.Open("QueryTable.xlsx", ExcelOpenType.Automatic); IWorksheet worksheet = workbook.Worksheets[0]; ///Get query table from list objects. @@ -1105,10 +1064,8 @@ using (ExcelEngine excelEngine = new ExcelEngine()) //Set constant to the parameter value. parameter.SetParam(ExcelParameterType.Constant, 30); - //Saving the workbook as stream - FileStream stream = new FileStream("ConstantParameter.xlsx", FileMode.Create, FileAccess.ReadWrite); - workbook.SaveAs(stream); - stream.Dispose(); + //Saving the workbook + workbook.SaveAs("ConstantParameter.xlsx"); } {% endhighlight %} @@ -1175,8 +1132,7 @@ The following code example illustrates how to set parameter type to a specific * using (ExcelEngine excelEngine = new ExcelEngine()) { IApplication application = excelEngine.Excel; - FileStream fileStream = new FileStream("QueryTable.xlsx", FileMode.Open, FileAccess.Read); - IWorkbook workbook = application.Workbooks.Open(fileStream, ExcelOpenType.Automatic); + IWorkbook workbook = application.Workbooks.Open("QueryTable.xlsx", ExcelOpenType.Automatic); IWorksheet worksheet = workbook.Worksheets[0]; //Get query table from list objects. @@ -1191,10 +1147,8 @@ using (ExcelEngine excelEngine = new ExcelEngine()) //Set range to the parameter value. parameter.SetParam(ExcelParameterType.Range, worksheet.Range["H1"]); - //Saving the workbook as stream - FileStream stream = new FileStream("RangeParameter.xlsx", FileMode.Create, FileAccess.ReadWrite); - workbook.SaveAs(stream); - stream.Dispose(); + //Saving the workbook + workbook.SaveAs("RangeParameter.xlsx"); } {% endhighlight %} From 592ef995505080bfc987f295a5f70f13112da035 Mon Sep 17 00:00:00 2001 From: MuralidharanGSF4527 Date: Tue, 28 Oct 2025 18:11:56 +0530 Subject: [PATCH 109/163] 987016: removed form designer duplicate --- .../programmatically-work-with-form-field.md | 151 ------------------ .../user-interaction-with-form-fields.md | 99 ------------ .../asp-net-core/hand-written-signature.md | 3 +- 3 files changed, 1 insertion(+), 252 deletions(-) delete mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-core/formdesigner/programmatically-work-with-form-field.md delete mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-core/formdesigner/user-interaction-with-form-fields.md diff --git a/Document-Processing/PDF/PDF-Viewer/asp-net-core/formdesigner/programmatically-work-with-form-field.md b/Document-Processing/PDF/PDF-Viewer/asp-net-core/formdesigner/programmatically-work-with-form-field.md deleted file mode 100644 index ad3cb3e52..000000000 --- a/Document-Processing/PDF/PDF-Viewer/asp-net-core/formdesigner/programmatically-work-with-form-field.md +++ /dev/null @@ -1,151 +0,0 @@ ---- -layout: post -title: Programmatically Work With Form Field in ASP.NET Core Pdfviewer Component -description: Learn here all about Programmatically Work With Form Field in Syncfusion ASP.NET Core Pdfviewer component of Syncfusion Essential JS 2 and more. -platform: document-processing -control: Programmatically Work With Form Field -publishingplatform: ASP.NET Core -documentation: ug ---- - - -# Programmatically work with form field - -The PDF Viewer control provides the option to add, edit and delete the Form Fields. The Form Fields type supported by the PDF Viewer Control are: - - * Textbox - * Password - * CheckBox - * RadioButton - * ListBox - * DropDown - * SignatureField - * InitialField - -## Add a form field to PDF document programmatically - -Using addFormField method, the form fields can be added to the PDF document programmatically. We need to pass two parameters in this method. They are Form Field Type and Properties of Form Field Type. To add form field programmatically, Use the following code. - -```html -
                  - - -
                  - - -``` - -## Edit/Update form field programmatically - -Using updateFormField method, Form Field can be updated programmatically. We should get the Form Field object/Id from FormFieldCollections property that you would like to edit and pass it as a parameter to updateFormField method. The second parameter should be the properties that you would like to update for Form Field programmatically. We have updated the value and background Color properties of Textbox Form Field. - -```html -
                  - - -
                  - - -``` - -## Delete form field programmatically - -Using deleteFormField method, the form field can be deleted programmatically. We should retrieve the Form Field object/Id from FormFieldCollections property that you would like to delete and pass it as a parameter to deleteFormField method. To delete a Form Field programmatically, use the following code. - -```html -
                  - - -
                  - - -``` - -## Saving the form fields - -When the download icon is selected on the toolbar, the Form Fields will be saved in the PDF document and this action will not affect the original document. Refer the below GIF for further reference. - -![Alt text](../images/saveformfield.gif) - -You can invoke download action using following code snippet. - -```html -
                  - - -
                  - - -``` - -## Printing the form fields - -When the print icon is selected on the toolbar, the PDF document will be printed along with the Form Fields added to the pages and this action will not affect the original document. Refer the below GIF for further reference. - -![Alt text](../images/printformfield.gif) - -You can invoke print action using the following code snippet., - -```html -
                  - - -
                  - - -``` - -## Open the existing PDF document - -We can open the already saved PDF document contains Form Fields in it by clicking the open icon in the toolbar. Refer the below GIF for further reference. - -![Alt text](../images/openexistingpdf.gif) \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/asp-net-core/formdesigner/user-interaction-with-form-fields.md b/Document-Processing/PDF/PDF-Viewer/asp-net-core/formdesigner/user-interaction-with-form-fields.md deleted file mode 100644 index ed485563d..000000000 --- a/Document-Processing/PDF/PDF-Viewer/asp-net-core/formdesigner/user-interaction-with-form-fields.md +++ /dev/null @@ -1,99 +0,0 @@ ---- -layout: post -title: User Interaction With Form Fields in ASP.NET Core Pdfviewer Component -description: Learn here all about User Interaction With Form Fields in Syncfusion ASP.NET Core Pdfviewer component of Syncfusion Essential JS 2 and more. -platform: document-processing -control: User Interaction With Form Fields -publishingplatform: ASP.NET Core -documentation: ug ---- - - -# User interaction with form fields - -The PDF viewer control provides the option for interaction with Form Fields such as Drag and resize. you can draw a Form Field dynamically by clicking the Form Field icon on the toolbar and draw it in the PDF document. The Form Fields type supported by the PDF Viewer Control are: - - * Textbox - * Password - * CheckBox - * RadioButton - * ListBox - * DropDown - * SignatureField - * InitialField - -## Enable or Disable form designer toolbar - -We should inject FormDesigner module and set enableFormDesignerToolbar as true to enable the Form designer icon on the toolbar. By default, enableFormDesignerToolbar is set as true. Use the following code to inject FormDesigner module and to enable the enableFormDesignerToolbar property. - -```html -
                  - - -
                  -``` - -## Add the form field dynamically - -Click the Form Field icon on the toolbar and then click on to the PDF document to draw a Form Field. Refer the below GIF for further reference. - -![Alt text](../images/addformfield.gif) - -## Drag the form field - -We provide options to drag the Form Field which is currently selected in the PDF document. Refer the below GIF for further reference. - -![Alt text](../images/dragformfield.gif) - -## Resize the form field - -We provide options to resize the Form Field which is currently selected in the PDF document. Refer the below GIF for further reference. - -![Alt text](../images/resizeformfield.gif) - -## Edit or Update the form field dynamically - -The properties of the Form Fields can be edited using the Form Field Properties window. It can be opened by selecting the Properties option in the context menu that appears on the right by clicking the Form Field object. Refer the below image for the properties available to customize the appearance of the Form Field. - -![Alt text](../images/generalproperties.png) - -![Alt text](../images/appearanceproperties.png) - -![Alt text](../images/dropdownproperties.png) - -## Clipboard operation with form field - -The PDF Viewer control supports the clipboard operations such as cut, copy and paste for Form Fields. You can right click on the Form Field object to view the context menu and select to the clipboard options that you would like to perform. Refer the below image for the options in the context menu. - -![Alt text](../images/clipboardformfield.png) - -## Undo and Redo - -We provided support to undo/redo the Form Field actions that are performed at runtime. Use the following code example to perform undo/redo actions. - -```html - - -
                  - - -
                  - -``` \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/asp-net-core/hand-written-signature.md b/Document-Processing/PDF/PDF-Viewer/asp-net-core/hand-written-signature.md index 68199dfec..d2a5c9c49 100644 --- a/Document-Processing/PDF/PDF-Viewer/asp-net-core/hand-written-signature.md +++ b/Document-Processing/PDF/PDF-Viewer/asp-net-core/hand-written-signature.md @@ -4,12 +4,11 @@ title: Hand Written Signature in EJ2 ASP.NET CORE PDF Viewer | Syncfusion description: Learn here all about Hand Written Signature in ASP.NET CORE PDF Viewer component of Syncfusion Essential JS 2 and more. platform: document-processing control: Hand Written Signature -publishingplatform: document-processing documentation: ug --- -# Handwritten Signature +# Handwritten Signature in EJ2 ASP.NET CORE PDF Viewer The PDF Viewer control supports adding handwritten signatures to a PDF document. The handwritten signature reduces the paper work of reviewing the content and verifies it digitally. From b0c1995806e85a5fe195759f72f562f3e56b266d Mon Sep 17 00:00:00 2001 From: SanthanalakshmiSF4847 Date: Tue, 28 Oct 2025 18:43:39 +0530 Subject: [PATCH 110/163] 987773: Resolved the comments --- .../Excel/Spreadsheet/Blazor/cell-range.md | 1 - .../Spreadsheet/Blazor/rows-and-columns.md | 26 ++++++------------- 2 files changed, 8 insertions(+), 19 deletions(-) diff --git a/Document-Processing/Excel/Spreadsheet/Blazor/cell-range.md b/Document-Processing/Excel/Spreadsheet/Blazor/cell-range.md index 60a9c992c..fec807552 100644 --- a/Document-Processing/Excel/Spreadsheet/Blazor/cell-range.md +++ b/Document-Processing/Excel/Spreadsheet/Blazor/cell-range.md @@ -44,7 +44,6 @@ Cell formatting options include: * **Bottom** – Default alignment * **Wrap Text** - Displays long content on multiple lines within a single cell, preventing it from overflowing into adjacent cells. To enable text wrapping: - 1. Select the target cell or range (e.g., C5). 2. Go to the Home tab. 3. Click Wrap Text in the ribbon to toggle text wrapping for the selected cells. diff --git a/Document-Processing/Excel/Spreadsheet/Blazor/rows-and-columns.md b/Document-Processing/Excel/Spreadsheet/Blazor/rows-and-columns.md index 3341085e6..0fdc57ca6 100644 --- a/Document-Processing/Excel/Spreadsheet/Blazor/rows-and-columns.md +++ b/Document-Processing/Excel/Spreadsheet/Blazor/rows-and-columns.md @@ -20,15 +20,10 @@ You can insert rows or columns anywhere in a spreadsheet. ### Row -The rows can be inserted in the following ways: +The rows can be inserted in the following ways, -**Using the context menu** - - Insert rows in the desired position by right-clicking on a row header. - -**Using InsertRowAsync method** - -Using [`InsertRowAsync`](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Spreadsheet.SfSpreadsheet.html#Syncfusion_Blazor_Spreadsheet_SfSpreadsheet_InsertRowAsync_System_Int32_System_Int32_System_Object_Syncfusion_Blazor_Spreadsheet_RowPosition_) method, you can insert the rows once the component is loaded. +* Using [`InsertRowAsync`](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Spreadsheet.SfSpreadsheet.html#Syncfusion_Blazor_Spreadsheet_SfSpreadsheet_InsertRowAsync_System_Int32_System_Int32_System_Object_Syncfusion_Blazor_Spreadsheet_RowPosition_) method, you can insert the rows once the component is loaded. +* Using context menu, insert the rows in the desired position. The following code example shows the options for inserting rows in the spreadsheet. @@ -74,15 +69,10 @@ The following code example shows the options for inserting rows in the spreadshe ### Column -The columns can be inserted in the following ways: - -**Using the context menu** - -Insert columns in the desired position by right-clicking on a column header. - -**Using InsertColumnAsync method** +The columns can be inserted in the following ways, -Using [`InsertColumnAsync`](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Spreadsheet.SfSpreadsheet.html#Syncfusion_Blazor_Spreadsheet_SfSpreadsheet_InsertColumnAsync_System_Int32_System_Int32_System_Object_Syncfusion_Blazor_Spreadsheet_ColumnPosition_) method, you can insert the columns once the component is loaded. +* Using [`InsertColumnAsync`](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Spreadsheet.SfSpreadsheet.html#Syncfusion_Blazor_Spreadsheet_SfSpreadsheet_InsertColumnAsync_System_Int32_System_Int32_System_Object_Syncfusion_Blazor_Spreadsheet_ColumnPosition_) method, you can insert the columns once the component is loaded. +* Using context menu, insert the columns in the desired position. The following code example shows the options for inserting columns in the spreadsheet. @@ -141,8 +131,8 @@ The Blazor Spreadsheet component enables you to define the initial number of row - **With Data Source (e.g., byte array or imported file):** - - If the data source has fewer rows/columns than RowCount/ColCount, the spreadsheet renders additional empty rows/columns to meet the specified counts. - - If the data source has more rows/columns than RowCount/ColCount, the spreadsheet renders enough rows/columns to display all data from the source (i.e., it extends beyond the specified counts to fit the data). Your data is never truncated by these properties. + - If the data source has fewer rows and columns than the specified row and column counts, the spreadsheet renders additional empty rows and columns to meet those counts. + - If the data source has more rows and columns than the specified row and column counts, the spreadsheet renders enough rows and columns to display all data from the source (i.e., it extends beyond those counts to fit the data). Your data is never truncated by these properties. You can set these properties as follows: From 7da59b67606e31a5745e81770b2c9c2a6df17395 Mon Sep 17 00:00:00 2001 From: Balaji Loganathan Date: Tue, 28 Oct 2025 18:51:08 +0530 Subject: [PATCH 111/163] 984540: ASP.NET MVC docs revamp for hotfix --- Document-Processing-toc.html | 57 +- .../PDF-Viewer/asp-net-mvc/accessibility.md | 135 +- .../annotation/annotation-event.md | 780 +++++++ .../annotation/annotations-in-mobile-view.md | 121 ++ .../asp-net-mvc/annotation/comments.md | 156 +- .../annotation/free-text-annotation.md | 106 +- .../asp-net-mvc/annotation/ink-annotation.md | 90 +- .../annotation/line-angle-constraints.md | 44 +- .../annotation/measurement-annotation.md | 68 +- .../annotation/shape-annotation.md | 55 +- .../signature-annotation.md} | 69 +- .../annotation/stamp-annotation.md | 60 +- .../annotation/sticky-notes-annotation.md | 74 +- .../annotation/text-markup-annotation.md | 246 ++- .../PDF/PDF-Viewer/asp-net-mvc/download.md | 32 +- .../PDF/PDF-Viewer/asp-net-mvc/event.md | 1934 +++++++++++++++++ .../PDF-Viewer/asp-net-mvc/feature-module.md | 42 +- .../form-designer/create-programmatically.md | 182 +- .../create-with-user-interface-interaction.md | 60 +- .../form-designer/form-field-events.md | 65 +- .../PDF-Viewer/asp-net-mvc/form-filling.md | 60 +- .../programmatically-work-with-form-field.md | 126 -- .../user-interaction-with-form-fields.md | 90 - .../getting-started-with-server-backed.md | 57 +- .../PDF-Viewer/asp-net-mvc/getting-started.md | 43 +- .../PDF-Viewer/asp-net-mvc/globalization.md | 17 +- .../PDF-Viewer/asp-net-mvc/how-to-overview.md | 76 + .../Instantiate-pdfviewer-dynamically.md | 47 + .../asp-net-mvc/how-to/access-file-name.md | 28 +- .../how-to/add-annotation-in-text-search.md | 25 +- .../asp-net-mvc/how-to/add-save-button.md | 53 +- .../asp-net-mvc/how-to/capture-page-number.md | 58 + .../asp-net-mvc/how-to/close-comment-panel.md | 20 +- .../configure-annotation-selector-setting.md | 18 +- .../how-to/control-annotation-visibility.md | 36 +- ...pdf-library-bounds-to-pdf-viewer-bounds.md | 30 +- .../asp-net-mvc/how-to/custom-context-menu.md | 26 +- .../how-to/custom-font-signature-field.md | 25 +- .../asp-net-mvc/how-to/custom-fonts.md | 51 +- .../how-to/customize-text-search-color.md | 101 + .../how-to/default-width-height.md | 21 +- .../how-to/delete-a-specific-annotation.md | 56 + .../asp-net-mvc/how-to/delete-annotation.md | 20 +- .../how-to/disable-context-menu.md | 34 + .../how-to/disable-tile-rendering.md | 36 + .../display-document-without-downloading.md | 74 + .../how-to/download-start-event.md | 21 +- .../how-to/enable-local-storage.md | 28 +- .../asp-net-mvc/how-to/enable-resize.md | 32 + .../how-to/enable-text-selection.md | 34 +- .../how-to/export-as-image-standalone.md | 22 +- .../asp-net-mvc/how-to/export-as-image.md | 36 +- .../how-to/extract-text-completed.md | 12 +- .../asp-net-mvc/how-to/extract-text-option.md | 26 +- .../extract-text-using-text-collection.md | 31 +- .../asp-net-mvc/how-to/extract-text.md | 64 +- .../asp-net-mvc/how-to/find-text-async.md | 51 +- .../asp-net-mvc/how-to/get-Page-Info.md | 20 +- .../asp-net-mvc/how-to/get-base64.md | 28 +- .../how-to/identify-added-annotation-mode.md | 46 + .../identify-the-loaded-document-is-edited.md | 18 +- .../how-to/import-export-annotation.md | 148 +- .../how-to/include-the-authorization-token.md | 20 +- .../asp-net-mvc/how-to/install-packages.md | 40 + .../how-to/load-balancing-environment.md | 29 +- .../asp-net-mvc/how-to/load-documents.md | 28 +- .../asp-net-mvc/how-to/load-n-number-page.md | 16 +- .../asp-net-mvc/how-to/load-the-document.md | 18 +- .../asp-net-mvc/how-to/min-max-zoom.md | 19 +- .../asp-net-mvc/how-to/open-bookmark.md | 18 +- .../asp-net-mvc/how-to/open-thumbnail.md | 48 +- .../how-to/overlapped-annotation.md | 44 + .../pagerenderstarted-pagerendercompleted.md | 14 +- .../asp-net-mvc/how-to/print-document.md | 54 + .../how-to/redirect-to-home-page.md | 23 +- ...lve-Unable-to-find-an-entry-point-error.md | 22 +- .../how-to/resolve-pdfium-issue.md | 78 +- .../how-to/restricting-zoom-in-mobile-mode.md | 10 +- .../asp-net-mvc/how-to/retry-timeout.md | 31 +- ...ve-original-document-at-the-server-side.md | 63 + .../how-to/select-multi-page-annotations.md | 32 + .../how-to/set-author-name-to-annotation.md | 23 +- .../asp-net-mvc/how-to/show-bookmark.md | 38 + .../how-to/show-custom-stamp-item.md | 24 +- .../how-to/show-hide-annotation.md | 28 +- .../how-to/show-notification-dialog.md | 29 +- .../asp-net-mvc/how-to/signature-date.md | 24 +- .../signatureselect-signatureunselect.md | 21 +- .../asp-net-mvc/how-to/unload-document.md | 57 +- .../how-to/webservice-not-listening.md | 63 +- .../images/Context-Menu-Page-Operations1.png | Bin 0 -> 25178 bytes .../asp-net-mvc/images/add-revised.png | Bin 0 -> 28372 bytes .../asp-net-mvc/images/add-shapes.png | Bin 0 -> 19221 bytes .../asp-net-mvc/images/add-signature.png | Bin 0 -> 22529 bytes .../asp-net-mvc/images/add-sticky-notes.png | Bin 0 -> 20021 bytes .../asp-net-mvc/images/add-text-markup.png | Bin 0 -> 23517 bytes .../asp-net-mvc/images/adding-signature.png | Bin 0 -> 19302 bytes .../after-enabling-annotation-toolbar.png | Bin 0 -> 18960 bytes .../asp-net-mvc/images/annotation-toolbar.png | Bin 0 -> 35005 bytes .../asp-net-mvc/images/change-property.png | Bin 0 -> 23044 bytes .../images/close-comment-panel.png | Bin 0 -> 6322 bytes .../asp-net-mvc/images/comment-panel.png | Bin 0 -> 18581 bytes .../asp-net-mvc/images/delete-icon.png | Bin 0 -> 23763 bytes .../asp-net-mvc/images/edit-annotation.png | Bin 0 -> 16388 bytes .../images/form-deigner-toolbar.png | Bin 0 -> 33536 bytes .../asp-net-mvc/images/ink-annotation.png | Bin 0 -> 28262 bytes .../asp-net-mvc/images/open-comment.png | Bin 0 -> 23349 bytes .../asp-net-mvc/images/open-fillcolor.png | Bin 0 -> 21372 bytes .../asp-net-mvc/images/open-ink.png | Bin 0 -> 18662 bytes .../asp-net-mvc/images/open-radius.png | Bin 0 -> 19925 bytes .../asp-net-mvc/images/open-stamp.png | Bin 0 -> 28981 bytes .../images/pdfviewer-primary-toolbar.png | Bin 0 -> 44679 bytes .../asp-net-mvc/images/radius-annotation.png | Bin 0 -> 22784 bytes .../asp-net-mvc/images/select-text.png | Bin 0 -> 23051 bytes .../images/sticky-notes-in-page.png | Bin 0 -> 20085 bytes .../asp-net-mvc/interaction-mode.md | 24 +- .../bookmark-navigation.md | 122 ++ .../hyperlink-navigation.md | 164 ++ .../page-navigation.md | 126 ++ .../page-thumbnail-navigation.md | 38 + .../PDF-Viewer/asp-net-mvc/magnification.md | 26 +- .../PDF-Viewer/asp-net-mvc/mobile-toolbar.md | 59 +- .../PDF/PDF-Viewer/asp-net-mvc/navigation.md | 58 +- .../PDF-Viewer/asp-net-mvc/open-pdf-file.md | 50 +- .../open-pdf-file/from-amazon-s3.md | 26 +- .../from-azure-active-directory.md | 30 +- .../open-pdf-file/from-azure-blob-storage.md | 24 +- .../from-box-cloud-file-storage.md | 22 +- .../from-google-cloud-storage.md | 22 +- .../open-pdf-file/from-google-drive.md | 26 +- .../PDF-Viewer/asp-net-mvc/organize-pdf.md | 22 +- .../organize-pdf/organize-page-mobile-view.md | 37 + .../organize-pdf/organize-pdf-events.md | 105 + .../programmatic-support-for-organize-page.md | 150 ++ .../organize-pdf/toolbar-organize-page.md | 88 + .../ui-interactions-organize-page.md | 97 + .../PDF/PDF-Viewer/asp-net-mvc/overview.md | 34 +- .../PDF/PDF-Viewer/asp-net-mvc/print.md | 192 +- .../asp-net-mvc/save-pdf-file/to-amazon-s3.md | 46 +- .../to-azure-active-directory.md | 109 +- .../save-pdf-file/to-azure-blob-storage.md | 58 +- .../to-box-cloud-file-storage.md | 34 +- .../save-pdf-file/to-google-cloud-storage.md | 38 +- .../save-pdf-file/to-google-drive.md | 32 +- .../PDF-Viewer/asp-net-mvc/server-actions.md | 75 +- .../asp-net-mvc/text-markup-annotation.md | 4 +- .../PDF/PDF-Viewer/asp-net-mvc/text-search.md | 260 ++- .../PDF-Viewer/asp-net-mvc/text-selection.md | 107 +- .../annotation-toolbar-customization.md | 82 + .../toolbar-customization/custom-toolbar.md | 324 +++ .../form-designer-toolbar-customization.md | 63 + .../toolbar-customization/mobile-toolbar.md | 107 + .../primary-toolbar-customization.md | 288 +++ .../PDF/PDF-Viewer/asp-net-mvc/toolbar.md | 89 +- .../document-loading-issues.md | 24 +- 155 files changed, 8243 insertions(+), 2174 deletions(-) create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-mvc/annotation/annotation-event.md create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-mvc/annotation/annotations-in-mobile-view.md rename Document-Processing/PDF/PDF-Viewer/asp-net-mvc/{hand-written-signature.md => annotation/signature-annotation.md} (95%) create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-mvc/event.md delete mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-mvc/formdesigner/programmatically-work-with-form-field.md delete mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-mvc/formdesigner/user-interaction-with-form-fields.md create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-mvc/how-to-overview.md create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-mvc/how-to/Instantiate-pdfviewer-dynamically.md create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-mvc/how-to/capture-page-number.md create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-mvc/how-to/customize-text-search-color.md create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-mvc/how-to/delete-a-specific-annotation.md create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-mvc/how-to/disable-context-menu.md create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-mvc/how-to/disable-tile-rendering.md create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-mvc/how-to/display-document-without-downloading.md create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-mvc/how-to/enable-resize.md create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-mvc/how-to/identify-added-annotation-mode.md create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-mvc/how-to/install-packages.md create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-mvc/how-to/overlapped-annotation.md create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-mvc/how-to/print-document.md create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-mvc/how-to/save-original-document-at-the-server-side.md create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-mvc/how-to/select-multi-page-annotations.md create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-mvc/how-to/show-bookmark.md create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-mvc/images/Context-Menu-Page-Operations1.png create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-mvc/images/add-revised.png create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-mvc/images/add-shapes.png create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-mvc/images/add-signature.png create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-mvc/images/add-sticky-notes.png create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-mvc/images/add-text-markup.png create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-mvc/images/adding-signature.png create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-mvc/images/after-enabling-annotation-toolbar.png create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-mvc/images/annotation-toolbar.png create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-mvc/images/change-property.png create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-mvc/images/close-comment-panel.png create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-mvc/images/comment-panel.png create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-mvc/images/delete-icon.png create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-mvc/images/edit-annotation.png create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-mvc/images/form-deigner-toolbar.png create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-mvc/images/ink-annotation.png create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-mvc/images/open-comment.png create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-mvc/images/open-fillcolor.png create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-mvc/images/open-ink.png create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-mvc/images/open-radius.png create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-mvc/images/open-stamp.png create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-mvc/images/pdfviewer-primary-toolbar.png create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-mvc/images/radius-annotation.png create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-mvc/images/select-text.png create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-mvc/images/sticky-notes-in-page.png create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-mvc/interactive-pdf-navigation/bookmark-navigation.md create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-mvc/interactive-pdf-navigation/hyperlink-navigation.md create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-mvc/interactive-pdf-navigation/page-navigation.md create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-mvc/interactive-pdf-navigation/page-thumbnail-navigation.md create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-mvc/organize-pdf/organize-page-mobile-view.md create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-mvc/organize-pdf/organize-pdf-events.md create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-mvc/organize-pdf/programmatic-support-for-organize-page.md create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-mvc/organize-pdf/toolbar-organize-page.md create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-mvc/organize-pdf/ui-interactions-organize-page.md create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-mvc/toolbar-customization/annotation-toolbar-customization.md create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-mvc/toolbar-customization/custom-toolbar.md create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-mvc/toolbar-customization/form-designer-toolbar-customization.md create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-mvc/toolbar-customization/mobile-toolbar.md create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-mvc/toolbar-customization/primary-toolbar-customization.md diff --git a/Document-Processing-toc.html b/Document-Processing-toc.html index e4105ed17..f9c944549 100644 --- a/Document-Processing-toc.html +++ b/Document-Processing-toc.html @@ -262,6 +262,24 @@
                • To Azure Active Directory
                • +
                • Toolbar Customization + +
                • +
                • Interactive PDF Navigation + +
                • Accessibility
                • Toolbar
                • Navigation
                • @@ -273,32 +291,47 @@
                • Text Markup Annotation
                • Shape Annotation
                • Stamp Annotation
                • -
                • Sticky Notes Annotation
                • +
                • Sticky Notes
                • Measurement Annotation
                • Free Text Annotation
                • Comments
                • Ink Annotation
                • Line Angle Constraint
                • +
                • Handwritten signature
                • +
                • Annotation Events
                • +
                • Annotations in Mobile view
                • -
                • Form Filling
                • -
                • Hand Written Signature
                • Interaction Mode
                • Form Designer +
                • +
                • Form Filling
                • +
                • Organize Pages +
                • Organize Pages
                • Print
                • Download
                • +
                • Event
                • Globalization
                • Server Actions
                • - How To + How To
                • diff --git a/Document-Processing/PDF/PDF-Viewer/asp-net-mvc/accessibility.md b/Document-Processing/PDF/PDF-Viewer/asp-net-mvc/accessibility.md index 12bf9449d..28f087d08 100644 --- a/Document-Processing/PDF/PDF-Viewer/asp-net-mvc/accessibility.md +++ b/Document-Processing/PDF/PDF-Viewer/asp-net-mvc/accessibility.md @@ -4,27 +4,25 @@ title: Accessibility with EJ2 ASP.NET MVC PDF Viewer | Syncfusion description: Learn here all about accessibility in ASP.NET MVC PDF Viewer component of Syncfusion Essential JS 2 and more. platform: document-processing control: PDF Viewer -publishingplatform: ASP.NET MVC documentation: ug --- +# Accessibility in Syncfusion PDF Viewer component -# Accessibility in Syncfusion® PDF Viewer components +The PDF Viewer component adheres to accessibility guidelines and standards, including [ADA](https://www.ada.gov/), [Section 508](https://www.section508.gov/), and [WCAG 2.2](https://www.w3.org/TR/WCAG22/). It also integrates [WCAG roles](https://www.w3.org/TR/wai-aria/#roles) commonly used for accessibility evaluation. -The PDF Viewer component followed the accessibility guidelines and standards, including [ADA](https://www.ada.gov/), [Section 508](https://www.section508.gov/), [WCAG 2.2](https://www.w3.org/TR/WCAG22/) standards, and [WCAG roles](https://www.w3.org/TR/wai-aria/#roles) that are commonly used to evaluate accessibility. - -The accessibility compliance for the PDF Viewer component is outlined below. +Below is an outline of the accessibility compliance for the PDF Viewer component: | Accessibility Criteria | Compatibility | -| -- | -- | -| [WCAG 2.2 Support]| Yes | -| [Section 508 Support] | Yes | -| [Screen Reader Support]| Yes | -| [Right-To-Left Support]| Yes | -| [Color Contrast] | Yes | -| [Mobile Device Support]| Intermediate | -| [Keyboard Navigation Support]| Yes | -| [Accessibility Checker Validation] | Yes | -| [Axe-core Accessibility Validation]| Yes | +| --- | --- | +| WCAG 2.2 Support | Yes | +| Section 508 Support | Yes | +| Screen Reader Support | Yes | +| Right-To-Left Support | Yes | +| Color Contrast | Yes | +| Mobile Device Support | Intermediate | +| Keyboard Navigation Support | Yes | +| Accessibility Checker Validation | Yes | +| Axe-core Accessibility Validation | Yes | +``` + +N> The icons are embedded in the font file used in the previous code snippet. + +**Step 5:** Add the following scripts to perform user interactions in the PDF Viewer: + +```html + + +``` + +[View sample in GitHub](https://github.com/SyncfusionExamples/asp-core-pdf-viewer-examples/tree/master/How%20to/Create%20Custom%20Toolbar) diff --git a/Document-Processing/PDF/PDF-Viewer/asp-net-mvc/toolbar-customization/form-designer-toolbar-customization.md b/Document-Processing/PDF/PDF-Viewer/asp-net-mvc/toolbar-customization/form-designer-toolbar-customization.md new file mode 100644 index 000000000..d432ecece --- /dev/null +++ b/Document-Processing/PDF/PDF-Viewer/asp-net-mvc/toolbar-customization/form-designer-toolbar-customization.md @@ -0,0 +1,63 @@ +--- +layout: post +title: Form Designer Toolbar Customization in ASP.NET MVC PDF Viewer Component | Syncfusion +description: Learn here all about form designer toolbar customization in Syncfusion ASP.NET MVC PDF Viewer component of Syncfusion Essential JS 2 and more. +platform: document-processing +control: PDF Viewer +publishingplatform: ASP.NET MVC +documentation: ug +--- + +# Form Designer Toolbar Customization + +The form designer toolbar can be customized by showing or hiding default items and by controlling the order in which the items appear. + +## Show or hide the form designer toolbar + +Show or hide the form designer toolbar programmatically during initialization or at runtime. + +Use the [EnableFormDesigner](https://help.syncfusion.com/cr/aspnetmvc-js2/syncfusion.ej2.pdfviewer.pdfviewer.html#Syncfusion_EJ2_PdfViewer_PdfViewer_EnableFormDesigner) property or the [showFormDesignerToolbar](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/toolbar/#showformdesignertoolbar) method to toggle visibility. + +The following code snippet explains how to show or hide the toolbar using the `EnableFormDesigner` property. + +{% tabs %} +{% highlight html tabtitle="Standalone" %} +```html +
                  + @Html.EJS().PdfViewer("pdfviewer").EnableFormDesigner(false).DocumentPath("https://cdn.syncfusion.com/content/pdf/hive-succinctly.pdf").Render() +
                  +``` +{% endhighlight %} +{% highlight html tabtitle="Server-Backed" %} +```html +
                  + @Html.EJS().PdfViewer("pdfviewer").ServiceUrl(VirtualPathUtility.ToAbsolute("~/api/PdfViewer/")).EnableFormDesigner(false).DocumentPath("https://cdn.syncfusion.com/content/pdf/hive-succinctly.pdf").Render() +
                  +``` +{% endhighlight %} +{% endtabs %} + +## How to customize the form designer toolbar + +Choose which tools appear and control their order in the form designer toolbar. + +Use [`PdfViewerToolbarSettings`](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.PdfViewer.PdfViewerToolbarSettings.html/) with the [`FormDesignerToolbarItems`](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.PdfViewer.PdfViewerToolbarSettings.html#Syncfusion_EJ2_PdfViewer_PdfViewerToolbarSettings_FormDesignerToolbarItems) property to choose which form design tools are available. The property accepts a list of [`FormDesignerToolbarItem`](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.PdfViewer.PdfViewerToolbarSettings.html#Syncfusion_EJ2_PdfViewer_PdfViewerToolbarSettings_FormDesignerToolbarItems/) values. The items you include are both displayed and rendered in the order listed; any items you omit are hidden. This provides a streamlined, user-friendly form design experience across devices. + +The following example demonstrates how to customize the form designer toolbar by configuring specific tools using `FormDesignerToolbarItem`. + +{% tabs %} +{% highlight cshtml tabtitle="Standalone" %} + +
                  + @Html.EJS().PdfViewer("pdfviewer").DocumentPath("https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf").ToolbarSettings(new Syncfusion.EJ2.PdfViewer.PdfViewerToolbarSettings { ShowTooltip = true, FormDesignerToolbarItems = "TextboxTool PasswordTool CheckBoxTool RadioButtonTool DropdownTool ListboxTool DrawSignatureTool DeleteTool" }).Render() +
                  + +{% endhighlight %} +{% highlight cshtml tabtitle="Server-Backed" %} + +
                  + @Html.EJS().PdfViewer("pdfviewer").ServiceUrl(VirtualPathUtility.ToAbsolute("~/api/PdfViewer/")).DocumentPath("https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf").ToolbarSettings(new Syncfusion.EJ2.PdfViewer.PdfViewerToolbarSettings { ShowTooltip = true, FormDesignerToolbarItems = "TextboxTool PasswordTool CheckBoxTool RadioButtonTool DropdownTool ListboxTool DrawSignatureTool DeleteTool" }).Render() +
                  + +{% endhighlight %} +{% endtabs %} \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/asp-net-mvc/toolbar-customization/mobile-toolbar.md b/Document-Processing/PDF/PDF-Viewer/asp-net-mvc/toolbar-customization/mobile-toolbar.md new file mode 100644 index 000000000..a7e77ed68 --- /dev/null +++ b/Document-Processing/PDF/PDF-Viewer/asp-net-mvc/toolbar-customization/mobile-toolbar.md @@ -0,0 +1,107 @@ +--- +layout: post +title: Mobile Toolbar Interface in ASP.NET MVC PDF Viewer control | Syncfusion +description: Learn All About the Mobile Toolbar Interface in Syncfusion ASP.NET MVC PDF Viewer control of Syncfusion Essential JS 2 and more. +platform: document-processing +control: PDF Viewer +publishingplatform: ASP.NET MVC +documentation: ug +--- +# Mobile Toolbar Interface in ASP.NET MVC PDF Viewer control + +The Mobile PDF Viewer offers a variety of features for viewing, searching, annotating, and managing PDF documents on mobile devices. It includes essential tools like search, download, bookmarking, annotation, and page organization. Users also have the option to enable desktop toolbar features in mobile mode, providing a more extensive set of actions. + +## Mobile Mode Toolbar Configuration +In mobile mode, the toolbar is optimized for ease of use on small screens, presenting users with the most common actions for interacting with a PDF document. Below are the key features available in mobile mode: + +![Mobile toolbar with primary PDF interaction options](../images/mobileToolbar.png) + +### Main Toolbar Options: + +**OpenOption:** Tap to load a PDF document. + +**SearchOption:** Access the search bar to find text within the document. + +![Search bar displayed for finding text within a PDF](../images/searchOption.png) + +**UndoRedoTool:** Quickly undo or redo any annotations made. + +**OrganizePagesTool:** Enable or disable page organization features to modify document pages. + +![Page organization interface for modifying PDF pages](../images/organizePages.png) + +**AnnotationEditTool:** Activate or deactivate annotation editing to add or modify annotations. + +![Annotation editing toolbar allowing users to add, edit, or delete annotations on a PDF](../images/editAnnotation.png) + + +N> In mobile mode, the annotation toolbar is conveniently displayed at the bottom of the viewer. + +### More Options Menu: +When you open the "more options" menu, you will see additional actions such as: + +**DownloadOption:** Tap to download the currently opened PDF document. + +**BookmarkOption:** Allows you to view bookmarks within the document. + +![More options menu showing additional actions like download and bookmark](../images/more-options.png) + +## Enabling Desktop Mode in Mobile + +The desktop version of the toolbar can be enabled on mobile devices by using the `EnableDesktopMode` API. This API allows you to bring desktop-like features to the mobile PDF viewer, providing access to additional toolbar actions that are typically available on desktop platforms. + +### Steps to Enable Desktop Mode: + +**Step 1:** Set `EnableDesktopMode` to true in the API configuration. + +**Step 2:** This will replace the mobile toolbar with the desktop toolbar layout, allowing access to more actions and controls. + +{% tabs %} +{% highlight html tabtitle="Standalone" %} +```html +
                  + @Html.EJS().PdfViewer("pdfviewer").EnableDesktopMode(true).DocumentPath("https://cdn.syncfusion.com/content/pdf/hive-succinctly.pdf").Render() +
                  +``` +{% endhighlight %} +{% highlight html tabtitle="Server-Backed" %} +```html +
                  + @Html.EJS().PdfViewer("pdfviewer").ServiceUrl(VirtualPathUtility.ToAbsolute("~/api/PdfViewer/")).EnableDesktopMode(true).DocumentPath("https://cdn.syncfusion.com/content/pdf/hive-succinctly.pdf").Render() +
                  +``` +{% endhighlight %} +{% endtabs %} + +## Enable Scrolling in Desktop Mode with Touch Gestures + +To ensure smooth scrolling of PDF documents on a mobile device in desktop mode, it is important to enable touch gesture scrolling. You can achieve this by setting the `EnableTextSelection` option to **false**. + +{% tabs %} +{% highlight html tabtitle="Standalone" %} +```html +
                  + @Html.EJS().PdfViewer("pdfviewer").EnableTextSelection(false).DocumentPath("https://cdn.syncfusion.com/content/pdf/hive-succinctly.pdf").Render() +
                  +``` +{% endhighlight %} +{% highlight html tabtitle="Server-Backed" %} +```html +
                  + @Html.EJS().PdfViewer("pdfviewer").ServiceUrl(VirtualPathUtility.ToAbsolute("~/api/PdfViewer/")).EnableTextSelection(false).DocumentPath("https://cdn.syncfusion.com/content/pdf/hive-succinctly.pdf").Render() +
                  +``` +{% endhighlight %} +{% endtabs %} + +## Print Option Not Available + +The Print option is not available in mobile mode by default. However, if you need to use the print functionality on mobile devices, we recommend enabling the desktop toolbar on mobile using the `EnableDesktopMode` API. + +### How to Use Print on Mobile: + +**Enable Desktop Mode:** Set `EnableDesktopMode` to true to load the desktop version of the toolbar on your mobile device. + +**Print Option:** Once desktop mode is enabled, the print option will be available, allowing you to print the document directly from your mobile device. + +N> In mobile mode, the print functionality will not be available unless desktop mode is enabled. \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/asp-net-mvc/toolbar-customization/primary-toolbar-customization.md b/Document-Processing/PDF/PDF-Viewer/asp-net-mvc/toolbar-customization/primary-toolbar-customization.md new file mode 100644 index 000000000..8e94b9c1f --- /dev/null +++ b/Document-Processing/PDF/PDF-Viewer/asp-net-mvc/toolbar-customization/primary-toolbar-customization.md @@ -0,0 +1,288 @@ +--- +layout: post +title: Primary Toolbar Customization in ASP.NET MVC PDF Viewer Component | Syncfusion +description: Learn here all about primary toolbar customization in Syncfusion ASP.NET MVC PDF Viewer component of Syncfusion Essential JS 2 and more. +platform: document-processing +control: PDF Viewer +publishingplatform: ASP.NET MVC +documentation: ug +--- + +# Primary Toolbar Customization in PDF Viewer Component + +The primary toolbar of the PDF Viewer can be customized by rearranging existing items, disabling default items, and adding custom items. New items can be placed at specific index positions among the existing items. + +## Show or hide the primary toolbar + +Toggle the built-in primary toolbar to create custom toolbar experiences or simplify the UI. In scenarios where a custom toolbar is required, the built-in toolbar can be hidden. Use the [EnableToolbar](https://help.syncfusion.com/cr/aspnetmvc-js2/syncfusion.ej2.pdfviewer.pdfviewer.html#Syncfusion_EJ2_PdfViewer_PdfViewer_EnableToolbar) property or the [showToolbar](https://ej2.syncfusion.com/javascript/documentation/api/pdfviewer/toolbar/#showtoolbar) method to show or hide the primary toolbar. + +Show or hide the toolbar using the `enableToolbar` property: + +{% tabs %} +{% highlight html tabtitle="Standalone" %} +```html +
                  + @Html.EJS().PdfViewer("pdfviewer").EnableToolbar(false).DocumentPath("https://cdn.syncfusion.com/content/pdf/hive-succinctly.pdf").Render() +
                  +``` +{% endhighlight %} +{% highlight html tabtitle="Server-Backed" %} +```html +
                  + @Html.EJS().PdfViewer("pdfviewer").ServiceUrl(VirtualPathUtility.ToAbsolute("~/api/PdfViewer/")).EnableToolbar(false).DocumentPath("https://cdn.syncfusion.com/content/pdf/hive-succinctly.pdf").Render() +
                  +``` +{% endhighlight %} +{% endtabs %} + +The following code snippet explains how to show or hide the toolbar using the `showToolbar` method. + +{{% tabs %} +{% highlight cshtml tabtitle="Standalone" %} + +
                  + @Html.EJS().PdfViewer("pdfviewer").DocumentPath("https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf").DocumentLoad("showToolbar").Render() +
                  + + + +{% endhighlight %} +{% highlight cshtml tabtitle="Server-Backed" %} + +
                  + @Html.EJS().PdfViewer("pdfviewer").ServiceUrl(VirtualPathUtility.ToAbsolute("~/api/PdfViewer/")).DocumentPath("https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf").DocumentLoad("showToolbar").Render() +
                  + + + +{% endhighlight %} +{% endtabs %} + +## Show or hide toolbar items + +The PDF Viewer has an option to show or hide these grouped items in the built-in toolbar. + +* Show or hide toolbar items using toolbarSettings: + +{% tabs %} +{% highlight html tabtitle="Standalone" %} + +```html + +
                  + @Html.EJS().PdfViewer("pdfviewer").ToolbarSettings(new Syncfusion.EJ2.PdfViewer.PdfViewerToolbarSettings { ShowTooltip = true, ToolbarItems = "OpenOption" }).DocumentPath("https://cdn.syncfusion.com/content/pdf/hive-succinctly.pdf").Render() +
                  +``` + +{% endhighlight %} +{% highlight html tabtitle="Server-Backed" %} + +```html + +
                  + @Html.EJS().PdfViewer("pdfviewer").ServiceUrl(VirtualPathUtility.ToAbsolute("~/api/PdfViewer/")).ToolbarSettings(new Syncfusion.EJ2.PdfViewer.PdfViewerToolbarSettings{ ShowTooltip = true, ToolbarItem = "OpenOption" ).DocumentPath("https://cdn.syncfusion.com/content/pdf/hive-succinctly.pdf").Render() +
                  +``` + +{% endhighlight %} +{% endtabs %} + +* Show or hide toolbar items using showToolbarItem: + +{% tabs %} +{% highlight html tabtitle="Standalone" %} + +```html + +
                  + @Html.EJS().PdfViewer("pdfviewer").DocumentPath("https://cdn.syncfusion.com/content/pdf/hive-succinctly.pdf").Render() +
                  + + +``` + +{% endhighlight %} +{% highlight html tabtitle="Server-Backed" %} + +```html + +
                  + @Html.EJS().PdfViewer("pdfviewer").ServiceUrl(VirtualPathUtility.ToAbsolute("~/api/PdfViewer/")).DocumentPath("https://cdn.syncfusion.com/content/pdf/hive-succinctly.pdf").Render() +
                  + +``` + +{% endhighlight %} +{% endtabs %} + +## Customize the built-in toolbar + +The PDF Viewer allows you to customize (add, show, hide, enable, and disable) existing items in the toolbar. + +- Add: Define new items using **CustomToolbarItemModel** and include them with existing items via the [**ToolbarSettings**](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.PdfViewer.PdfViewerToolbarSettings.html) property. Handle clicks in the toolbarClick event. + +- Show/Hide: Show or hide existing items using the [**ToolbarSettings**](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.PdfViewer.PdfViewerToolbarSettings.html) property. Predefined toolbar items are available via [`ToolbarItem`](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.PdfViewer.PdfViewerToolbarSettings.html#Syncfusion_EJ2_PdfViewer_PdfViewerToolbarSettings_ToolbarItems). + +- Enable/Disable: Toolbar items can be enabled or disabled using enableToolbarItem. + +{% tabs %} +{% highlight html tabtitle="Standalone" %} + +@using Syncfusion.EJ2 +@{ + ViewBag.Title = "Home Page"; +} + +
                  +
                  +

                  + @Html.EJS().PdfViewer("pdfviewer").DocumentPath("https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf").ResourceUrl("https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib").ToolbarClick("toolbarClick").Render() +
                  +
                  + + + +{% endhighlight %} +{% highlight html tabtitle="Server-Backed" %} + +@{ + ViewBag.Title = "Home Page"; +} +@using Syncfusion.EJ2.PdfViewer +@using ToolbarCustomization.Controllers +@{ + var toolItem1 = new { id = "submit_form", text = "Submit Form", tooltipText = "Custom toolbar item", align = "Center", cssClass = "custom_button" }; + CustomToolbarItems customToolbarItems = new CustomToolbarItems(); + customToolbarItems.ToolbarItems = new List { toolItem1, "OpenOption", "PageNavigationTool", "MagnificationTool", "PanTool", "SelectionTool", "SearchOption", "PrintOption", "DownloadOption", "UndoRedoTool", "AnnotationEditTool", "FormDesignerEditTool", "CommentTool" }; + PdfViewerToolbarSettings toolbarSettings = new PdfViewerToolbarSettings() + { + ShowTooltip = true, + ToolbarItems = customToolbarItems.ToolbarItems + }; +} +
                  +
                  +

                  + @Html.EJS().PdfViewer("pdfviewer").ServiceUrl(VirtualPathUtility.ToAbsolute("~/Home/")).DocumentPath("https://cdn.syncfusion.com/content/pdf/form-designer.pdf").ToolbarClick("toolbarClick").ToolbarSettings(toolbarSettings).Render() +
                  +
                  + + + + +{% endhighlight %} +{% endtabs %} + +N> Default toolbar items: ['OpenOption', 'PageNavigationTool','MagnificationTool', 'PanTool', 'SelectionTool', 'SearchOption', 'PrintOption', 'DownloadOption','UndoRedoTool', 'AnnotationEditTool', 'FormDesignerEditTool', 'CommentTool', 'SubmitForm'] + +### Align property + +The Align property specifies the alignment of a toolbar item within the toolbar. + +`Left`: Aligns the item to the left side of the toolbar. +`Right`: Aligns the item to the right side of the toolbar. + +### Tooltip property + +The Tooltip property sets the tooltip text for a toolbar item. Tooltips provide additional information when a user hovers over the item. + +### CssClass property + +The CssClass property applies custom CSS classes to a toolbar item for custom styling. + +### Prefix property + +The Prefix property sets the CSS class or icon added as a prefix to the existing content of the toolbar item. + +### ID property + +The Id property of a CustomToolbarItemModel uniquely identifies a toolbar item and is required for customization. + +When defining or customizing toolbar items, assign a specific and descriptive Id to each item. +These properties are commonly used when defining custom toolbar items with the CustomToolbarItemModel in the context of the Syncfusion PDF Viewer. When configuring the toolbar using the ToolbarSettings property, you can include these properties to customize the appearance and behavior of each toolbar item. + +N> When customizing toolbar items, you have the flexibility to include either icons or text based on your design preference. + +[View sample in GitHub](https://github.com/SyncfusionExamples/mvc-pdf-viewer-examples/tree/master/How%20to/Customize%20existing%20toolbar) diff --git a/Document-Processing/PDF/PDF-Viewer/asp-net-mvc/toolbar.md b/Document-Processing/PDF/PDF-Viewer/asp-net-mvc/toolbar.md index 248ffddff..3e469f765 100644 --- a/Document-Processing/PDF/PDF-Viewer/asp-net-mvc/toolbar.md +++ b/Document-Processing/PDF/PDF-Viewer/asp-net-mvc/toolbar.md @@ -1,29 +1,38 @@ --- layout: post -title: Toolbar in ASP.NET MVC Pdfviewer Component| Syncfusion -description: Learn here all about Toolbar in Syncfusion ASP.NET MVC Pdfviewer component of Syncfusion Essential JS 2 and more. +title: Overview of the toolbars in ASP.NET MVC PDF Viewer Component | Syncfusion +description: Check out and learn about the primary, annotation, form designer, and redaction toolbars in the Syncfusion ASP.NET MVC PDF Viewer component. platform: document-processing -control: Toolbar +control: PDF Viewer publishingplatform: ASP.NET MVC documentation: ug --- -# Built-in toolbar in ASP.NET MVC PDFViewer Control +# Toolbar in ASP.NET MVC PDF Viewer Component -The PDF Viewer comes with a powerful built-in toolbar to execute important actions such as page navigation,text search,view mode,download print,bookmark and thumbnails. +The PDF Viewer includes a built-in, responsive toolbar that surfaces common PDF actions and provides entry points to feature-specific toolbars. It adapts across desktop, tablet, and mobile, and can be customized to show or hide items, reorder commands, add custom items, and handle toolbar events. -The following table shows built-in toolbar items and its actions:- +There are three toolbars in the PDF Viewer: +* Primary toolbar +* Annotation toolbar +* Form designer toolbar + +## Primary Toolbar in ASP.NET MVC PDF Viewer Component + +The PDF Viewer includes a built-in, responsive primary toolbar that provides quick access to common viewer actions and feature-specific toolbars. It adapts to the available width for desktop, tablet, and mobile layouts. + +The primary toolbar includes the following options: | Option | Description | |---|---| | OpenOption | This option provides an action to load the PDF documents to the PDF Viewer.| -| PageNavigationTool | This option provides an action to navigate the pages in the PDF Viewer. It contains GoToFirstPage,GoToLastPage,GotoPage,GoToNext, and GoToLast tools.| -| MagnificationTool | This option provides an action to magnify the pages either with predefined or user defined zoom factors in the PDF Viewer. Contains ZoomIn, ZoomOut, Zoom, FitPage and FitWidth tools| -| PanTool |This option provides an action for panning the pages in the PDF Viewer.| -| SelectionTool |This option provides an action to enable/disable the text selection in the PDF Viewer.| -| SearchOption |This option provides an action to search a word in the PDF documents.| -| PrintOption |This option provides an action to print the PDF document being loaded in the PDF Viewer.| -| DownloadOption |This Download option provides an action to download the PDF document that has been loaded in the PDF Viewer.| +| PageNavigationTool | This option provides an action to navigate pages in the PDF Viewer. It contains GoToFirstPage, GoToLastPage, GotoPage, GoToNext, and GoToLast tools.| +| MagnificationTool | This option provides an action to magnify pages with predefined or user-defined zoom factors in the PDF Viewer. Contains ZoomIn, ZoomOut, Zoom, FitPage, and FitWidth tools.| +| PanTool | This option provides an action for panning the pages in the PDF Viewer.| +| SelectionTool | This option provides an action to enable or disable text selection in the PDF Viewer.| +| SearchOption | This option provides an action to search for text in PDF documents.| +| PrintOption | This option provides an action to print the PDF document loaded in the PDF Viewer.| +| DownloadOption | This option provides an action to download the PDF document loaded in the PDF Viewer.| | UndoRedoTool | This tool provides options to undo and redo the annotation actions performed in the PDF Viewer.| | AnnotationEditTool | This tool provides options to enable or disable the edit mode of annotation in the PDF Viewer.| @@ -352,24 +361,20 @@ new ToolbarItem { Type = ItemType.Button, PrefixIcon = "e-pv-zoom-out-icon", Too div#magnificationToolbar.e-toolbar .e-toolbar-items { background: transparent; } - #magnificationToolbar.e-toolbar .e-tbar-btn { border-radius: 50%; min-height: 30px; min-width: 30px; } - #topToolbar { top: 0px; z-index: 1001; } - .e-pv-current-page-number { width: 46px; height: 28px; text-align: center; } - .e-icons { font-family: "e-icons"; font-style: normal; @@ -378,11 +383,9 @@ new ToolbarItem { Type = ItemType.Button, PrefixIcon = "e-pv-zoom-out-icon", Too line-height: 1; text-transform: none; } - .e-pv-icon::before { font-family: 'e-icons'; } - .e-pv-icon-search::before { font-family: 'e-icons'; font-size: 12px; @@ -390,23 +393,18 @@ new ToolbarItem { Type = ItemType.Button, PrefixIcon = "e-pv-zoom-out-icon", Too .e-pv-download-document-icon::before { content: '\e914'; } - .e-pv-print-document-icon::before { content: '\e917'; } - .e-pv-previous-page-navigation-icon::before { content: '\e910'; } - .e-pv-next-page-navigation-icon::before { content: '\e911'; } - .e-pv-zoom-out-icon::before { content: '\e912'; } - .e-pv-zoom-in-icon::before { content: '\e91d'; } @@ -424,7 +422,6 @@ new ToolbarItem { Type = ItemType.Button, PrefixIcon = "e-pv-zoom-out-icon", Too } ``` - N>The icons are embedded in the font file used in above code snippet. **Step 6:** Add the following scripts for performing user interaction in PDF Viewer in code behind @@ -532,7 +529,6 @@ N>The icons are embedded in the font file used in above code snippet. return true; } } - function currentPageClicked() { var currentPage = document.getElementById('currentPage'); (currentPage).select(); @@ -575,12 +571,47 @@ N>The icons are embedded in the font file used in above code snippet. } } - ``` [View sample in GitHub](https://github.com/SyncfusionExamples/asp-core-pdf-viewer-examples/tree/master/How%20to/Create%20Custom%20Toolbar) +![ASP.NET MVC PDF Viewer primary toolbar with customized items](./images/pdfviewer-primary-toolbar.png) + +* [Get more info about primary toolbar customization](./toolbar-customization/primary-toolbar-customization) + +## Annotation toolbar in ASP.NET MVC PDF Viewer Component + +The Annotation toolbar appears below the primary toolbar when annotation features are enabled. It provides tools to create and edit annotations. + +* Text markup: Highlight, Underline, Strikethrough, Squiggly +* Shapes: Line, Arrow, Rectangle, Circle, Polygon +* Measurement: Distance, Perimeter, Area, Radius, Volume +* Freehand: Ink, Signature +* Text: Free text +* Stamp: Predefined and custom stamps +* Properties: Color, opacity, thickness, font +* Edit helpers: Comments panel, Delete +* Close + +![ASP.NET MVC PDF Viewer annotation toolbar](./images/annotation-toolbar.png) + +* [Get more info about annotation toolbar customization](./toolbar-customization/annotation-toolbar-customization) + +## Form Designer toolbar in ASP.NET MVC PDF Viewer Component + +Use the Form Designer toolbar to add and configure interactive form fields in the PDF. It appears below the primary toolbar when form designer is enabled. + +* Field types: Button, Text box, Password, Checkbox, Radio button, Drop-down, List box, Signature, Initial +* Edit helpers: Delete +* Close + +![ PDF Viewer form designer toolbar](./images/form-deigner-toolbar.png) + +* [Get more info about form designer toolbar customization](./toolbar-customization/form-designer-toolbar-customization) + ## See also -* [Toolbar customization](./how-to/toolbar_customization) -* [Feature Modules](./feature-module) +* [Mobile toolbar](./toolbar-customization/mobile-toolbar) +* [Adding the shape annotation in PDF viewer](./annotation/shape-annotation) +* [Form designer in PDF viewer](./form-designer/create-programmatically) +* [Feature Modules](./feature-module) \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Viewer/asp-net-mvc/troubleshooting/document-loading-issues.md b/Document-Processing/PDF/PDF-Viewer/asp-net-mvc/troubleshooting/document-loading-issues.md index 389771f2c..5cbf5b8e3 100644 --- a/Document-Processing/PDF/PDF-Viewer/asp-net-mvc/troubleshooting/document-loading-issues.md +++ b/Document-Processing/PDF/PDF-Viewer/asp-net-mvc/troubleshooting/document-loading-issues.md @@ -1,7 +1,7 @@ --- layout: post -title: Document Loading Issues in Version 23.1 or Newer ASP.NET MVC Pdfviewer Component -description: Learn here all about troubleshooting Document Loading Issues in Version 23.1 or newer in ASP.NET MVC Pdfviewer of Syncfusion Essential JS 2 and more. +title: Fix document loading issues in v23.1 for the ASP.NET MVC PDF Viewer component +description: Resolve document rendering failures in v23.1 or newer by calling dataBind before load, verifying source URLs, checking CORS and CSP, and confirming network connectivity in the ASP.NET MVC PDF Viewer. platform: document-processing control: PDF Viewer publishingplatform: ASP.NET MVC @@ -10,9 +10,9 @@ documentation: ug # Document Loading Issues in Version 23.1 or Newer -If you're experiencing problems with your document not rendering in the viewer, especially when using version 23.1 or a newer version, follow these troubleshooting steps to resolve the issue: +If the document does not render in the viewer when using version 23.1 or newer, follow these steps: -1. **Check for `viewer.dataBind()` Requirement**: Ensure that you have called `viewer.dataBind()` as required in version 23.1 or newer. This explicit call is essential for initializing data binding and document rendering correctly. It is must to call the dataBind() method before load. +1. Call `pdfViewer.dataBind()` before `load()`. Starting with v23.1, an explicit dataBind call is required to initialize data binding and render correctly. ```html @@ -30,18 +30,18 @@ If you're experiencing problems with your document not rendering in the viewer, ``` -2. **Verify Document Source**: Confirm that the document source or URL you're trying to display is valid and accessible. Incorrect URLs or document paths can lead to loading issues. +2. Verify the document source. Ensure the URL or path is valid and accessible. -3. **Network Connectivity**: Ensure that your application has a stable network connection. Document rendering may fail if the viewer can't fetch the document due to network issues. +3. Check network connectivity. The viewer cannot fetch the document without a stable connection. -4. **Console Errors**: Use your browser's developer tools to check for any error messages or warnings in the console. These messages can provide insights into what's causing the document not to load. +4. Inspect console errors. Use browser developer tools to identify issues. -5. **Loading Sequence**: Make sure that you're calling `viewer.dataBind()` and initiating document loading in the correct sequence. The viewer should be properly initialized before attempting to load a document. +5. Validate the initialization order. Initialize the viewer, call `dataBind()`, then call `load()`. -7. **Update Viewer**: Ensure that you're using the latest version of the viewer library or framework. Sometimes, issues related to document loading are resolved in newer releases. +6. Update to the latest viewer version. Issues may be resolved in newer releases. -8. **Cross-Origin Resource Sharing (CORS)**: If you're loading documents from a different domain, ensure that CORS headers are correctly configured to allow cross-origin requests. +7. Configure CORS correctly for cross-domain documents. -9. **Content Security Policies (CSP)**: Check if your application's Content Security Policy allows the loading of external resources, as this can affect document loading. Refer [here](https://ej2.syncfusion.com/javascript/documentation/common/troubleshoot/content-security-policy) to troubleshoot. +8. Review Content Security Policy (CSP) settings. Ensure external resources are permitted. See the [Content Security Policy troubleshooting guide](https://ej2.syncfusion.com/javascript/documentation/common/troubleshoot/content-security-policy) for details. -By following these troubleshooting steps, you should be able to address issues related to document loading in version 23.1 or newer, ensuring that your documents render correctly in the viewer. \ No newline at end of file +Following this checklist typically resolves document loading issues in v23.1 or newer. From 03dcdad6783b414d389408a44234f26f3bc72d4d Mon Sep 17 00:00:00 2001 From: SanthanalakshmiSF4847 Date: Tue, 28 Oct 2025 18:58:39 +0530 Subject: [PATCH 112/163] 987773: Corrected the mistakes in the content --- .../Excel/Spreadsheet/Blazor/rows-and-columns.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Document-Processing/Excel/Spreadsheet/Blazor/rows-and-columns.md b/Document-Processing/Excel/Spreadsheet/Blazor/rows-and-columns.md index 0fdc57ca6..953e10f58 100644 --- a/Document-Processing/Excel/Spreadsheet/Blazor/rows-and-columns.md +++ b/Document-Processing/Excel/Spreadsheet/Blazor/rows-and-columns.md @@ -131,8 +131,8 @@ The Blazor Spreadsheet component enables you to define the initial number of row - **With Data Source (e.g., byte array or imported file):** - - If the data source has fewer rows and columns than the specified row and column counts, the spreadsheet renders additional empty rows and columns to meet those counts. - - If the data source has more rows and columns than the specified row and column counts, the spreadsheet renders enough rows and columns to display all data from the source (i.e., it extends beyond those counts to fit the data). Your data is never truncated by these properties. + - If the data source contains fewer rows and columns than the specified row and column counts, the spreadsheet renders additional empty rows and columns to meet those counts. + - If the data source contains more rows and columns than the specified row and column counts, the spreadsheet renders enough rows and columns to display all the data (i.e., it extends beyond those counts to fit the data). Your data is never truncated by these properties. You can set these properties as follows: From f1570e0be45cd5de216e91b05fbda2d6af25a653 Mon Sep 17 00:00:00 2001 From: SanthanalakshmiSF4847 Date: Tue, 28 Oct 2025 19:11:46 +0530 Subject: [PATCH 113/163] 987773: Changed the property name --- .../Excel/Spreadsheet/Blazor/rows-and-columns.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Document-Processing/Excel/Spreadsheet/Blazor/rows-and-columns.md b/Document-Processing/Excel/Spreadsheet/Blazor/rows-and-columns.md index 953e10f58..8b951d69d 100644 --- a/Document-Processing/Excel/Spreadsheet/Blazor/rows-and-columns.md +++ b/Document-Processing/Excel/Spreadsheet/Blazor/rows-and-columns.md @@ -127,7 +127,7 @@ The Blazor Spreadsheet component enables you to define the initial number of row - **Without Data Source:** - - When no data is bound to the spreadsheet, the sheet renders empty cells up to RowCount × ColCount. + - When no data is bound to the spreadsheet, the sheet renders empty cells up to the specified row and column counts. - **With Data Source (e.g., byte array or imported file):** From 49d955a408fa2601451c825f5da4e1b8ae0844fe Mon Sep 17 00:00:00 2001 From: KarthikaSF4773 Date: Tue, 28 Oct 2025 19:39:50 +0530 Subject: [PATCH 114/163] 988804-ModifyStreamsWorkingWithPictures --- .../NET/Working-with-Pictures.md | 41 +++++-------------- 1 file changed, 10 insertions(+), 31 deletions(-) diff --git a/Document-Processing/Excel/Excel-Library/NET/Working-with-Pictures.md b/Document-Processing/Excel/Excel-Library/NET/Working-with-Pictures.md index aa6e3bd64..52f1d3bb8 100644 --- a/Document-Processing/Excel/Excel-Library/NET/Working-with-Pictures.md +++ b/Document-Processing/Excel/Excel-Library/NET/Working-with-Pictures.md @@ -24,12 +24,10 @@ using (ExcelEngine excelEngine = new ExcelEngine()) #region Save //Saving the workbook - FileStream outputStream = new FileStream(Path.GetFullPath("Output/AddPicture.xlsx"), FileMode.Create, FileAccess.Write); - workbook.SaveAs(outputStream); + workbook.SaveAs(Path.GetFullPath("Output/AddPicture.xlsx")); #endregion //Dispose streams - outputStream.Dispose(); imageStream.Dispose(); } {% endhighlight %} @@ -93,12 +91,10 @@ using (ExcelEngine excelEngine = new ExcelEngine()) #region Save //Saving the workbook - FileStream outputStream = new FileStream(Path.GetFullPath("Output/ResizePicture.xlsx"), FileMode.Create, FileAccess.Write); - workbook.SaveAs(outputStream); + workbook.SaveAs(Path.GetFullPath("Output/ResizePicture.xlsx")); #endregion //Dispose streams - outputStream.Dispose(); imageStream.Dispose(); } {% endhighlight %} @@ -179,13 +175,11 @@ using (ExcelEngine excelEngine = new ExcelEngine()) //Hide the column worksheet.HideColumn(5); - //Saving the workbook as stream - FileStream OutputStream = new FileStream(Path.GetFullPath(@"Output/Output.xlsx"), FileMode.Create, FileAccess.ReadWrite); - workbook.SaveAs(OutputStream); + //Saving the workbook + workbook.SaveAs(Path.GetFullPath(@"Output/Output.xlsx")); //Dispose streams imageStream.Dispose(); - OutputStream.Dispose(); } {% endhighlight %} @@ -271,10 +265,8 @@ using (ExcelEngine excelEngine = new ExcelEngine()) worksheet.Range["B1"].RowHeight = 155; worksheet.Range["B1"].ColumnWidth = 10; - //Saving the workbook as stream - FileStream stream = new FileStream("Output.xlsx", FileMode.Create, FileAccess.ReadWrite); - workbook.SaveAs(stream); - stream.Dispose(); + //Saving the workbook + workbook.SaveAs("Output.xlsx"); } {% endhighlight %} @@ -338,8 +330,7 @@ using (ExcelEngine excelEngine = new ExcelEngine()) { IApplication application = excelEngine.Excel; application.DefaultVersion = ExcelVersion.Xlsx; - FileStream inputStream = new FileStream(Path.GetFullPath(@"Data/InputTemplate.xlsx"), FileMode.Open, FileAccess.Read); - IWorkbook workbook = application.Workbooks.Open(inputStream); + IWorkbook workbook = application.Workbooks.Open(Path.GetFullPath(@"Data/InputTemplate.xlsx")); IWorksheet worksheet = workbook.Worksheets[0]; //Get the merged cells @@ -368,14 +359,8 @@ using (ExcelEngine excelEngine = new ExcelEngine()) #region Save //Saving the workbook - FileStream outputStream = new FileStream(Path.GetFullPath("Output/ImageInMergedRegion.xlsx"), FileMode.Create, FileAccess.Write); - workbook.SaveAs(outputStream); + workbook.SaveAs(Path.GetFullPath("Output/ImageInMergedRegion.xlsx")); #endregion - - //Dispose streams - outputStream.Dispose(); - inputStream.Dispose(); - } {% endhighlight %} @@ -467,12 +452,8 @@ using (ExcelEngine excelEngine = new ExcelEngine()) #region Save //Saving the workbook - FileStream outputStream = new FileStream(Path.GetFullPath("Output/ExternalImage.xlsx"), FileMode.Create, FileAccess.Write); - workbook.SaveAs(outputStream); + workbook.SaveAs(Path.GetFullPath("Output/ExternalImage.xlsx")); #endregion - - //Dispose streams - outputStream.Dispose(); } {% endhighlight %} @@ -531,12 +512,10 @@ using (ExcelEngine excelEngine = new ExcelEngine()) #region Save //Saving the workbook - FileStream outputStream = new FileStream(Path.GetFullPath("Output/SVGImage.xlsx"), FileMode.Create, FileAccess.Write); - workbook.SaveAs(outputStream); + workbook.SaveAs(Path.GetFullPath("Output/SVGImage.xlsx")); #endregion //Dispose streams - outputStream.Dispose(); svgStream.Dispose(); pngStream.Dispose(); } From 190e6f04072c3e5052354da0a76d08ea784702e2 Mon Sep 17 00:00:00 2001 From: KarthikaSF4773 Date: Tue, 28 Oct 2025 20:43:27 +0530 Subject: [PATCH 115/163] 988804-WorkingWithPivotTables --- .../Excel-Library/NET/Pivot-Table/Grouping.md | 28 +++------ .../NET/Pivot-Table/Pivot-Layout.md | 40 +++---------- .../NET/Pivot-Table/Pivot-Table-Options.md | 21 ++----- .../NET/Pivot-Table/Sorting-and-Filtering.md | 30 ++-------- .../NET/Pivot-Table/Styles-and-Formatting.md | 20 ++----- .../NET/Working-with-Pivot-Tables.md | 60 ++++--------------- 6 files changed, 44 insertions(+), 155 deletions(-) diff --git a/Document-Processing/Excel/Excel-Library/NET/Pivot-Table/Grouping.md b/Document-Processing/Excel/Excel-Library/NET/Pivot-Table/Grouping.md index 2a1532925..8478c807f 100644 --- a/Document-Processing/Excel/Excel-Library/NET/Pivot-Table/Grouping.md +++ b/Document-Processing/Excel/Excel-Library/NET/Pivot-Table/Grouping.md @@ -32,8 +32,7 @@ using (ExcelEngine excelEngine = new ExcelEngine()) { IApplication application = excelEngine.Excel; application.DefaultVersion = ExcelVersion.Xlsx; - FileStream fileStream = new FileStream("InputTemplate.xlsx", FileMode.Open, FileAccess.Read); - IWorkbook workbook = application.Workbooks.Open(fileStream); + IWorkbook workbook = application.Workbooks.Open("InputTemplate.xlsx"); IWorksheet worksheet = workbook.Worksheets[0]; IWorksheet pivotSheet = workbook.Worksheets.Create(); @@ -51,10 +50,8 @@ using (ExcelEngine excelEngine = new ExcelEngine()) pivotTable.Options.ShowFieldList = false; pivotTable.Options.RowLayout = PivotTableRowLayout.Tabular; - //Saving the workbook as stream - FileStream stream = new FileStream("PivotTableGrouping.xlsx", FileMode.Create, FileAccess.ReadWrite); - workbook.SaveAs(stream); - stream.Dispose(); + //Saving the workbook + workbook.SaveAs("PivotTableGrouping.xlsx"); } {% endhighlight %} @@ -129,8 +126,7 @@ using (ExcelEngine excelEngine = new ExcelEngine()) { IApplication application = excelEngine.Excel; application.DefaultVersion = ExcelVersion.Xlsx; - FileStream fileStream = new FileStream("InputTemplate.xlsx", FileMode.Open, FileAccess.Read); - IWorkbook workbook = application.Workbooks.Open(fileStream); + IWorkbook workbook = application.Workbooks.Open("InputTemplate.xlsx"); IWorksheet worksheet = workbook.Worksheets[0]; IPivotTable pivotTable = worksheet.PivotTables[0]; @@ -141,10 +137,8 @@ using (ExcelEngine excelEngine = new ExcelEngine()) //Remove pivot table grouping field1.GroupBy = PivotFieldGroupType.None; - //Saving the workbook as stream - FileStream stream = new FileStream("PivotTableUnGrouping.xlsx", FileMode.Create, FileAccess.ReadWrite); - workbook.SaveAs(stream); - stream.Dispose(); + //Saving the workbook + workbook.SaveAs("PivotTableUnGrouping.xlsx"); } {% endhighlight %} @@ -202,8 +196,7 @@ using (ExcelEngine excelEngine = new ExcelEngine()) { IApplication application = excelEngine.Excel; application.DefaultVersion = ExcelVersion.Xlsx; - FileStream inputStream = new FileStream(Path.GetFullPath(@"Data/InputTemplate.xlsx"), FileMode.Open, FileAccess.Read); - IWorkbook workbook = application.Workbooks.Open(inputStream); + IWorkbook workbook = application.Workbooks.Open(Path.GetFullPath(@"Data/InputTemplate.xlsx")); IWorksheet worksheet = workbook.Worksheets[0]; IWorksheet pivotSheet = workbook.Worksheets[1]; @@ -231,13 +224,8 @@ using (ExcelEngine excelEngine = new ExcelEngine()) #region Save //Saving the workbook - FileStream outputStream = new FileStream(Path.GetFullPath("Output/ExpandOrCollapse.xlsx"), FileMode.Create, FileAccess.Write); - workbook.SaveAs(outputStream); + workbook.SaveAs(Path.GetFullPath("Output/ExpandOrCollapse.xlsx")); #endregion - - //Dispose streams - outputStream.Dispose(); - inputStream.Dispose(); } {% endhighlight %} diff --git a/Document-Processing/Excel/Excel-Library/NET/Pivot-Table/Pivot-Layout.md b/Document-Processing/Excel/Excel-Library/NET/Pivot-Table/Pivot-Layout.md index 5911c5d19..835b6209b 100644 --- a/Document-Processing/Excel/Excel-Library/NET/Pivot-Table/Pivot-Layout.md +++ b/Document-Processing/Excel/Excel-Library/NET/Pivot-Table/Pivot-Layout.md @@ -20,8 +20,7 @@ using (ExcelEngine excelEngine = new ExcelEngine()) { IApplication application = excelEngine.Excel; application.DefaultVersion = ExcelVersion.Xlsx; - FileStream inputStream = new FileStream(Path.GetFullPath(@"Data/InputTemplate.xlsx"), FileMode.Open, FileAccess.Read); - IWorkbook workbook = application.Workbooks.Open(inputStream); + IWorkbook workbook = application.Workbooks.Open(Path.GetFullPath(@"Data/InputTemplate.xlsx")); IWorksheet worksheet = workbook.Worksheets[1]; IPivotTable pivotTable = worksheet.PivotTables[0]; @@ -33,13 +32,8 @@ using (ExcelEngine excelEngine = new ExcelEngine()) #region Save //Saving the workbook - FileStream outputStream = new FileStream(Path.GetFullPath("Output/Output.xlsx"), FileMode.Create, FileAccess.Write); - workbook.SaveAs(outputStream); + workbook.SaveAs(Path.GetFullPath("Output/Output.xlsx")); #endregion - - //Dispose streams - outputStream.Dispose(); - inputStream.Dispose(); } {% endhighlight %} @@ -97,8 +91,7 @@ using (ExcelEngine excelEngine = new ExcelEngine()) { IApplication application = excelEngine.Excel; application.DefaultVersion = ExcelVersion.Xlsx; - FileStream inputStream = new FileStream(Path.GetFullPath(@"Data/InputTemplate.xlsx"), FileMode.Open, FileAccess.Read); - IWorkbook workbook = application.Workbooks.Open(inputStream); + IWorkbook workbook = application.Workbooks.Open(Path.GetFullPath(@"Data/InputTemplate.xlsx")); IWorksheet worksheet = workbook.Worksheets[1]; IPivotTable pivotTable = worksheet.PivotTables[0]; @@ -110,13 +103,8 @@ using (ExcelEngine excelEngine = new ExcelEngine()) #region Save //Saving the workbook - FileStream outputStream = new FileStream(Path.GetFullPath("Output/Output.xlsx"), FileMode.Create, FileAccess.Write); - workbook.SaveAs(outputStream); + workbook.SaveAs(Path.GetFullPath("Output/Output.xlsx")); #endregion - - //Dispose streams - outputStream.Dispose(); - inputStream.Dispose(); } {% endhighlight %} @@ -174,8 +162,7 @@ using (ExcelEngine excelEngine = new ExcelEngine()) { IApplication application = excelEngine.Excel; application.DefaultVersion = ExcelVersion.Xlsx; - FileStream inputStream = new FileStream(Path.GetFullPath(@"Data/InputTemplate.xlsx"), FileMode.Open, FileAccess.Read); - IWorkbook workbook = application.Workbooks.Open(inputStream); + IWorkbook workbook = application.Workbooks.Open(Path.GetFullPath(@"Data/InputTemplate.xlsx")); IWorksheet worksheet = workbook.Worksheets[1]; IPivotTable pivotTable = worksheet.PivotTables[0]; @@ -187,13 +174,8 @@ using (ExcelEngine excelEngine = new ExcelEngine()) #region Save //Saving the workbook - FileStream outputStream = new FileStream(Path.GetFullPath("Output/Output.xlsx"), FileMode.Create, FileAccess.Write); - workbook.SaveAs(outputStream); + workbook.SaveAs(Path.GetFullPath("Output/Output.xlsx")); #endregion - - //Dispose streams - outputStream.Dispose(); - inputStream.Dispose(); } {% endhighlight %} @@ -253,8 +235,7 @@ using (ExcelEngine excelEngine = new ExcelEngine()) { IApplication application = excelEngine.Excel; application.DefaultVersion = ExcelVersion.Xlsx; - FileStream inputStream = new FileStream(Path.GetFullPath(@"Data/InputTemplate.xlsx"), FileMode.Open, FileAccess.Read); - IWorkbook workbook = application.Workbooks.Open(inputStream); + IWorkbook workbook = application.Workbooks.Open(Path.GetFullPath(@"Data/InputTemplate.xlsx")); IWorksheet worksheet = workbook.Worksheets[1]; IPivotTable pivotTable = worksheet.PivotTables[0]; @@ -263,13 +244,8 @@ using (ExcelEngine excelEngine = new ExcelEngine()) #region Save //Saving the workbook - FileStream outputStream = new FileStream(Path.GetFullPath("Output/ClassicLayout.xlsx"), FileMode.Create, FileAccess.Write); - workbook.SaveAs(outputStream); + workbook.SaveAs(Path.GetFullPath("Output/ClassicLayout.xlsx")); #endregion - - //Dispose streams - outputStream.Dispose(); - inputStream.Dispose(); } {% endhighlight %} diff --git a/Document-Processing/Excel/Excel-Library/NET/Pivot-Table/Pivot-Table-Options.md b/Document-Processing/Excel/Excel-Library/NET/Pivot-Table/Pivot-Table-Options.md index 72f040c0b..e5c01f1a1 100644 --- a/Document-Processing/Excel/Excel-Library/NET/Pivot-Table/Pivot-Table-Options.md +++ b/Document-Processing/Excel/Excel-Library/NET/Pivot-Table/Pivot-Table-Options.md @@ -224,20 +224,15 @@ using (ExcelEngine excelEngine = new ExcelEngine()) { IApplication application = excelEngine.Excel; application.DefaultVersion = ExcelVersion.Xlsx; - FileStream fileStream = new FileStream("PivotTable.xlsx", FileMode.Open, FileAccess.Read); - IWorkbook workbook = application.Workbooks.Open(fileStream); + IWorkbook workbook = application.Workbooks.Open("PivotTable.xlsx"); IWorksheet sheet = workbook.Worksheets[1]; IPivotTable pivotTable = sheet.PivotTables[0]; //Add calculated field to the first pivot table IPivotField field = pivotTable.CalculatedFields.Add("Percent", "Sales/Total*100"); - string fileName = "PivotTableCalculate.xlsx"; - - //Saving the workbook as stream - FileStream stream = new FileStream(fileName, FileMode.Create, FileAccess.ReadWrite); - workbook.SaveAs(stream); - stream.Dispose(); + //Saving the workbook + workbook.SaveAs("PivotTableCalculate.xlsx"); } {% endhighlight %} @@ -283,8 +278,7 @@ using (ExcelEngine excelEngine = new ExcelEngine()) { IApplication application = excelEngine.Excel; application.DefaultVersion = ExcelVersion.Xlsx; - FileStream inputStream = new FileStream(Path.GetFullPath(@"Data/InputTemplate.xlsx"), FileMode.Open, FileAccess.Read); - IWorkbook workbook = application.Workbooks.Open(inputStream); + IWorkbook workbook = application.Workbooks.Open(Path.GetFullPath(@"Data/InputTemplate.xlsx")); IWorksheet sheet = workbook.Worksheets[1]; IPivotTable pivotTable = sheet.PivotTables[0]; @@ -296,13 +290,8 @@ using (ExcelEngine excelEngine = new ExcelEngine()) #region Save //Saving the workbook - FileStream outputStream = new FileStream(Path.GetFullPath("Output/CalculatedField.xlsx"), FileMode.Create, FileAccess.Write); - workbook.SaveAs(outputStream); + workbook.SaveAs(Path.GetFullPath("Output/CalculatedField.xlsx")); #endregion - - //Dispose streams - outputStream.Dispose(); - inputStream.Dispose(); } {% endhighlight %} diff --git a/Document-Processing/Excel/Excel-Library/NET/Pivot-Table/Sorting-and-Filtering.md b/Document-Processing/Excel/Excel-Library/NET/Pivot-Table/Sorting-and-Filtering.md index a0f1ecad1..e56dc1abf 100644 --- a/Document-Processing/Excel/Excel-Library/NET/Pivot-Table/Sorting-and-Filtering.md +++ b/Document-Processing/Excel/Excel-Library/NET/Pivot-Table/Sorting-and-Filtering.md @@ -27,8 +27,7 @@ using (ExcelEngine excelEngine = new ExcelEngine()) { IApplication application = excelEngine.Excel; application.DefaultVersion = ExcelVersion.Xlsx; - FileStream inputStream = new FileStream(Path.GetFullPath(@"Data/InputTemplate.xlsx"), FileMode.Open, FileAccess.Read); - IWorkbook workbook = application.Workbooks.Open(inputStream); + IWorkbook workbook = application.Workbooks.Open(Path.GetFullPath(@"Data/InputTemplate.xlsx")); IWorksheet sheet = workbook.Worksheets[1]; IPivotTable pivotTable = sheet.PivotTables[0]; @@ -38,13 +37,8 @@ using (ExcelEngine excelEngine = new ExcelEngine()) #region Save //Saving the workbook - FileStream outputStream = new FileStream(Path.GetFullPath("Output/PivotSort.xlsx"), FileMode.Create, FileAccess.Write); - workbook.SaveAs(outputStream); + workbook.SaveAs(Path.GetFullPath("Output/PivotSort.xlsx")); #endregion - - //Dispose streams - outputStream.Dispose(); - inputStream.Dispose(); } {% endhighlight %} @@ -98,8 +92,7 @@ using (ExcelEngine excelEngine = new ExcelEngine()) { IApplication application = excelEngine.Excel; application.DefaultVersion = ExcelVersion.Xlsx; - FileStream inputStream = new FileStream(Path.GetFullPath(@"Data/InputTemplate.xlsx"), FileMode.Open, FileAccess.Read); - IWorkbook workbook = application.Workbooks.Open(inputStream); + IWorkbook workbook = application.Workbooks.Open(Path.GetFullPath(@"Data/InputTemplate.xlsx")); IWorksheet sheet = workbook.Worksheets[1]; IPivotTable pivotTable = sheet.PivotTables[0]; @@ -109,13 +102,8 @@ using (ExcelEngine excelEngine = new ExcelEngine()) #region Save //Saving the workbook - FileStream outputStream = new FileStream(Path.GetFullPath("Output/PivotSort.xlsx"), FileMode.Create, FileAccess.Write); - workbook.SaveAs(outputStream); + workbook.SaveAs(Path.GetFullPath("Output/PivotSort.xlsx")); #endregion - - //Dispose streams - outputStream.Dispose(); - inputStream.Dispose(); } {% endhighlight %} @@ -277,8 +265,7 @@ using (ExcelEngine excelEngine = new ExcelEngine()) { IApplication application = excelEngine.Excel; application.DefaultVersion = ExcelVersion.Xlsx; - FileStream inputStream = new FileStream(Path.GetFullPath(@"Data/InputTemplate.xlsx"), FileMode.Open, FileAccess.Read); - IWorkbook workbook = application.Workbooks.Open(inputStream); + IWorkbook workbook = application.Workbooks.Open(Path.GetFullPath(@"Data/InputTemplate.xlsx")); IWorksheet worksheet = workbook.Worksheets[0]; IWorksheet pivotSheet = workbook.Worksheets[1]; @@ -319,13 +306,8 @@ using (ExcelEngine excelEngine = new ExcelEngine()) #region Save //Saving the workbook - FileStream outputStream = new FileStream(Path.GetFullPath("Output/PivotFilter.xlsx"), FileMode.Create, FileAccess.Write); - workbook.SaveAs(outputStream); + workbook.SaveAs(Path.GetFullPath("Output/PivotFilter.xlsx")); #endregion - - //Dispose streams - outputStream.Dispose(); - inputStream.Dispose(); } {% endhighlight %} diff --git a/Document-Processing/Excel/Excel-Library/NET/Pivot-Table/Styles-and-Formatting.md b/Document-Processing/Excel/Excel-Library/NET/Pivot-Table/Styles-and-Formatting.md index d227ed35b..e45bc1022 100644 --- a/Document-Processing/Excel/Excel-Library/NET/Pivot-Table/Styles-and-Formatting.md +++ b/Document-Processing/Excel/Excel-Library/NET/Pivot-Table/Styles-and-Formatting.md @@ -20,8 +20,7 @@ using (ExcelEngine excelEngine = new ExcelEngine()) { IApplication application = excelEngine.Excel; application.DefaultVersion = ExcelVersion.Xlsx; - FileStream inputStream = new FileStream(Path.GetFullPath(@"Data/InputTemplate.xlsx"), FileMode.Open, FileAccess.Read); - IWorkbook workbook = application.Workbooks.Open(inputStream); + IWorkbook workbook = application.Workbooks.Open(Path.GetFullPath(@"Data/InputTemplate.xlsx")); IWorksheet worksheet = workbook.Worksheets[1]; IPivotTable pivotTable = worksheet.PivotTables[0]; @@ -30,13 +29,8 @@ using (ExcelEngine excelEngine = new ExcelEngine()) #region Save //Saving the workbook - FileStream outputStream = new FileStream(Path.GetFullPath("Output/PivotTable.xlsx"), FileMode.Create, FileAccess.Write); - workbook.SaveAs(outputStream); + workbook.SaveAs(Path.GetFullPath("Output/PivotTable.xlsx")); #endregion - - //Dispose streams - outputStream.Dispose(); - inputStream.Dispose(); } {% endhighlight %} @@ -92,8 +86,7 @@ using (ExcelEngine excelEngine = new ExcelEngine()) { IApplication application = excelEngine.Excel; application.DefaultVersion = ExcelVersion.Xlsx; - FileStream inputStream = new FileStream(Path.GetFullPath(@"Data/InputTemplate.xlsx"), FileMode.Open, FileAccess.Read); - IWorkbook workbook = application.Workbooks.Open(inputStream); + IWorkbook workbook = application.Workbooks.Open(Path.GetFullPath(@"Data/InputTemplate.xlsx")); IWorksheet worksheet = workbook.Worksheets[1]; IPivotTable pivotTable = worksheet.PivotTables[0]; @@ -103,13 +96,8 @@ using (ExcelEngine excelEngine = new ExcelEngine()) #region Save //Saving the workbook - FileStream outputStream = new FileStream(Path.GetFullPath("Output/PivotCellFormat.xlsx"), FileMode.Create, FileAccess.Write); - workbook.SaveAs(outputStream); + workbook.SaveAs(Path.GetFullPath("Output/PivotCellFormat.xlsx")); #endregion - - //Dispose streams - outputStream.Dispose(); - inputStream.Dispose(); } {% endhighlight %} diff --git a/Document-Processing/Excel/Excel-Library/NET/Working-with-Pivot-Tables.md b/Document-Processing/Excel/Excel-Library/NET/Working-with-Pivot-Tables.md index be4d416b5..d43364ad0 100644 --- a/Document-Processing/Excel/Excel-Library/NET/Working-with-Pivot-Tables.md +++ b/Document-Processing/Excel/Excel-Library/NET/Working-with-Pivot-Tables.md @@ -119,8 +119,7 @@ using (ExcelEngine excelEngine = new ExcelEngine()) { IApplication application = excelEngine.Excel; application.DefaultVersion = ExcelVersion.Xlsx; - FileStream inputStream = new FileStream(Path.GetFullPath(@"Data/PivotData.xlsx"), FileMode.Open, FileAccess.Read); - IWorkbook workbook = application.Workbooks.Open(inputStream); + IWorkbook workbook = application.Workbooks.Open(Path.GetFullPath(@"Data/PivotData.xlsx")); IWorksheet worksheet = workbook.Worksheets[0]; IWorksheet pivotSheet = workbook.Worksheets[1]; @@ -141,13 +140,8 @@ using (ExcelEngine excelEngine = new ExcelEngine()) #region Save //Saving the workbook - FileStream outputStream = new FileStream(Path.GetFullPath("Output/PivotTable.xlsx"), FileMode.Create, FileAccess.Write); - workbook.SaveAs(outputStream); + workbook.SaveAs(Path.GetFullPath("Output/PivotTable.xlsx")); #endregion - - //Dispose streams - outputStream.Dispose(); - inputStream.Dispose(); } {% endhighlight %} @@ -222,8 +216,7 @@ using (ExcelEngine excelEngine = new ExcelEngine()) { IApplication application = excelEngine.Excel; application.DefaultVersion = ExcelVersion.Xlsx; - FileStream inputStream = new FileStream(Path.GetFullPath(@"Data/InputTemplate.xlsx"), FileMode.Open, FileAccess.Read); - IWorkbook workbook = application.Workbooks.Open(inputStream); + IWorkbook workbook = application.Workbooks.Open(Path.GetFullPath(@"Data/InputTemplate.xlsx")); IWorksheet worksheet = workbook.Worksheets[1]; //Accessing the pivot table in the worksheet @@ -237,13 +230,8 @@ using (ExcelEngine excelEngine = new ExcelEngine()) #region Save //Saving the workbook - FileStream outputStream = new FileStream(Path.GetFullPath("Output/Output.xlsx"), FileMode.Create, FileAccess.Write); - workbook.SaveAs(outputStream); + workbook.SaveAs(Path.GetFullPath("Output/Output.xlsx")); #endregion - - //Dispose streams - outputStream.Dispose(); - inputStream.Dispose(); } {% endhighlight %} @@ -325,8 +313,7 @@ using (ExcelEngine excelEngine = new ExcelEngine()) { IApplication application = excelEngine.Excel; application.DefaultVersion = ExcelVersion.Xlsx; - FileStream inputStream = new FileStream(Path.GetFullPath(@"Data/InputTemplate.xlsx"), FileMode.Open, FileAccess.Read); - IWorkbook workbook = application.Workbooks.Open(inputStream); + IWorkbook workbook = application.Workbooks.Open(Path.GetFullPath(@"Data/InputTemplate.xlsx")); IWorksheet worksheet = workbook.Worksheets[0]; IWorksheet pivotSheet = workbook.Worksheets[1]; @@ -335,13 +322,8 @@ using (ExcelEngine excelEngine = new ExcelEngine()) #region Save //Saving the workbook - FileStream outputStream = new FileStream(Path.GetFullPath("Output/Output.xlsx"), FileMode.Create, FileAccess.Write); - workbook.SaveAs(outputStream); + workbook.SaveAs(Path.GetFullPath("Output/Output.xlsx")); #endregion - - //Dispose streams - outputStream.Dispose(); - inputStream.Dispose(); } {% endhighlight %} @@ -398,19 +380,15 @@ The following code example illustrates how to layout the pivot table. using (ExcelEngine excelEngine = new ExcelEngine()) { IApplication application = excelEngine.Excel; - FileStream fileStream = new FileStream("PivotTable.xlsx", FileMode.Open, FileAccess.Read); - IWorkbook workbook = application.Workbooks.Open(fileStream); + IWorkbook workbook = application.Workbooks.Open("PivotTable.xlsx"); IWorksheet worksheet = workbook.Worksheets[0]; IPivotTable pivotTable = worksheet.PivotTables[0]; //Layout the pivot table. pivotTable.Layout(); - string fileName = "PivotTable_Layout.xlsx"; - //Saving the workbook as stream - FileStream stream = new FileStream(fileName, FileMode.Create, FileAccess.ReadWrite); - workbook.SaveAs(stream); - stream.Dispose(); + //Saving the workbook + workbook.SaveAs("PivotTable_Layout.xlsx"); } {% endhighlight %} @@ -467,8 +445,7 @@ using (ExcelEngine excelEngine = new ExcelEngine()) { IApplication application = excelEngine.Excel; application.DefaultVersion = ExcelVersion.Xlsx; - FileStream inputStream = new FileStream(Path.GetFullPath(@"Data/InputTemplate.xlsx"), FileMode.Open, FileAccess.Read); - IWorkbook workbook = application.Workbooks.Open(inputStream); + IWorkbook workbook = application.Workbooks.Open(Path.GetFullPath(@"Data/InputTemplate.xlsx")); IWorksheet pivotSheet = workbook.Worksheets[0]; //Change the range values that the Pivot Tables range refers to @@ -476,13 +453,8 @@ using (ExcelEngine excelEngine = new ExcelEngine()) #region Save //Saving the workbook - FileStream outputStream = new FileStream(Path.GetFullPath("Output/PivotTable.xlsx"), FileMode.Create, FileAccess.Write); - workbook.SaveAs(outputStream); + workbook.SaveAs(Path.GetFullPath("Output/PivotTable.xlsx")); #endregion - - //Dispose streams - outputStream.Dispose(); - inputStream.Dispose(); } {% endhighlight %} @@ -526,8 +498,7 @@ The following code example illustrates how to refresh the pivot table after upda { IApplication application = excelEngine.Excel; application.DefaultVersion = ExcelVersion.Xlsx; - FileStream inputStream = new FileStream(Path.GetFullPath(@"Data/InputTemplate.xlsx"), FileMode.Open, FileAccess.Read); - IWorkbook workbook = application.Workbooks.Open(inputStream); + IWorkbook workbook = application.Workbooks.Open(Path.GetFullPath(@"Data/InputTemplate.xlsx")); IWorksheet worksheet = workbook.Worksheets[0]; //Updating a new value in the pivot data @@ -542,13 +513,8 @@ The following code example illustrates how to refresh the pivot table after upda #region Save //Saving the workbook - FileStream outputStream = new FileStream(Path.GetFullPath("Output/RefreshPivotTable.xlsx"), FileMode.Create, FileAccess.Write); - workbook.SaveAs(outputStream); + workbook.SaveAs(Path.GetFullPath("Output/RefreshPivotTable.xlsx")); #endregion - - //Dispose streams - outputStream.Dispose(); - inputStream.Dispose(); } {% endhighlight %} From 3efb5cb8cc3cc586320bb3df0eb71a77bc4fbe77 Mon Sep 17 00:00:00 2001 From: Karan-SF4772 Date: Wed, 29 Oct 2025 10:52:15 +0530 Subject: [PATCH 116/163] Resolved CI issues --- .../Word-To-Image/NET/Performance-metrics.md | 10 +++++----- .../Word-To-PDF/NET/Performance-metrics.md | 10 +++++----- .../Word-Library/NET/Performance-metrics.md | 19 +++++++++---------- 3 files changed, 19 insertions(+), 20 deletions(-) diff --git a/Document-Processing/Word/Conversions/Word-To-Image/NET/Performance-metrics.md b/Document-Processing/Word/Conversions/Word-To-Image/NET/Performance-metrics.md index da1fe73b6..1bdb7c1a8 100644 --- a/Document-Processing/Word/Conversions/Word-To-Image/NET/Performance-metrics.md +++ b/Document-Processing/Word/Conversions/Word-To-Image/NET/Performance-metrics.md @@ -1,5 +1,5 @@ --- -title: Performance benchmark results | Syncfusion +title: Word to image Performance benchmark results | Syncfusion description: Explore the performance benchmark results of Word to image conversion using the .NET Word Library with different page counts platform: document-processing control: DocIO @@ -31,22 +31,22 @@ The following system configurations were used for benchmarking: 2 {{'[Word-2.docx]()'| markdownify }} - + 0.77 50 {{'[Word-50.docx]()'| markdownify }} - + 9.6 100 {{'[Word-100.docx]()'| markdownify }} - + 13.9 500 {{'[Word-500.docx]()'| markdownify }} - + <49.8/td> diff --git a/Document-Processing/Word/Conversions/Word-To-PDF/NET/Performance-metrics.md b/Document-Processing/Word/Conversions/Word-To-PDF/NET/Performance-metrics.md index c38b717ed..4cd4b152f 100644 --- a/Document-Processing/Word/Conversions/Word-To-PDF/NET/Performance-metrics.md +++ b/Document-Processing/Word/Conversions/Word-To-PDF/NET/Performance-metrics.md @@ -1,5 +1,5 @@ --- -title: Performance benchmark results | Syncfusion +title: Word to PDF Performance benchmark results | Syncfusion description: Explore the performance benchmark results of Word to PDF conversion using the .NET Word Library with different page counts platform: document-processing control: DocIO @@ -31,22 +31,22 @@ The following system configurations were used for benchmarking: 2 {{'[Word-2.docx]()'| markdownify }} - 0.02 + 1.3 50 {{'[Word-50.docx]()'| markdownify }} - 0.08 + 8.6 100 {{'[Word-100.docx]()'| markdownify }} - 1.1 + 14.2 500 {{'[Word-500.docx]()'| markdownify }} - 14.5 + 31.6 diff --git a/Document-Processing/Word/Word-Library/NET/Performance-metrics.md b/Document-Processing/Word/Word-Library/NET/Performance-metrics.md index d9c295e16..a4691030e 100644 --- a/Document-Processing/Word/Word-Library/NET/Performance-metrics.md +++ b/Document-Processing/Word/Word-Library/NET/Performance-metrics.md @@ -1,5 +1,5 @@ --- -title: Performance benchmark results | Syncfusion +title: Word library Performance benchmark results | Syncfusion description: Know about the performance benchmark results of Syncfusion® .NET Word library with different document sizes platform: document-processing control: DocIO @@ -31,22 +31,22 @@ The following system configurations were used for benchmarking: 2 {{'[Word-2.docx]()'| markdownify }} - + 0.52 50 {{'[Word-50.docx]()'| markdownify }} - + 1.3 100 {{'[Word-100.docx]()'| markdownify }} - + 2.4 500 {{'[Word-500.docx]()'| markdownify }} - + 4.7 @@ -63,25 +63,24 @@ You can find the sample used for this performance evaluation on [GitHub](). 2 {{'[Word-2.docx]()'| markdownify }} - + 0.46 50 {{'[Word-50.docx]()'| markdownify }} - + 3.2 100 {{'[Word-100.docx]()'| markdownify }} - + 5.3 500 {{'[Word-500.docx]()'| markdownify }} - + 19.5 You can find the sample used for this performance evaluation on [GitHub](). -You can also explore performance benchmarks for [Word to PDF](https://help.syncfusion.com/document-processing/word-framework/conversions/word-to-pdf/net/performance-metrics) and [Word to Image](https://help.syncfusion.com/document-processing/word-framework/conversions/word-to-image/net/performance-metrics) conversions. \ No newline at end of file From 4bc5a1ccd5d609f3ba3a3cdfbf33c371b0d087a5 Mon Sep 17 00:00:00 2001 From: Karan-SF4772 Date: Wed, 29 Oct 2025 13:45:40 +0530 Subject: [PATCH 117/163] Added Github sample link --- .../Word/Conversions/Word-To-Image/NET/Performance-metrics.md | 2 +- .../Word/Conversions/Word-To-PDF/NET/Performance-metrics.md | 2 +- .../Word/Word-Library/NET/Performance-metrics.md | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Document-Processing/Word/Conversions/Word-To-Image/NET/Performance-metrics.md b/Document-Processing/Word/Conversions/Word-To-Image/NET/Performance-metrics.md index 1bdb7c1a8..f306f27e1 100644 --- a/Document-Processing/Word/Conversions/Word-To-Image/NET/Performance-metrics.md +++ b/Document-Processing/Word/Conversions/Word-To-Image/NET/Performance-metrics.md @@ -50,4 +50,4 @@ The following system configurations were used for benchmarking: -You can find the sample used for this performance evaluation on [GitHub](). \ No newline at end of file +You can find the sample used for this performance evaluation on [GitHub](https://github.com/SyncfusionExamples/DocIO-Examples/tree/main/Performance-metrices/Word-to-Image). \ No newline at end of file diff --git a/Document-Processing/Word/Conversions/Word-To-PDF/NET/Performance-metrics.md b/Document-Processing/Word/Conversions/Word-To-PDF/NET/Performance-metrics.md index 4cd4b152f..2b00c043f 100644 --- a/Document-Processing/Word/Conversions/Word-To-PDF/NET/Performance-metrics.md +++ b/Document-Processing/Word/Conversions/Word-To-PDF/NET/Performance-metrics.md @@ -50,4 +50,4 @@ The following system configurations were used for benchmarking: -You can find the sample used for this performance evaluation on [GitHub](). +You can find the sample used for this performance evaluation on [GitHub](https://github.com/SyncfusionExamples/DocIO-Examples/tree/main/Performance-metrices/Word-to-PDF). diff --git a/Document-Processing/Word/Word-Library/NET/Performance-metrics.md b/Document-Processing/Word/Word-Library/NET/Performance-metrics.md index a4691030e..20a312e35 100644 --- a/Document-Processing/Word/Word-Library/NET/Performance-metrics.md +++ b/Document-Processing/Word/Word-Library/NET/Performance-metrics.md @@ -50,7 +50,7 @@ The following system configurations were used for benchmarking: -You can find the sample used for this performance evaluation on [GitHub](). +You can find the sample used for this performance evaluation on [GitHub](https://github.com/SyncfusionExamples/DocIO-Examples/tree/main/Performance-metrices/Open-and-save). ## Clone and merge execution @@ -82,5 +82,5 @@ You can find the sample used for this performance evaluation on [GitHub](). -You can find the sample used for this performance evaluation on [GitHub](). +You can find the sample used for this performance evaluation on [GitHub](https://github.com/SyncfusionExamples/DocIO-Examples/tree/main/Performance-metrices/Clone-and-merge). From 57f033b8ee3731805fe9b2aa01dfb0038709bf82 Mon Sep 17 00:00:00 2001 From: Karan-SF4772 Date: Wed, 29 Oct 2025 13:59:13 +0530 Subject: [PATCH 118/163] 965409 - Added Notes in Working with fields --- .../Word/Word-Library/NET/Working-with-Fields.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Document-Processing/Word/Word-Library/NET/Working-with-Fields.md b/Document-Processing/Word/Word-Library/NET/Working-with-Fields.md index 2ad1a3cb5..917a71a8d 100644 --- a/Document-Processing/Word/Word-Library/NET/Working-with-Fields.md +++ b/Document-Processing/Word/Word-Library/NET/Working-with-Fields.md @@ -25,6 +25,8 @@ From v16.1.0.24, the entire field code is included in Document Object Model(DOM) Find more information about migration changes [here](https://help.syncfusion.com/document-processing/release-notes/migratingtov16.1.0.24) +N> The document may contain `IncludePicture` fields. These fields are designed to dynamically insert images by referencing external URLs. Each time such a field is encountered, the corresponding image is downloaded from the specified URL. This process significantly increases the time required to process and save the document. We recommend replacing these dynamic `IncludePicture` fields with standard image insertions. This approach eliminates the need for repeated external image downloads and allows the document to be saved in minimal time, ensuring optimal performance. + ## Adding fields You can add a field to a Word document by using the [AppendField](https://help.syncfusion.com/cr/document-processing/Syncfusion.DocIO.DLS.WParagraph.html#Syncfusion_DocIO_DLS_WParagraph_AppendField_System_String_Syncfusion_DocIO_FieldType_) method of [WParagraph](https://help.syncfusion.com/cr/document-processing/Syncfusion.DocIO.DLS.WParagraph.html) class. @@ -255,7 +257,7 @@ The following are the known limitations: * Updating of NUMPAGES field and Cross Reference field with Page number and Paragraph number options are not supported in Silverlight, WinRT, Universal, and Windows Phone applications. * Currently group shapes, drawing canvas, and table auto resizing are not supported in Word to PDF layouting, and this may lead to update incorrect page number and total number of pages. -N> In ASP.NET Core, Blazor, Xamarin, WinUI and .NET MAUI platforms, to update fields like Page and NumPages in a Word document, pass true to the UpdateDocumentFields() method and reference the Word to PDF [assemblies](https://help.syncfusion.com/document-processing/word/word-library/net/assemblies-required#converting-word-document-to-pdf) or [NuGet](https://help.syncfusion.com/document-processing/word/word-library/net/nuget-packages-required#converting-word-document-to-pdf) packagesin your application. +N> In ASP.NET Core, Blazor, Xamarin, WinUI and .NET MAUI platforms, to update fields like Page and NumPages in a Word document, pass true to the UpdateDocumentFields() method and reference the Word to PDF [assemblies](https://help.syncfusion.com/document-processing/word/word-library/net/assemblies-required#converting-word-document-to-pdf) or [NuGet](https://help.syncfusion.com/document-processing/word/word-library/net/nuget-packages-required#converting-word-document-to-pdf) packages in your application. The following code example explains how to update the fields present in Word document. From 86e589073771a3d1ad64144d2b0c723fa0607cfe Mon Sep 17 00:00:00 2001 From: Karan-SF4772 Date: Wed, 29 Oct 2025 14:05:41 +0530 Subject: [PATCH 119/163] Update Document hyperlink --- .../Word-To-Image/NET/Performance-metrics.md | 8 ++++---- .../Word-To-PDF/NET/Performance-metrics.md | 8 ++++---- .../Word/Word-Library/NET/Performance-metrics.md | 16 ++++++++-------- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/Document-Processing/Word/Conversions/Word-To-Image/NET/Performance-metrics.md b/Document-Processing/Word/Conversions/Word-To-Image/NET/Performance-metrics.md index f306f27e1..b15c191c1 100644 --- a/Document-Processing/Word/Conversions/Word-To-Image/NET/Performance-metrics.md +++ b/Document-Processing/Word/Conversions/Word-To-Image/NET/Performance-metrics.md @@ -30,22 +30,22 @@ The following system configurations were used for benchmarking: 2 - {{'[Word-2.docx]()'| markdownify }} + {{'[Word-2.docx](https://github.com/SyncfusionExamples/DocIO-Examples/blob/main/Performance-metrices/Word-to-Image/.NET/Word-document-to-image/Word-document-to-image/Data/Document-2.docx)'| markdownify }} 0.77 50 - {{'[Word-50.docx]()'| markdownify }} + {{'[Word-50.docx](https://github.com/SyncfusionExamples/DocIO-Examples/blob/main/Performance-metrices/Word-to-Image/.NET/Word-document-to-image/Word-document-to-image/Data/Document-50.docx)'| markdownify }} 9.6 100 - {{'[Word-100.docx]()'| markdownify }} + {{'[Word-100.docx](https://github.com/SyncfusionExamples/DocIO-Examples/blob/main/Performance-metrices/Word-to-Image/.NET/Word-document-to-image/Word-document-to-image/Data/Document-100.docx)'| markdownify }} 13.9 500 - {{'[Word-500.docx]()'| markdownify }} + {{'[Word-500.docx](https://github.com/SyncfusionExamples/DocIO-Examples/blob/main/Performance-metrices/Word-to-Image/.NET/Word-document-to-image/Word-document-to-image/Data/Document-500.docx)'| markdownify }} <49.8/td> diff --git a/Document-Processing/Word/Conversions/Word-To-PDF/NET/Performance-metrics.md b/Document-Processing/Word/Conversions/Word-To-PDF/NET/Performance-metrics.md index 2b00c043f..4fe9e6fd6 100644 --- a/Document-Processing/Word/Conversions/Word-To-PDF/NET/Performance-metrics.md +++ b/Document-Processing/Word/Conversions/Word-To-PDF/NET/Performance-metrics.md @@ -30,22 +30,22 @@ The following system configurations were used for benchmarking: 2 - {{'[Word-2.docx]()'| markdownify }} + {{'[Word-2.docx](https://github.com/SyncfusionExamples/DocIO-Examples/blob/main/Performance-metrices/Word-to-PDF/.NET/Word-to-PDF/Word-to-PDF/Data/Document-2.docx)'| markdownify }} 1.3 50 - {{'[Word-50.docx]()'| markdownify }} + {{'[Word-50.docx](https://github.com/SyncfusionExamples/DocIO-Examples/blob/main/Performance-metrices/Word-to-PDF/.NET/Word-to-PDF/Word-to-PDF/Data/Document-50.docx)'| markdownify }} 8.6 100 - {{'[Word-100.docx]()'| markdownify }} + {{'[Word-100.docx](https://github.com/SyncfusionExamples/DocIO-Examples/blob/main/Performance-metrices/Word-to-PDF/.NET/Word-to-PDF/Word-to-PDF/Data/Document-100.docx)'| markdownify }} 14.2 500 - {{'[Word-500.docx]()'| markdownify }} + {{'[Word-500.docx](https://github.com/SyncfusionExamples/DocIO-Examples/blob/main/Performance-metrices/Word-to-PDF/.NET/Word-to-PDF/Word-to-PDF/Data/Document-500.docx)'| markdownify }} 31.6 diff --git a/Document-Processing/Word/Word-Library/NET/Performance-metrics.md b/Document-Processing/Word/Word-Library/NET/Performance-metrics.md index 20a312e35..c70bd8a23 100644 --- a/Document-Processing/Word/Word-Library/NET/Performance-metrics.md +++ b/Document-Processing/Word/Word-Library/NET/Performance-metrics.md @@ -30,22 +30,22 @@ The following system configurations were used for benchmarking: 2 - {{'[Word-2.docx]()'| markdownify }} + {{'[Word-2.docx](https://github.com/SyncfusionExamples/DocIO-Examples/blob/main/Performance-metrices/Open-and-save/.NET/Open-and-Save-Word-document/Open-and-Save-Word-document/Data/Document-2.docx)'| markdownify }} 0.52 50 - {{'[Word-50.docx]()'| markdownify }} + {{'[Word-50.docx](https://github.com/SyncfusionExamples/DocIO-Examples/blob/main/Performance-metrices/Open-and-save/.NET/Open-and-Save-Word-document/Open-and-Save-Word-document/Data/Document-50.docx)'| markdownify }} 1.3 100 - {{'[Word-100.docx]()'| markdownify }} + {{'[Word-100.docx](https://github.com/SyncfusionExamples/DocIO-Examples/blob/main/Performance-metrices/Open-and-save/.NET/Open-and-Save-Word-document/Open-and-Save-Word-document/Data/Document-100.docx)'| markdownify }} 2.4 500 - {{'[Word-500.docx]()'| markdownify }} + {{'[Word-500.docx](https://github.com/SyncfusionExamples/DocIO-Examples/blob/main/Performance-metrices/Open-and-save/.NET/Open-and-Save-Word-document/Open-and-Save-Word-document/Data/Document-500.docx)'| markdownify }} 4.7 @@ -62,22 +62,22 @@ You can find the sample used for this performance evaluation on [GitHub](https:/ 2 - {{'[Word-2.docx]()'| markdownify }} + {{'[Word-2.docx](https://github.com/SyncfusionExamples/DocIO-Examples/blob/main/Performance-metrices/Clone-and-merge/.NET/Clone-and-merge-word-document/Clone-and-merge-word-document/Data/SourceDocument/Document-2.docx)'| markdownify }} 0.46 50 - {{'[Word-50.docx]()'| markdownify }} + {{'[Word-50.docx](https://github.com/SyncfusionExamples/DocIO-Examples/blob/main/Performance-metrices/Clone-and-merge/.NET/Clone-and-merge-word-document/Clone-and-merge-word-document/Data/SourceDocument/Document-50.docx)'| markdownify }} 3.2 100 - {{'[Word-100.docx]()'| markdownify }} + {{'[Word-100.docx](https://github.com/SyncfusionExamples/DocIO-Examples/blob/main/Performance-metrices/Clone-and-merge/.NET/Clone-and-merge-word-document/Clone-and-merge-word-document/Data/SourceDocument/Document-100.docx)'| markdownify }} 5.3 500 - {{'[Word-500.docx]()'| markdownify }} + {{'[Word-500.docx](https://github.com/SyncfusionExamples/DocIO-Examples/blob/main/Performance-metrices/Clone-and-merge/.NET/Clone-and-merge-word-document/Clone-and-merge-word-document/Data/SourceDocument/Document-500.docx)'| markdownify }} 19.5 From 07cb11d7537859ff8dc08087af350e90c19cf8b4 Mon Sep 17 00:00:00 2001 From: MuralidharanGSF4527 Date: Wed, 29 Oct 2025 16:04:46 +0530 Subject: [PATCH 120/163] 989322: Corrected Navigation Links and Resolved Naming Issues in PDF Viewer --- Document-Processing-toc.html | 302 +++++++-------- .../bookmark.md} | 0 .../hyperlink.md} | 0 .../page-thumbnail.md} | 0 .../page-navigation.md => navigation/page.md} | 0 .../{organize-pdf-events.md => events.md} | 0 ...ize-page-mobile-view.md => mobile-view.md} | 0 .../asp-net-core/organize-pdf/overview.md | 27 ++ ...ganize-page.md => programmatic-support.md} | 0 .../{toolbar-organize-page.md => toolbar.md} | 0 ...ns-organize-page.md => ui-interactions.md} | 0 .../annotation-toolbar.md} | 0 .../custom-toolbar.md | 0 .../form-designer-toolbar.md} | 0 .../mobile-toolbar.md | 0 .../primary-toolbar.md} | 0 .../annotation/annotation-event.md | 2 +- .../annotation/annotations-in-mobile-view.md | 6 +- .../PDF/PDF-Viewer/asp-net-mvc/event.md | 2 +- .../bookmark.md} | 0 .../hyperlink.md} | 0 .../page-thumbnail.md} | 0 .../page-navigation.md => navigation/page.md} | 0 .../{organize-pdf-events.md => events.md} | 0 ...ize-page-mobile-view.md => mobile-view.md} | 0 .../asp-net-mvc/organize-pdf/overview.md | 28 ++ ...ganize-page.md => programmatic-support.md} | 0 .../{toolbar-organize-page.md => toolbar.md} | 0 ...ns-organize-page.md => ui-interactions.md} | 0 .../annotation-toolbar.md} | 0 .../custom-toolbar.md | 0 .../form-designer-toolbar.md} | 0 .../mobile-toolbar.md | 0 .../primary-toolbar.md} | 0 .../javascript-es5/how-to-overview.md | 4 +- .../bookmark.md} | 0 .../hyperlink.md} | 0 .../page-thumbnail.md} | 0 .../page-navigation.md => navigation/page.md} | 0 .../{organize-pdf-events.md => events.md} | 0 ...ize-page-mobile-view.md => mobile-view.md} | 0 .../javascript-es5/organize-pdf/overview.md | 28 ++ ...ganize-page.md => programmatic-support.md} | 0 .../{toolbar-organize-page.md => toolbar.md} | 0 ...ns-organize-page.md => ui-interactions.md} | 0 .../annotation-toolbar.md} | 0 .../custom-toolbar.md | 0 .../form-designer-toolbar.md} | 0 .../mobile-toolbar.md | 0 .../primary-toolbar.md} | 0 .../getting-started-with-server-backed.md | 4 +- .../javascript-es6/getting-started.md | 2 +- .../javascript-es6/how-to-overview.md | 4 +- .../add-annotation-in-text-search-ts.md | 2 +- .../javascript-es6/how-to/add-header-value.md | 2 +- .../how-to/add-save-button-ts.md | 2 +- .../PDF-Viewer/javascript-es6/navigation.md | 2 +- .../bookmark.md} | 0 .../hyperlink.md} | 0 .../page-thumbnail.md} | 0 .../page-navigation.md => navigation/page.md} | 0 .../PDF-Viewer/javascript-es6/organize-pdf.md | 1 - .../{organize-pdf-events.md => events.md} | 0 ...ize-page-mobile-view.md => mobile-view.md} | 0 .../javascript-es6/organize-pdf/overview.md | 28 ++ ...ganize-page.md => programmatic-support.md} | 0 .../{toolbar-organize-page.md => toolbar.md} | 0 ...ns-organize-page.md => ui-interactions.md} | 0 .../PDF/PDF-Viewer/javascript-es6/toolbar.md | 1 - .../annotation-toolbar.md} | 0 .../custom-toolbar.md | 0 .../form-designer-toolbar.md} | 0 .../mobile-toolbar.md | 0 .../primary-toolbar.md} | 0 .../PDF/PDF-Viewer/react/events.md | 348 +++++++++++++----- .../bookmark.md} | 0 .../hyperlink.md} | 0 .../page-thumbnail.md} | 0 .../page-navigation.md => navigation/page.md} | 0 .../{organize-pdf-events.md => events.md} | 0 ...ize-page-mobile-view.md => mobile-view.md} | 0 .../overview.md} | 0 ...ganize-page.md => programmatic-support.md} | 0 .../{toolbar-organize-page.md => toolbar.md} | 0 ...ns-organize-page.md => ui-interactions.md} | 0 .../annotation-toolbar.md} | 0 .../custom-toolbar.md | 0 .../form-designer-toolbar.md} | 0 .../mobile-toolbar.md | 0 .../primary-toolbar.md} | 0 .../PDF-Viewer/vue/how-to/add-save-button.md | 2 +- .../bookmark.md} | 0 .../hyperlink.md} | 0 .../page-thumbnail.md} | 0 .../page-navigation.md => navigation/page.md} | 0 .../{organize-pdf-events.md => events.md} | 0 ...ize-page-mobile-view.md => mobile-view.md} | 0 .../organize-pdf-overview.md | 0 .../PDF-Viewer/vue/organize-pdf/overview.md | 38 ++ ...ganize-page.md => programmatic-support.md} | 0 .../{toolbar-organize-page.md => toolbar.md} | 0 ...ns-organize-page.md => ui-interactions.md} | 0 .../PDF/PDF-Viewer/vue/overview.md | 4 +- .../annotation-toolbar.md} | 0 .../custom-toolbar.md | 0 .../form-designer-toolbar.md} | 0 .../mobile-toolbar.md | 0 .../primary-toolbar.md} | 0 108 files changed, 552 insertions(+), 287 deletions(-) rename Document-Processing/PDF/PDF-Viewer/asp-net-core/{interactive-pdf-navigation/bookmark-navigation.md => navigation/bookmark.md} (100%) rename Document-Processing/PDF/PDF-Viewer/asp-net-core/{interactive-pdf-navigation/hyperlink-navigation.md => navigation/hyperlink.md} (100%) rename Document-Processing/PDF/PDF-Viewer/asp-net-core/{interactive-pdf-navigation/page-thumbnail-navigation.md => navigation/page-thumbnail.md} (100%) rename Document-Processing/PDF/PDF-Viewer/asp-net-core/{interactive-pdf-navigation/page-navigation.md => navigation/page.md} (100%) rename Document-Processing/PDF/PDF-Viewer/asp-net-core/organize-pdf/{organize-pdf-events.md => events.md} (100%) rename Document-Processing/PDF/PDF-Viewer/asp-net-core/organize-pdf/{organize-page-mobile-view.md => mobile-view.md} (100%) create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-core/organize-pdf/overview.md rename Document-Processing/PDF/PDF-Viewer/asp-net-core/organize-pdf/{programmatic-support-for-organize-page.md => programmatic-support.md} (100%) rename Document-Processing/PDF/PDF-Viewer/asp-net-core/organize-pdf/{toolbar-organize-page.md => toolbar.md} (100%) rename Document-Processing/PDF/PDF-Viewer/asp-net-core/organize-pdf/{ui-interactions-organize-page.md => ui-interactions.md} (100%) rename Document-Processing/PDF/PDF-Viewer/asp-net-core/{toolbar-customization/annotation-toolbar-customization.md => toolbar/annotation-toolbar.md} (100%) rename Document-Processing/PDF/PDF-Viewer/asp-net-core/{toolbar-customization => toolbar}/custom-toolbar.md (100%) rename Document-Processing/PDF/PDF-Viewer/asp-net-core/{toolbar-customization/form-designer-toolbar-customization.md => toolbar/form-designer-toolbar.md} (100%) rename Document-Processing/PDF/PDF-Viewer/asp-net-core/{toolbar-customization => toolbar}/mobile-toolbar.md (100%) rename Document-Processing/PDF/PDF-Viewer/asp-net-core/{toolbar-customization/primary-toolbar-customization.md => toolbar/primary-toolbar.md} (100%) rename Document-Processing/PDF/PDF-Viewer/asp-net-mvc/{interactive-pdf-navigation/bookmark-navigation.md => navigation/bookmark.md} (100%) rename Document-Processing/PDF/PDF-Viewer/asp-net-mvc/{interactive-pdf-navigation/hyperlink-navigation.md => navigation/hyperlink.md} (100%) rename Document-Processing/PDF/PDF-Viewer/asp-net-mvc/{interactive-pdf-navigation/page-thumbnail-navigation.md => navigation/page-thumbnail.md} (100%) rename Document-Processing/PDF/PDF-Viewer/asp-net-mvc/{interactive-pdf-navigation/page-navigation.md => navigation/page.md} (100%) rename Document-Processing/PDF/PDF-Viewer/asp-net-mvc/organize-pdf/{organize-pdf-events.md => events.md} (100%) rename Document-Processing/PDF/PDF-Viewer/asp-net-mvc/organize-pdf/{organize-page-mobile-view.md => mobile-view.md} (100%) create mode 100644 Document-Processing/PDF/PDF-Viewer/asp-net-mvc/organize-pdf/overview.md rename Document-Processing/PDF/PDF-Viewer/asp-net-mvc/organize-pdf/{programmatic-support-for-organize-page.md => programmatic-support.md} (100%) rename Document-Processing/PDF/PDF-Viewer/asp-net-mvc/organize-pdf/{toolbar-organize-page.md => toolbar.md} (100%) rename Document-Processing/PDF/PDF-Viewer/asp-net-mvc/organize-pdf/{ui-interactions-organize-page.md => ui-interactions.md} (100%) rename Document-Processing/PDF/PDF-Viewer/asp-net-mvc/{toolbar-customization/annotation-toolbar-customization.md => toolbar/annotation-toolbar.md} (100%) rename Document-Processing/PDF/PDF-Viewer/asp-net-mvc/{toolbar-customization => toolbar}/custom-toolbar.md (100%) rename Document-Processing/PDF/PDF-Viewer/asp-net-mvc/{toolbar-customization/form-designer-toolbar-customization.md => toolbar/form-designer-toolbar.md} (100%) rename Document-Processing/PDF/PDF-Viewer/asp-net-mvc/{toolbar-customization => toolbar}/mobile-toolbar.md (100%) rename Document-Processing/PDF/PDF-Viewer/asp-net-mvc/{toolbar-customization/primary-toolbar-customization.md => toolbar/primary-toolbar.md} (100%) rename Document-Processing/PDF/PDF-Viewer/javascript-es5/{interactive-pdf-navigation/bookmark-navigation.md => navigation/bookmark.md} (100%) rename Document-Processing/PDF/PDF-Viewer/javascript-es5/{interactive-pdf-navigation/hyperlink-navigation.md => navigation/hyperlink.md} (100%) rename Document-Processing/PDF/PDF-Viewer/javascript-es5/{interactive-pdf-navigation/page-thumbnail-navigation.md => navigation/page-thumbnail.md} (100%) rename Document-Processing/PDF/PDF-Viewer/javascript-es5/{interactive-pdf-navigation/page-navigation.md => navigation/page.md} (100%) rename Document-Processing/PDF/PDF-Viewer/javascript-es5/organize-pdf/{organize-pdf-events.md => events.md} (100%) rename Document-Processing/PDF/PDF-Viewer/javascript-es5/organize-pdf/{organize-page-mobile-view.md => mobile-view.md} (100%) create mode 100644 Document-Processing/PDF/PDF-Viewer/javascript-es5/organize-pdf/overview.md rename Document-Processing/PDF/PDF-Viewer/javascript-es5/organize-pdf/{programmatic-support-for-organize-page.md => programmatic-support.md} (100%) rename Document-Processing/PDF/PDF-Viewer/javascript-es5/organize-pdf/{toolbar-organize-page.md => toolbar.md} (100%) rename Document-Processing/PDF/PDF-Viewer/javascript-es5/organize-pdf/{ui-interactions-organize-page.md => ui-interactions.md} (100%) rename Document-Processing/PDF/PDF-Viewer/javascript-es5/{toolbar-customization/annotation-toolbar-customization.md => toolbar/annotation-toolbar.md} (100%) rename Document-Processing/PDF/PDF-Viewer/javascript-es5/{toolbar-customization => toolbar}/custom-toolbar.md (100%) rename Document-Processing/PDF/PDF-Viewer/javascript-es5/{toolbar-customization/form-designer-toolbar-customization.md => toolbar/form-designer-toolbar.md} (100%) rename Document-Processing/PDF/PDF-Viewer/javascript-es5/{toolbar-customization => toolbar}/mobile-toolbar.md (100%) rename Document-Processing/PDF/PDF-Viewer/javascript-es5/{toolbar-customization/primary-toolbar-customization.md => toolbar/primary-toolbar.md} (100%) rename Document-Processing/PDF/PDF-Viewer/javascript-es6/{interactive-pdf-navigation/bookmark-navigation.md => navigation/bookmark.md} (100%) rename Document-Processing/PDF/PDF-Viewer/javascript-es6/{interactive-pdf-navigation/hyperlink-navigation.md => navigation/hyperlink.md} (100%) rename Document-Processing/PDF/PDF-Viewer/javascript-es6/{interactive-pdf-navigation/page-thumbnail-navigation.md => navigation/page-thumbnail.md} (100%) rename Document-Processing/PDF/PDF-Viewer/javascript-es6/{interactive-pdf-navigation/page-navigation.md => navigation/page.md} (100%) rename Document-Processing/PDF/PDF-Viewer/javascript-es6/organize-pdf/{organize-pdf-events.md => events.md} (100%) rename Document-Processing/PDF/PDF-Viewer/javascript-es6/organize-pdf/{organize-page-mobile-view.md => mobile-view.md} (100%) create mode 100644 Document-Processing/PDF/PDF-Viewer/javascript-es6/organize-pdf/overview.md rename Document-Processing/PDF/PDF-Viewer/javascript-es6/organize-pdf/{programmatic-support-for-organize-page.md => programmatic-support.md} (100%) rename Document-Processing/PDF/PDF-Viewer/javascript-es6/organize-pdf/{toolbar-organize-page.md => toolbar.md} (100%) rename Document-Processing/PDF/PDF-Viewer/javascript-es6/organize-pdf/{ui-interactions-organize-page.md => ui-interactions.md} (100%) rename Document-Processing/PDF/PDF-Viewer/javascript-es6/{toolbar-customization/annotation-toolbar-customization.md => toolbar/annotation-toolbar.md} (100%) rename Document-Processing/PDF/PDF-Viewer/javascript-es6/{toolbar-customization => toolbar}/custom-toolbar.md (100%) rename Document-Processing/PDF/PDF-Viewer/javascript-es6/{toolbar-customization/form-designer-toolbar-customization.md => toolbar/form-designer-toolbar.md} (100%) rename Document-Processing/PDF/PDF-Viewer/javascript-es6/{toolbar-customization => toolbar}/mobile-toolbar.md (100%) rename Document-Processing/PDF/PDF-Viewer/javascript-es6/{toolbar-customization/primary-toolbar-customization.md => toolbar/primary-toolbar.md} (100%) rename Document-Processing/PDF/PDF-Viewer/react/{interactive-pdf-navigation/bookmark-navigation.md => navigation/bookmark.md} (100%) rename Document-Processing/PDF/PDF-Viewer/react/{interactive-pdf-navigation/hyperlink-navigation.md => navigation/hyperlink.md} (100%) rename Document-Processing/PDF/PDF-Viewer/react/{interactive-pdf-navigation/page-thumbnail-navigation.md => navigation/page-thumbnail.md} (100%) rename Document-Processing/PDF/PDF-Viewer/react/{interactive-pdf-navigation/page-navigation.md => navigation/page.md} (100%) rename Document-Processing/PDF/PDF-Viewer/react/organize-pdf/{organize-pdf-events.md => events.md} (100%) rename Document-Processing/PDF/PDF-Viewer/react/organize-pdf/{organize-page-mobile-view.md => mobile-view.md} (100%) rename Document-Processing/PDF/PDF-Viewer/react/{organize-pdf-overview.md => organize-pdf/overview.md} (100%) rename Document-Processing/PDF/PDF-Viewer/react/organize-pdf/{programmatic-support-for-organize-page.md => programmatic-support.md} (100%) rename Document-Processing/PDF/PDF-Viewer/react/organize-pdf/{toolbar-organize-page.md => toolbar.md} (100%) rename Document-Processing/PDF/PDF-Viewer/react/organize-pdf/{ui-interactions-organize-page.md => ui-interactions.md} (100%) rename Document-Processing/PDF/PDF-Viewer/react/{toolbar-customization/annotation-toolbar-customization.md => toolbar/annotation-toolbar.md} (100%) rename Document-Processing/PDF/PDF-Viewer/react/{toolbar-customization => toolbar}/custom-toolbar.md (100%) rename Document-Processing/PDF/PDF-Viewer/react/{toolbar-customization/form-designer-toolbar-customization.md => toolbar/form-designer-toolbar.md} (100%) rename Document-Processing/PDF/PDF-Viewer/react/{toolbar-customization => toolbar}/mobile-toolbar.md (100%) rename Document-Processing/PDF/PDF-Viewer/react/{toolbar-customization/primary-toolbar-customization.md => toolbar/primary-toolbar.md} (100%) rename Document-Processing/PDF/PDF-Viewer/vue/{interactive-pdf-navigation/bookmark-navigation.md => navigation/bookmark.md} (100%) rename Document-Processing/PDF/PDF-Viewer/vue/{interactive-pdf-navigation/hyperlink-navigation.md => navigation/hyperlink.md} (100%) rename Document-Processing/PDF/PDF-Viewer/vue/{interactive-pdf-navigation/page-thumbnail-navigation.md => navigation/page-thumbnail.md} (100%) rename Document-Processing/PDF/PDF-Viewer/vue/{interactive-pdf-navigation/page-navigation.md => navigation/page.md} (100%) rename Document-Processing/PDF/PDF-Viewer/vue/organize-pdf/{organize-pdf-events.md => events.md} (100%) rename Document-Processing/PDF/PDF-Viewer/vue/organize-pdf/{organize-page-mobile-view.md => mobile-view.md} (100%) rename Document-Processing/PDF/PDF-Viewer/vue/{ => organize-pdf}/organize-pdf-overview.md (100%) create mode 100644 Document-Processing/PDF/PDF-Viewer/vue/organize-pdf/overview.md rename Document-Processing/PDF/PDF-Viewer/vue/organize-pdf/{programmatic-support-for-organize-page.md => programmatic-support.md} (100%) rename Document-Processing/PDF/PDF-Viewer/vue/organize-pdf/{toolbar-organize-page.md => toolbar.md} (100%) rename Document-Processing/PDF/PDF-Viewer/vue/organize-pdf/{ui-interactions-organize-page.md => ui-interactions.md} (100%) rename Document-Processing/PDF/PDF-Viewer/vue/{toolbar-customization/annotation-toolbar-customization.md => toolbar/annotation-toolbar.md} (100%) rename Document-Processing/PDF/PDF-Viewer/vue/{toolbar-customization => toolbar}/custom-toolbar.md (100%) rename Document-Processing/PDF/PDF-Viewer/vue/{toolbar-customization/form-designer-toolbar-customization.md => toolbar/form-designer-toolbar.md} (100%) rename Document-Processing/PDF/PDF-Viewer/vue/{toolbar-customization => toolbar}/mobile-toolbar.md (100%) rename Document-Processing/PDF/PDF-Viewer/vue/{toolbar-customization/primary-toolbar-customization.md => toolbar/primary-toolbar.md} (100%) diff --git a/Document-Processing-toc.html b/Document-Processing-toc.html index 984a51eb3..9f8599f71 100644 --- a/Document-Processing-toc.html +++ b/Document-Processing-toc.html @@ -137,25 +137,23 @@
                • Toolbar Customization
                • -
                • Interactive PDF Navigation +
                • Interactive PDF Navigation
                • Accessibility
                • -
                • Toolbar
                • -
                • Navigation
                • Magnification
                • Text Search
                • Annotation @@ -179,20 +177,20 @@
                • Form Filling
                • -
                • Organize Pages +
                • Organize Pages
                • Print
                • @@ -271,8 +269,7 @@
                • ASP.NET MVC
                    -
                  • - Getting Started +
                  • Getting Started
                  • -
                  • Toolbar Customization +
                  • Toolbar Customization
                  • -
                  • Interactive PDF Navigation +
                  • Interactive PDF Navigation
                  • Accessibility
                  • -
                  • Toolbar
                  • -
                  • Navigation
                  • Magnification
                  • Text Search
                  • -
                  • - Annotation +
                  • Annotation
                  • Interaction Mode
                  • -
                  • - Form Designer +
                  • Form Designer
                  • Form Filling
                  • -
                  • Organize Pages +
                  • Organize Pages
                  • -
                  • Organize Pages
                  • Print
                  • Download
                  • Event
                  • Globalization
                  • Server Actions
                  • -
                  • - How To +
                  • How To
                  • -
                  • - Troubleshooting +
                  • Troubleshooting @@ -742,8 +732,7 @@
                  • React
                      -
                    • - Getting Started +
                    • Getting Started
                    • -
                    • - Troubleshooting +
                    • Troubleshooting
                    • Accessibility
                    • -
                    • Toolbar
                    • -
                    • Navigation
                    • -
                    • Toolbar Customization +
                    • Toolbar Customization
                    • Interactive PDF Navigation
                    • Magnification
                    • @@ -990,23 +970,22 @@
                    • Form Filling
                    • -
                    • Organize Pages +
                    • Organize Pages
                    • -
                    • Organize Pages
                    • Print
                    • Download
                    • Events
                    • @@ -1080,8 +1059,7 @@
                    • JavaScript (ES5)
                        -
                      • - Getting Started +
                      • Getting Started
                      • -
                      • - Save PDF files +
                      • Save PDF files
                      • -
                      • Toolbar
                      • -
                      • Toolbar Customization +
                      • Toolbar Customization
                      • Interactive PDF Navigation
                      • Magnification
                      • Accessibility
                      • Text Search
                      • -
                      • - Annotation +
                      • Annotation
                      • Interaction Mode
                      • -
                      • - Form Designer +
                      • Form Designer
                      • Form Filling
                      • -
                      • Organize Pages +
                      • Organize Pages
                      • -
                      • Organize Pages
                      • Print
                      • Download
                      • Event
                      • Text Selection
                      • Globalization
                      • Migration from Essential JS 1
                      • -
                      • - Server Deployment +
                      • Server Deployment
                      • -
                      • - Troubleshooting +
                      • Troubleshooting
                      • -
                      • - Style and Appearance +
                      • Style and Appearance
                      • -
                      • Toolbar
                      • -
                      • Navigation
                      • -
                      • Toolbar Customization +
                      • Toolbar Customization
                      • Interactive PDF Navigation
                      • Magnification
                      • @@ -1346,23 +1313,22 @@
                      • Form Filling
                      • -
                      • Organize Pages +
                      • Organize Pages
                      • -
                      • Organize Pages
                      • Print
                      • Download
                      • Event
                      • diff --git a/Document-Processing/PDF/PDF-Viewer/asp-net-core/interactive-pdf-navigation/bookmark-navigation.md b/Document-Processing/PDF/PDF-Viewer/asp-net-core/navigation/bookmark.md similarity index 100% rename from Document-Processing/PDF/PDF-Viewer/asp-net-core/interactive-pdf-navigation/bookmark-navigation.md rename to Document-Processing/PDF/PDF-Viewer/asp-net-core/navigation/bookmark.md diff --git a/Document-Processing/PDF/PDF-Viewer/asp-net-core/interactive-pdf-navigation/hyperlink-navigation.md b/Document-Processing/PDF/PDF-Viewer/asp-net-core/navigation/hyperlink.md similarity index 100% rename from Document-Processing/PDF/PDF-Viewer/asp-net-core/interactive-pdf-navigation/hyperlink-navigation.md rename to Document-Processing/PDF/PDF-Viewer/asp-net-core/navigation/hyperlink.md diff --git a/Document-Processing/PDF/PDF-Viewer/asp-net-core/interactive-pdf-navigation/page-thumbnail-navigation.md b/Document-Processing/PDF/PDF-Viewer/asp-net-core/navigation/page-thumbnail.md similarity index 100% rename from Document-Processing/PDF/PDF-Viewer/asp-net-core/interactive-pdf-navigation/page-thumbnail-navigation.md rename to Document-Processing/PDF/PDF-Viewer/asp-net-core/navigation/page-thumbnail.md diff --git a/Document-Processing/PDF/PDF-Viewer/asp-net-core/interactive-pdf-navigation/page-navigation.md b/Document-Processing/PDF/PDF-Viewer/asp-net-core/navigation/page.md similarity index 100% rename from Document-Processing/PDF/PDF-Viewer/asp-net-core/interactive-pdf-navigation/page-navigation.md rename to Document-Processing/PDF/PDF-Viewer/asp-net-core/navigation/page.md diff --git a/Document-Processing/PDF/PDF-Viewer/asp-net-core/organize-pdf/organize-pdf-events.md b/Document-Processing/PDF/PDF-Viewer/asp-net-core/organize-pdf/events.md similarity index 100% rename from Document-Processing/PDF/PDF-Viewer/asp-net-core/organize-pdf/organize-pdf-events.md rename to Document-Processing/PDF/PDF-Viewer/asp-net-core/organize-pdf/events.md diff --git a/Document-Processing/PDF/PDF-Viewer/asp-net-core/organize-pdf/organize-page-mobile-view.md b/Document-Processing/PDF/PDF-Viewer/asp-net-core/organize-pdf/mobile-view.md similarity index 100% rename from Document-Processing/PDF/PDF-Viewer/asp-net-core/organize-pdf/organize-page-mobile-view.md rename to Document-Processing/PDF/PDF-Viewer/asp-net-core/organize-pdf/mobile-view.md diff --git a/Document-Processing/PDF/PDF-Viewer/asp-net-core/organize-pdf/overview.md b/Document-Processing/PDF/PDF-Viewer/asp-net-core/organize-pdf/overview.md new file mode 100644 index 000000000..2459a94a3 --- /dev/null +++ b/Document-Processing/PDF/PDF-Viewer/asp-net-core/organize-pdf/overview.md @@ -0,0 +1,27 @@ +--- +layout: post +title: Organize Pages in ASP.NET Core PDF Viewer control | Syncfusion +description: Learn here all about Organize Pages in Syncfusion ASP.NET Core PDF Viewer control of Syncfusion Essential JS 2 and more. +platform: document-processing +control: PDF Viewer +documentation: ug +domainurl: ##DomainURL## +--- + +# Organize Pages in ASP.NET Core PDF Viewer control + +The PDF Viewer allows you to manage your PDF documents efficiently by organizing pages seamlessly. Whether you need to add new pages, remove unnecessary ones, rotate pages, move pages within the document, and copy or duplicate pages, the PDF Viewer facilitates these tasks effortlessly. + +The Organize Pages feature provides the following options: + +* **Rotate pages**: You can adjust the orientation of PDF pages to ensure proper alignment. +* **Rearrange pages**: You can easily change the sequence of pages within your document. +* **Insert new pages**: Effortlessly add new blank pages to your document. +* **Delete pages**: Removing unwanted pages from your document is straightforward. +* **Copy pages**: Duplicate the pages within your PDF document effortlessly. +* **Import a PDF Document**: Seamlessly import a PDF document into your existing document. +* **Select all pages**: Make comprehensive adjustments by selecting all pages simultaneously. +* **Real-time updates**: Witness instant changes in page organization reflected within the PDF Viewer. Simply click the **Save** button to preserve your modifications. +* **SaveAs functionality**: Safeguard your edits by utilizing the **Save As** feature. This enables you to download the modified version of the PDF document for future reference, ensuring that your changes are securely stored. + +To access the organize pages feature, simply open the PDF document in the PDF Viewer and navigate to the left vertical toolbar. Look for the `Organize Pages` option to begin utilizing these capabilities. diff --git a/Document-Processing/PDF/PDF-Viewer/asp-net-core/organize-pdf/programmatic-support-for-organize-page.md b/Document-Processing/PDF/PDF-Viewer/asp-net-core/organize-pdf/programmatic-support.md similarity index 100% rename from Document-Processing/PDF/PDF-Viewer/asp-net-core/organize-pdf/programmatic-support-for-organize-page.md rename to Document-Processing/PDF/PDF-Viewer/asp-net-core/organize-pdf/programmatic-support.md diff --git a/Document-Processing/PDF/PDF-Viewer/asp-net-core/organize-pdf/toolbar-organize-page.md b/Document-Processing/PDF/PDF-Viewer/asp-net-core/organize-pdf/toolbar.md similarity index 100% rename from Document-Processing/PDF/PDF-Viewer/asp-net-core/organize-pdf/toolbar-organize-page.md rename to Document-Processing/PDF/PDF-Viewer/asp-net-core/organize-pdf/toolbar.md diff --git a/Document-Processing/PDF/PDF-Viewer/asp-net-core/organize-pdf/ui-interactions-organize-page.md b/Document-Processing/PDF/PDF-Viewer/asp-net-core/organize-pdf/ui-interactions.md similarity index 100% rename from Document-Processing/PDF/PDF-Viewer/asp-net-core/organize-pdf/ui-interactions-organize-page.md rename to Document-Processing/PDF/PDF-Viewer/asp-net-core/organize-pdf/ui-interactions.md diff --git a/Document-Processing/PDF/PDF-Viewer/asp-net-core/toolbar-customization/annotation-toolbar-customization.md b/Document-Processing/PDF/PDF-Viewer/asp-net-core/toolbar/annotation-toolbar.md similarity index 100% rename from Document-Processing/PDF/PDF-Viewer/asp-net-core/toolbar-customization/annotation-toolbar-customization.md rename to Document-Processing/PDF/PDF-Viewer/asp-net-core/toolbar/annotation-toolbar.md diff --git a/Document-Processing/PDF/PDF-Viewer/asp-net-core/toolbar-customization/custom-toolbar.md b/Document-Processing/PDF/PDF-Viewer/asp-net-core/toolbar/custom-toolbar.md similarity index 100% rename from Document-Processing/PDF/PDF-Viewer/asp-net-core/toolbar-customization/custom-toolbar.md rename to Document-Processing/PDF/PDF-Viewer/asp-net-core/toolbar/custom-toolbar.md diff --git a/Document-Processing/PDF/PDF-Viewer/asp-net-core/toolbar-customization/form-designer-toolbar-customization.md b/Document-Processing/PDF/PDF-Viewer/asp-net-core/toolbar/form-designer-toolbar.md similarity index 100% rename from Document-Processing/PDF/PDF-Viewer/asp-net-core/toolbar-customization/form-designer-toolbar-customization.md rename to Document-Processing/PDF/PDF-Viewer/asp-net-core/toolbar/form-designer-toolbar.md diff --git a/Document-Processing/PDF/PDF-Viewer/asp-net-core/toolbar-customization/mobile-toolbar.md b/Document-Processing/PDF/PDF-Viewer/asp-net-core/toolbar/mobile-toolbar.md similarity index 100% rename from Document-Processing/PDF/PDF-Viewer/asp-net-core/toolbar-customization/mobile-toolbar.md rename to Document-Processing/PDF/PDF-Viewer/asp-net-core/toolbar/mobile-toolbar.md diff --git a/Document-Processing/PDF/PDF-Viewer/asp-net-core/toolbar-customization/primary-toolbar-customization.md b/Document-Processing/PDF/PDF-Viewer/asp-net-core/toolbar/primary-toolbar.md similarity index 100% rename from Document-Processing/PDF/PDF-Viewer/asp-net-core/toolbar-customization/primary-toolbar-customization.md rename to Document-Processing/PDF/PDF-Viewer/asp-net-core/toolbar/primary-toolbar.md diff --git a/Document-Processing/PDF/PDF-Viewer/asp-net-mvc/annotation/annotation-event.md b/Document-Processing/PDF/PDF-Viewer/asp-net-mvc/annotation/annotation-event.md index a0edf9e94..47516ed67 100644 --- a/Document-Processing/PDF/PDF-Viewer/asp-net-mvc/annotation/annotation-event.md +++ b/Document-Processing/PDF/PDF-Viewer/asp-net-mvc/annotation/annotation-event.md @@ -6,7 +6,7 @@ control: PDF Viewer documentation: ug --- -# Annotations Events in ASP.NET MVC Pdf viewer control +# Annotations Events in ASP.NET MVC PDF Viewer control The PDF Viewer component triggers various events based on user interactions and changes in the component's state. These events can be used to perform actions when a specific event occurs. This section describes the events available in the PDF Viewer component. diff --git a/Document-Processing/PDF/PDF-Viewer/asp-net-mvc/annotation/annotations-in-mobile-view.md b/Document-Processing/PDF/PDF-Viewer/asp-net-mvc/annotation/annotations-in-mobile-view.md index 363e10ff5..81c6ef36a 100644 --- a/Document-Processing/PDF/PDF-Viewer/asp-net-mvc/annotation/annotations-in-mobile-view.md +++ b/Document-Processing/PDF/PDF-Viewer/asp-net-mvc/annotation/annotations-in-mobile-view.md @@ -1,12 +1,12 @@ --- layout: post -title: Annotations in mobile view in ASP.NET MVC Pdf viewer | Syncfusion -description: Learn here all about Annotations in mobile view in Syncfusion ASP.NET MVC Pdf viewer control of Syncfusion Essential JS 2 and more. +title: Annotations in mobile view in ASP.NET MVC PDF Viewer | Syncfusion +description: Learn here all about Annotations in mobile view in Syncfusion ASP.NET MVC PDF Viewer control of Syncfusion Essential JS 2 and more. platform: document-processing control: Annotations in mobile view documentation: ug --- -# Annotations in mobile view in ASP.NET MVC Pdf viewer control +# Annotations in mobile view in ASP.NET MVC PDF Viewer control ## To Open the Annotation Toolbar diff --git a/Document-Processing/PDF/PDF-Viewer/asp-net-mvc/event.md b/Document-Processing/PDF/PDF-Viewer/asp-net-mvc/event.md index a4ecdc46a..b89042f14 100644 --- a/Document-Processing/PDF/PDF-Viewer/asp-net-mvc/event.md +++ b/Document-Processing/PDF/PDF-Viewer/asp-net-mvc/event.md @@ -6,7 +6,7 @@ control: PDF Viewer documentation: ug --- -# Events in ASP.NET MVC Pdf viewer control +# Events in ASP.NET MVC PDF Viewer control The PDF Viewer component triggers events for creation, page navigation, document life cycle, context menu interactions, comments, bookmarks, downloads/exports, hyperlinks, import/export of annotations, keyboard commands, printing, signatures, text search, and text selection. Use these events to integrate custom logic into your application workflows. diff --git a/Document-Processing/PDF/PDF-Viewer/asp-net-mvc/interactive-pdf-navigation/bookmark-navigation.md b/Document-Processing/PDF/PDF-Viewer/asp-net-mvc/navigation/bookmark.md similarity index 100% rename from Document-Processing/PDF/PDF-Viewer/asp-net-mvc/interactive-pdf-navigation/bookmark-navigation.md rename to Document-Processing/PDF/PDF-Viewer/asp-net-mvc/navigation/bookmark.md diff --git a/Document-Processing/PDF/PDF-Viewer/asp-net-mvc/interactive-pdf-navigation/hyperlink-navigation.md b/Document-Processing/PDF/PDF-Viewer/asp-net-mvc/navigation/hyperlink.md similarity index 100% rename from Document-Processing/PDF/PDF-Viewer/asp-net-mvc/interactive-pdf-navigation/hyperlink-navigation.md rename to Document-Processing/PDF/PDF-Viewer/asp-net-mvc/navigation/hyperlink.md diff --git a/Document-Processing/PDF/PDF-Viewer/asp-net-mvc/interactive-pdf-navigation/page-thumbnail-navigation.md b/Document-Processing/PDF/PDF-Viewer/asp-net-mvc/navigation/page-thumbnail.md similarity index 100% rename from Document-Processing/PDF/PDF-Viewer/asp-net-mvc/interactive-pdf-navigation/page-thumbnail-navigation.md rename to Document-Processing/PDF/PDF-Viewer/asp-net-mvc/navigation/page-thumbnail.md diff --git a/Document-Processing/PDF/PDF-Viewer/asp-net-mvc/interactive-pdf-navigation/page-navigation.md b/Document-Processing/PDF/PDF-Viewer/asp-net-mvc/navigation/page.md similarity index 100% rename from Document-Processing/PDF/PDF-Viewer/asp-net-mvc/interactive-pdf-navigation/page-navigation.md rename to Document-Processing/PDF/PDF-Viewer/asp-net-mvc/navigation/page.md diff --git a/Document-Processing/PDF/PDF-Viewer/asp-net-mvc/organize-pdf/organize-pdf-events.md b/Document-Processing/PDF/PDF-Viewer/asp-net-mvc/organize-pdf/events.md similarity index 100% rename from Document-Processing/PDF/PDF-Viewer/asp-net-mvc/organize-pdf/organize-pdf-events.md rename to Document-Processing/PDF/PDF-Viewer/asp-net-mvc/organize-pdf/events.md diff --git a/Document-Processing/PDF/PDF-Viewer/asp-net-mvc/organize-pdf/organize-page-mobile-view.md b/Document-Processing/PDF/PDF-Viewer/asp-net-mvc/organize-pdf/mobile-view.md similarity index 100% rename from Document-Processing/PDF/PDF-Viewer/asp-net-mvc/organize-pdf/organize-page-mobile-view.md rename to Document-Processing/PDF/PDF-Viewer/asp-net-mvc/organize-pdf/mobile-view.md diff --git a/Document-Processing/PDF/PDF-Viewer/asp-net-mvc/organize-pdf/overview.md b/Document-Processing/PDF/PDF-Viewer/asp-net-mvc/organize-pdf/overview.md new file mode 100644 index 000000000..2f8a73256 --- /dev/null +++ b/Document-Processing/PDF/PDF-Viewer/asp-net-mvc/organize-pdf/overview.md @@ -0,0 +1,28 @@ +--- +layout: post +title: Organize pages in ASP.NET MVC PDF Viewer | Syncfusion +description: Learn how to reorder, rotate, insert, delete, and save pages with the Syncfusion ASP.NET MVC PDF Viewer component. +platform: document-processing +control: PDF Viewer +documentation: ug +domainurl: ##DomainURL## +--- + +# Organize pages in ASP.NET MVC PDF Viewer + +The ASP.NET MVC PDF Viewer component provides an Organize Pages panel that helps you prepare documents before sharing them. Use it to tidy scanned files, move pages into the right order, and duplicate important content without leaving the viewer. + +To open the Organize Pages panel, load a document, ensure that the Organize Pages toolbar item is enabled, and choose **Organize Pages** from the left vertical toolbar. The document must allow page-level edits; otherwise, the toolbar item is hidden. + +The Organize Pages panel supports the following actions: + +* **Rotate pages**: Fix page orientation in 90-degree increments to correct scanned pages. +* **Rearrange pages**: Drag and drop thumbnails to update the reading order. +* **Insert new pages**: Add blank pages at the required position. +* **Delete pages**: Remove pages that are no longer needed. +* **Copy pages**: Duplicate selected pages to reuse content elsewhere in the document. +* **Import a PDF document**: Merge the current document with pages from another PDF file. +* **Select all pages**: Apply bulk actions, such as rotation or deletion, to every page. +* **Save updates**: Review changes in real time and use **Save** or **Save As** to download the revised document. + +After completing the changes, apply them by selecting **Save** to overwrite the current document or **Save As** to download a new copy that retains the updated page order. diff --git a/Document-Processing/PDF/PDF-Viewer/asp-net-mvc/organize-pdf/programmatic-support-for-organize-page.md b/Document-Processing/PDF/PDF-Viewer/asp-net-mvc/organize-pdf/programmatic-support.md similarity index 100% rename from Document-Processing/PDF/PDF-Viewer/asp-net-mvc/organize-pdf/programmatic-support-for-organize-page.md rename to Document-Processing/PDF/PDF-Viewer/asp-net-mvc/organize-pdf/programmatic-support.md diff --git a/Document-Processing/PDF/PDF-Viewer/asp-net-mvc/organize-pdf/toolbar-organize-page.md b/Document-Processing/PDF/PDF-Viewer/asp-net-mvc/organize-pdf/toolbar.md similarity index 100% rename from Document-Processing/PDF/PDF-Viewer/asp-net-mvc/organize-pdf/toolbar-organize-page.md rename to Document-Processing/PDF/PDF-Viewer/asp-net-mvc/organize-pdf/toolbar.md diff --git a/Document-Processing/PDF/PDF-Viewer/asp-net-mvc/organize-pdf/ui-interactions-organize-page.md b/Document-Processing/PDF/PDF-Viewer/asp-net-mvc/organize-pdf/ui-interactions.md similarity index 100% rename from Document-Processing/PDF/PDF-Viewer/asp-net-mvc/organize-pdf/ui-interactions-organize-page.md rename to Document-Processing/PDF/PDF-Viewer/asp-net-mvc/organize-pdf/ui-interactions.md diff --git a/Document-Processing/PDF/PDF-Viewer/asp-net-mvc/toolbar-customization/annotation-toolbar-customization.md b/Document-Processing/PDF/PDF-Viewer/asp-net-mvc/toolbar/annotation-toolbar.md similarity index 100% rename from Document-Processing/PDF/PDF-Viewer/asp-net-mvc/toolbar-customization/annotation-toolbar-customization.md rename to Document-Processing/PDF/PDF-Viewer/asp-net-mvc/toolbar/annotation-toolbar.md diff --git a/Document-Processing/PDF/PDF-Viewer/asp-net-mvc/toolbar-customization/custom-toolbar.md b/Document-Processing/PDF/PDF-Viewer/asp-net-mvc/toolbar/custom-toolbar.md similarity index 100% rename from Document-Processing/PDF/PDF-Viewer/asp-net-mvc/toolbar-customization/custom-toolbar.md rename to Document-Processing/PDF/PDF-Viewer/asp-net-mvc/toolbar/custom-toolbar.md diff --git a/Document-Processing/PDF/PDF-Viewer/asp-net-mvc/toolbar-customization/form-designer-toolbar-customization.md b/Document-Processing/PDF/PDF-Viewer/asp-net-mvc/toolbar/form-designer-toolbar.md similarity index 100% rename from Document-Processing/PDF/PDF-Viewer/asp-net-mvc/toolbar-customization/form-designer-toolbar-customization.md rename to Document-Processing/PDF/PDF-Viewer/asp-net-mvc/toolbar/form-designer-toolbar.md diff --git a/Document-Processing/PDF/PDF-Viewer/asp-net-mvc/toolbar-customization/mobile-toolbar.md b/Document-Processing/PDF/PDF-Viewer/asp-net-mvc/toolbar/mobile-toolbar.md similarity index 100% rename from Document-Processing/PDF/PDF-Viewer/asp-net-mvc/toolbar-customization/mobile-toolbar.md rename to Document-Processing/PDF/PDF-Viewer/asp-net-mvc/toolbar/mobile-toolbar.md diff --git a/Document-Processing/PDF/PDF-Viewer/asp-net-mvc/toolbar-customization/primary-toolbar-customization.md b/Document-Processing/PDF/PDF-Viewer/asp-net-mvc/toolbar/primary-toolbar.md similarity index 100% rename from Document-Processing/PDF/PDF-Viewer/asp-net-mvc/toolbar-customization/primary-toolbar-customization.md rename to Document-Processing/PDF/PDF-Viewer/asp-net-mvc/toolbar/primary-toolbar.md diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to-overview.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to-overview.md index 08b7d57ce..a63574b48 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to-overview.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/how-to-overview.md @@ -1,7 +1,7 @@ --- layout: post -title: FAQ Section in PDF Viewer control | Syncfusion -description: In this section, you can know about the various questions asked about manipulation of in PDF Viewer control. +title: FAQ Section in JavaScript PDF Viewer control | Syncfusion +description: In this section, you can know about the various questions asked about manipulation of JavaScript PDF Viewer control. platform: document-processing control: PDF Viewer documentation: ug diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/interactive-pdf-navigation/bookmark-navigation.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/navigation/bookmark.md similarity index 100% rename from Document-Processing/PDF/PDF-Viewer/javascript-es5/interactive-pdf-navigation/bookmark-navigation.md rename to Document-Processing/PDF/PDF-Viewer/javascript-es5/navigation/bookmark.md diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/interactive-pdf-navigation/hyperlink-navigation.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/navigation/hyperlink.md similarity index 100% rename from Document-Processing/PDF/PDF-Viewer/javascript-es5/interactive-pdf-navigation/hyperlink-navigation.md rename to Document-Processing/PDF/PDF-Viewer/javascript-es5/navigation/hyperlink.md diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/interactive-pdf-navigation/page-thumbnail-navigation.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/navigation/page-thumbnail.md similarity index 100% rename from Document-Processing/PDF/PDF-Viewer/javascript-es5/interactive-pdf-navigation/page-thumbnail-navigation.md rename to Document-Processing/PDF/PDF-Viewer/javascript-es5/navigation/page-thumbnail.md diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/interactive-pdf-navigation/page-navigation.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/navigation/page.md similarity index 100% rename from Document-Processing/PDF/PDF-Viewer/javascript-es5/interactive-pdf-navigation/page-navigation.md rename to Document-Processing/PDF/PDF-Viewer/javascript-es5/navigation/page.md diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/organize-pdf/organize-pdf-events.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/organize-pdf/events.md similarity index 100% rename from Document-Processing/PDF/PDF-Viewer/javascript-es5/organize-pdf/organize-pdf-events.md rename to Document-Processing/PDF/PDF-Viewer/javascript-es5/organize-pdf/events.md diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/organize-pdf/organize-page-mobile-view.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/organize-pdf/mobile-view.md similarity index 100% rename from Document-Processing/PDF/PDF-Viewer/javascript-es5/organize-pdf/organize-page-mobile-view.md rename to Document-Processing/PDF/PDF-Viewer/javascript-es5/organize-pdf/mobile-view.md diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/organize-pdf/overview.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/organize-pdf/overview.md new file mode 100644 index 000000000..5201456a8 --- /dev/null +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es5/organize-pdf/overview.md @@ -0,0 +1,28 @@ +--- +layout: post +title: Organize pages in JavaScript PDF Viewer | Syncfusion +description: Learn how to reorder, rotate, insert, delete, and save pages with the Syncfusion JavaScript PDF Viewer component. +platform: document-processing +control: PDF Viewer +documentation: ug +domainurl: ##DomainURL## +--- + +# Organize pages in JavaScript PDF Viewer + +The JavaScript PDF Viewer component provides an Organize Pages panel that helps you prepare documents before sharing them. Use it to tidy scanned files, move pages into the right order, and duplicate important content without leaving the viewer. + +To open the Organize Pages panel, load a document, ensure that the Organize Pages toolbar item is enabled, and choose **Organize Pages** from the left vertical toolbar. The document must allow page-level edits; otherwise, the toolbar item is hidden. + +The Organize Pages panel supports the following actions: + +* **Rotate pages**: Fix page orientation in 90-degree increments to correct scanned pages. +* **Rearrange pages**: Drag and drop thumbnails to update the reading order. +* **Insert new pages**: Add blank pages at the required position. +* **Delete pages**: Remove pages that are no longer needed. +* **Copy pages**: Duplicate selected pages to reuse content elsewhere in the document. +* **Import a PDF document**: Merge the current document with pages from another PDF file. +* **Select all pages**: Apply bulk actions, such as rotation or deletion, to every page. +* **Save updates**: Review changes in real time and use **Save** or **Save As** to download the revised document. + +After completing the changes, apply them by selecting **Save** to overwrite the current document or **Save As** to download a new copy that retains the updated page order. diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/organize-pdf/programmatic-support-for-organize-page.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/organize-pdf/programmatic-support.md similarity index 100% rename from Document-Processing/PDF/PDF-Viewer/javascript-es5/organize-pdf/programmatic-support-for-organize-page.md rename to Document-Processing/PDF/PDF-Viewer/javascript-es5/organize-pdf/programmatic-support.md diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/organize-pdf/toolbar-organize-page.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/organize-pdf/toolbar.md similarity index 100% rename from Document-Processing/PDF/PDF-Viewer/javascript-es5/organize-pdf/toolbar-organize-page.md rename to Document-Processing/PDF/PDF-Viewer/javascript-es5/organize-pdf/toolbar.md diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/organize-pdf/ui-interactions-organize-page.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/organize-pdf/ui-interactions.md similarity index 100% rename from Document-Processing/PDF/PDF-Viewer/javascript-es5/organize-pdf/ui-interactions-organize-page.md rename to Document-Processing/PDF/PDF-Viewer/javascript-es5/organize-pdf/ui-interactions.md diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/toolbar-customization/annotation-toolbar-customization.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/toolbar/annotation-toolbar.md similarity index 100% rename from Document-Processing/PDF/PDF-Viewer/javascript-es5/toolbar-customization/annotation-toolbar-customization.md rename to Document-Processing/PDF/PDF-Viewer/javascript-es5/toolbar/annotation-toolbar.md diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/toolbar-customization/custom-toolbar.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/toolbar/custom-toolbar.md similarity index 100% rename from Document-Processing/PDF/PDF-Viewer/javascript-es5/toolbar-customization/custom-toolbar.md rename to Document-Processing/PDF/PDF-Viewer/javascript-es5/toolbar/custom-toolbar.md diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/toolbar-customization/form-designer-toolbar-customization.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/toolbar/form-designer-toolbar.md similarity index 100% rename from Document-Processing/PDF/PDF-Viewer/javascript-es5/toolbar-customization/form-designer-toolbar-customization.md rename to Document-Processing/PDF/PDF-Viewer/javascript-es5/toolbar/form-designer-toolbar.md diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/toolbar-customization/mobile-toolbar.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/toolbar/mobile-toolbar.md similarity index 100% rename from Document-Processing/PDF/PDF-Viewer/javascript-es5/toolbar-customization/mobile-toolbar.md rename to Document-Processing/PDF/PDF-Viewer/javascript-es5/toolbar/mobile-toolbar.md diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es5/toolbar-customization/primary-toolbar-customization.md b/Document-Processing/PDF/PDF-Viewer/javascript-es5/toolbar/primary-toolbar.md similarity index 100% rename from Document-Processing/PDF/PDF-Viewer/javascript-es5/toolbar-customization/primary-toolbar-customization.md rename to Document-Processing/PDF/PDF-Viewer/javascript-es5/toolbar/primary-toolbar.md diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es6/getting-started-with-server-backed.md b/Document-Processing/PDF/PDF-Viewer/javascript-es6/getting-started-with-server-backed.md index a59413e33..dcbab9ccb 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es6/getting-started-with-server-backed.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es6/getting-started-with-server-backed.md @@ -1,7 +1,7 @@ --- layout: post -title: Getting Started with PDF Viewer in TypeScript | Syncfusion -description: Set up and use Syncfusion's TypeScript PDF Viewer in server-backed mode with EJ2 quickstart, module injection, and web service configuration. +title: Getting started with TypeScript PDF Viewer (server-backed) | Syncfusion +description: Learn how to set up and use the Syncfusion TypeScript PDF Viewer in server-backed mode using the EJ2 quickstart, including module injection and web service configuration. platform: document-processing control: PDF Viewer documentation: ug diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es6/getting-started.md b/Document-Processing/PDF/PDF-Viewer/javascript-es6/getting-started.md index afd202330..f9882a5ff 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es6/getting-started.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es6/getting-started.md @@ -1,7 +1,7 @@ --- layout: post title: Getting started with TypeScript PDF Viewer (standalone) | Syncfusion -description: Set up Syncfusion's TypeScript PDF Viewer in standalone mode using EJ2 quickstart with local resources and module injection. +description: Learn how to set up and use the Syncfusion TypeScript PDF Viewer in standalone mode using the EJ2 quickstart, including local resource configuration and module injection. platform: document-processing control: PDF Viewer documentation: ug diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es6/how-to-overview.md b/Document-Processing/PDF/PDF-Viewer/javascript-es6/how-to-overview.md index 00f95f3b4..ed5e332c4 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es6/how-to-overview.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es6/how-to-overview.md @@ -1,7 +1,7 @@ --- layout: post -title: Frequently Asked Questions in TypeScript PDF Viewer | Syncfusion -description: In this section, you can know about the various questions asked about manipulation of in TypeScript PDF Viewer control. +title: FAQ Section in PDF Viewer control | Syncfusion +description: In this section, you can know about the various questions asked about manipulation of in PDF Viewer control. platform: document-processing control: PDF Viewer documentation: ug diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es6/how-to/add-annotation-in-text-search-ts.md b/Document-Processing/PDF/PDF-Viewer/javascript-es6/how-to/add-annotation-in-text-search-ts.md index ec25a1438..242ae4271 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es6/how-to/add-annotation-in-text-search-ts.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es6/how-to/add-annotation-in-text-search-ts.md @@ -1,6 +1,6 @@ --- layout: post -title: Add Rectangle Annotation in Text Search in PDF Viewer | Syncfusion +title: Add rectangle annotation from textSearch in TypeScript PDF Viewer | Syncfusion description: Learn to add rectangle annotations using text search bounds in the TypeScript PDF Viewer component, including initialization and search controls. platform: document-processing control: PDF Viewer diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es6/how-to/add-header-value.md b/Document-Processing/PDF/PDF-Viewer/javascript-es6/how-to/add-header-value.md index b26780aa5..72c458256 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es6/how-to/add-header-value.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es6/how-to/add-header-value.md @@ -1,6 +1,6 @@ --- layout: post -title: Add Headers to AJAX Requests in TypeScript PDF Viewer | Syncfusion +title: Add header values to AJAX requests in TypeScript PDF Viewer | Syncfusion description: Learn how to include custom headers in PDF Viewer AJAX requests using ajaxRequestSettings and ajaxHeaders in the TypeScript PDF Viewer component. platform: document-processing control: PDF Viewer diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es6/how-to/add-save-button-ts.md b/Document-Processing/PDF/PDF-Viewer/javascript-es6/how-to/add-save-button-ts.md index 8bd8fc520..2f0c8d3e2 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es6/how-to/add-save-button-ts.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es6/how-to/add-save-button-ts.md @@ -1,6 +1,6 @@ --- layout: post -title: Add Save Button to Toolbar in TypeScript PDF Viewer | Syncfusion +title: Add Save button to the built-in toolbar in TypeScript PDF Viewer | Syncfusion description: Learn how to add, show, hide, enable, and disable a custom Save button in the built-in toolbar of the TypeScript PDF Viewer component. platform: document-processing control: Toolbar diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es6/navigation.md b/Document-Processing/PDF/PDF-Viewer/javascript-es6/navigation.md index f7d888c87..5f3551d1b 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es6/navigation.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es6/navigation.md @@ -1,7 +1,7 @@ --- layout: post title: Navigation in TypeScript PDF Viewer | Syncfusion -description: Learn how to navigate PDF documents using the Syncfusion TypeScript PDF Viewer, including toolbar controls, programmatic navigation, bookmarks, thumbnails, hyperlinks, and table of contents. +description: Learn to navigate PDFs in Syncfusion's TypeScript PDF Viewer using toolbar controls, bookmarks, thumbnails, and hyperlinks. platform: document-processing control: PDF Viewer documentation: ug diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es6/interactive-pdf-navigation/bookmark-navigation.md b/Document-Processing/PDF/PDF-Viewer/javascript-es6/navigation/bookmark.md similarity index 100% rename from Document-Processing/PDF/PDF-Viewer/javascript-es6/interactive-pdf-navigation/bookmark-navigation.md rename to Document-Processing/PDF/PDF-Viewer/javascript-es6/navigation/bookmark.md diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es6/interactive-pdf-navigation/hyperlink-navigation.md b/Document-Processing/PDF/PDF-Viewer/javascript-es6/navigation/hyperlink.md similarity index 100% rename from Document-Processing/PDF/PDF-Viewer/javascript-es6/interactive-pdf-navigation/hyperlink-navigation.md rename to Document-Processing/PDF/PDF-Viewer/javascript-es6/navigation/hyperlink.md diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es6/interactive-pdf-navigation/page-thumbnail-navigation.md b/Document-Processing/PDF/PDF-Viewer/javascript-es6/navigation/page-thumbnail.md similarity index 100% rename from Document-Processing/PDF/PDF-Viewer/javascript-es6/interactive-pdf-navigation/page-thumbnail-navigation.md rename to Document-Processing/PDF/PDF-Viewer/javascript-es6/navigation/page-thumbnail.md diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es6/interactive-pdf-navigation/page-navigation.md b/Document-Processing/PDF/PDF-Viewer/javascript-es6/navigation/page.md similarity index 100% rename from Document-Processing/PDF/PDF-Viewer/javascript-es6/interactive-pdf-navigation/page-navigation.md rename to Document-Processing/PDF/PDF-Viewer/javascript-es6/navigation/page.md diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es6/organize-pdf.md b/Document-Processing/PDF/PDF-Viewer/javascript-es6/organize-pdf.md index fd39dfaf5..3f1c247b2 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es6/organize-pdf.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es6/organize-pdf.md @@ -4,7 +4,6 @@ title: Organize Pages in Typescript PDF Viewer control | Syncfusion description: Learn here all about Organize Pages in Syncfusion Typescript PDF Viewer control of Syncfusion Essential JS 2 and more. platform: document-processing control: PDF Viewer -publishingplatform: Typescript documentation: ug domainurl: ##DomainURL## --- diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es6/organize-pdf/organize-pdf-events.md b/Document-Processing/PDF/PDF-Viewer/javascript-es6/organize-pdf/events.md similarity index 100% rename from Document-Processing/PDF/PDF-Viewer/javascript-es6/organize-pdf/organize-pdf-events.md rename to Document-Processing/PDF/PDF-Viewer/javascript-es6/organize-pdf/events.md diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es6/organize-pdf/organize-page-mobile-view.md b/Document-Processing/PDF/PDF-Viewer/javascript-es6/organize-pdf/mobile-view.md similarity index 100% rename from Document-Processing/PDF/PDF-Viewer/javascript-es6/organize-pdf/organize-page-mobile-view.md rename to Document-Processing/PDF/PDF-Viewer/javascript-es6/organize-pdf/mobile-view.md diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es6/organize-pdf/overview.md b/Document-Processing/PDF/PDF-Viewer/javascript-es6/organize-pdf/overview.md new file mode 100644 index 000000000..547067c80 --- /dev/null +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es6/organize-pdf/overview.md @@ -0,0 +1,28 @@ +--- +layout: post +title: Organize pages in TypeScript PDF Viewer | Syncfusion +description: Learn how to reorder, rotate, insert, delete, and save pages with the Syncfusion TypeScript PDF Viewer component. +platform: document-processing +control: PDF Viewer +documentation: ug +domainurl: ##DomainURL## +--- + +# Organize pages in TypeScript PDF Viewer + +The TypeScript PDF Viewer component provides an Organize Pages panel that helps you prepare documents before sharing them. Use it to tidy scanned files, move pages into the right order, and duplicate important content without leaving the viewer. + +To open the Organize Pages panel, load a document, ensure that the Organize Pages toolbar item is enabled, and choose **Organize Pages** from the left vertical toolbar. The document must allow page-level edits; otherwise, the toolbar item is hidden. + +The Organize Pages panel supports the following actions: + +* **Rotate pages**: Fix page orientation in 90-degree increments to correct scanned pages. +* **Rearrange pages**: Drag and drop thumbnails to update the reading order. +* **Insert new pages**: Add blank pages at the required position. +* **Delete pages**: Remove pages that are no longer needed. +* **Copy pages**: Duplicate selected pages to reuse content elsewhere in the document. +* **Import a PDF document**: Merge the current document with pages from another PDF file. +* **Select all pages**: Apply bulk actions, such as rotation or deletion, to every page. +* **Save updates**: Review changes in real time and use **Save** or **Save As** to download the revised document. + +After completing the changes, apply them by selecting **Save** to overwrite the current document or **Save As** to download a new copy that retains the updated page order. diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es6/organize-pdf/programmatic-support-for-organize-page.md b/Document-Processing/PDF/PDF-Viewer/javascript-es6/organize-pdf/programmatic-support.md similarity index 100% rename from Document-Processing/PDF/PDF-Viewer/javascript-es6/organize-pdf/programmatic-support-for-organize-page.md rename to Document-Processing/PDF/PDF-Viewer/javascript-es6/organize-pdf/programmatic-support.md diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es6/organize-pdf/toolbar-organize-page.md b/Document-Processing/PDF/PDF-Viewer/javascript-es6/organize-pdf/toolbar.md similarity index 100% rename from Document-Processing/PDF/PDF-Viewer/javascript-es6/organize-pdf/toolbar-organize-page.md rename to Document-Processing/PDF/PDF-Viewer/javascript-es6/organize-pdf/toolbar.md diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es6/organize-pdf/ui-interactions-organize-page.md b/Document-Processing/PDF/PDF-Viewer/javascript-es6/organize-pdf/ui-interactions.md similarity index 100% rename from Document-Processing/PDF/PDF-Viewer/javascript-es6/organize-pdf/ui-interactions-organize-page.md rename to Document-Processing/PDF/PDF-Viewer/javascript-es6/organize-pdf/ui-interactions.md diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es6/toolbar.md b/Document-Processing/PDF/PDF-Viewer/javascript-es6/toolbar.md index c4773c112..1bcf9061d 100644 --- a/Document-Processing/PDF/PDF-Viewer/javascript-es6/toolbar.md +++ b/Document-Processing/PDF/PDF-Viewer/javascript-es6/toolbar.md @@ -4,7 +4,6 @@ title: Toolbar in Typescript Pdfviewer control | Syncfusion description: Learn here all about Toolbar in Syncfusion Typescript Pdfviewer control of Syncfusion Essential JS 2 and more. platform: document-processing control: Toolbar -publishingplatform: Typescript documentation: ug domainurl: ##DomainURL## --- diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es6/toolbar-customization/annotation-toolbar-customization.md b/Document-Processing/PDF/PDF-Viewer/javascript-es6/toolbar/annotation-toolbar.md similarity index 100% rename from Document-Processing/PDF/PDF-Viewer/javascript-es6/toolbar-customization/annotation-toolbar-customization.md rename to Document-Processing/PDF/PDF-Viewer/javascript-es6/toolbar/annotation-toolbar.md diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es6/toolbar-customization/custom-toolbar.md b/Document-Processing/PDF/PDF-Viewer/javascript-es6/toolbar/custom-toolbar.md similarity index 100% rename from Document-Processing/PDF/PDF-Viewer/javascript-es6/toolbar-customization/custom-toolbar.md rename to Document-Processing/PDF/PDF-Viewer/javascript-es6/toolbar/custom-toolbar.md diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es6/toolbar-customization/form-designer-toolbar-customization.md b/Document-Processing/PDF/PDF-Viewer/javascript-es6/toolbar/form-designer-toolbar.md similarity index 100% rename from Document-Processing/PDF/PDF-Viewer/javascript-es6/toolbar-customization/form-designer-toolbar-customization.md rename to Document-Processing/PDF/PDF-Viewer/javascript-es6/toolbar/form-designer-toolbar.md diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es6/toolbar-customization/mobile-toolbar.md b/Document-Processing/PDF/PDF-Viewer/javascript-es6/toolbar/mobile-toolbar.md similarity index 100% rename from Document-Processing/PDF/PDF-Viewer/javascript-es6/toolbar-customization/mobile-toolbar.md rename to Document-Processing/PDF/PDF-Viewer/javascript-es6/toolbar/mobile-toolbar.md diff --git a/Document-Processing/PDF/PDF-Viewer/javascript-es6/toolbar-customization/primary-toolbar-customization.md b/Document-Processing/PDF/PDF-Viewer/javascript-es6/toolbar/primary-toolbar.md similarity index 100% rename from Document-Processing/PDF/PDF-Viewer/javascript-es6/toolbar-customization/primary-toolbar-customization.md rename to Document-Processing/PDF/PDF-Viewer/javascript-es6/toolbar/primary-toolbar.md diff --git a/Document-Processing/PDF/PDF-Viewer/react/events.md b/Document-Processing/PDF/PDF-Viewer/react/events.md index d6fece65f..a50101a04 100644 --- a/Document-Processing/PDF/PDF-Viewer/react/events.md +++ b/Document-Processing/PDF/PDF-Viewer/react/events.md @@ -76,7 +76,8 @@ The [bookmarkClick](https://ej2.syncfusion.com/react/documentation/api/pdfviewer Example: -```jsx +{% tabs %} +{% highlight ts tabtitle="index.ts" %} import * as React from 'react'; import * as ReactDOM from 'react-dom/client'; import { PdfViewerComponent, Toolbar, Magnification, Navigation, LinkAnnotation, ThumbnailView, BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer, Inject } from '@syncfusion/ej2-react-pdfviewer'; @@ -101,7 +102,9 @@ function App() { const root = ReactDOM.createRoot(document.getElementById('pdfViewer')); root.render(); -``` + +{% endhighlight %} +{% endtabs %} ## toolbarClick @@ -111,7 +114,8 @@ The [toolbarClick](https://ej2.syncfusion.com/react/documentation/api/pdfviewer/ Example: -```jsx +{% tabs %} +{% highlight ts tabtitle="index.ts" %} import * as React from 'react'; import * as ReactDOM from 'react-dom/client'; import { PdfViewerComponent, Toolbar, Magnification, Navigation, LinkAnnotation, ThumbnailView, BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer, Inject } from '@syncfusion/ej2-react-pdfviewer'; @@ -136,7 +140,9 @@ function App() { const root = ReactDOM.createRoot(document.getElementById('pdfViewer')); root.render(); -``` + +{% endhighlight %} +{% endtabs %} ## validateFormFields @@ -154,7 +160,9 @@ When it triggers Example: -```jsx +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + import * as React from 'react'; import * as ReactDOM from 'react-dom/client'; import { PdfViewerComponent, Toolbar, Magnification, Navigation, LinkAnnotation, ThumbnailView, BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer, Inject } from '@syncfusion/ej2-react-pdfviewer'; @@ -183,7 +191,9 @@ function App() { const root = ReactDOM.createRoot(document.getElementById('pdfViewer')); root.render(); -``` + +{% endhighlight %} +{% endtabs %} Tip - To require a field programmatically, set isRequired: true when creating or editing the field via Form Designer APIs. @@ -196,7 +206,9 @@ The [zoomChange](https://ej2.syncfusion.com/react/documentation/api/pdfviewer/#z Example: -```jsx +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + import * as React from 'react'; import * as ReactDOM from 'react-dom/client'; import { PdfViewerComponent, Toolbar, Magnification, Navigation, LinkAnnotation, ThumbnailView, BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer, Inject } from '@syncfusion/ej2-react-pdfviewer'; @@ -221,7 +233,9 @@ function App() { const root = ReactDOM.createRoot(document.getElementById('pdfViewer')); root.render(); -``` + +{% endhighlight %} +{% endtabs %} ## buttonFieldClick @@ -231,7 +245,9 @@ The [buttonFieldClick](https://ej2.syncfusion.com/react/documentation/api/pdfvie Example: -```jsx +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + import * as React from 'react'; import * as ReactDOM from 'react-dom/client'; import { PdfViewerComponent, Toolbar, Magnification, Navigation, LinkAnnotation, ThumbnailView, BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer, Inject } from '@syncfusion/ej2-react-pdfviewer'; @@ -256,7 +272,8 @@ function App() { const root = ReactDOM.createRoot(document.getElementById('pdfViewer')); root.render(); -``` +{% endhighlight %} +{% endtabs %} ## commentAdd @@ -266,7 +283,9 @@ The [commentAdd](https://ej2.syncfusion.com/react/documentation/api/pdfviewer/#c Example: -```jsx +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + import * as React from 'react'; import * as ReactDOM from 'react-dom/client'; import { PdfViewerComponent, Toolbar, Magnification, Navigation, LinkAnnotation, ThumbnailView, BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer, Inject } from '@syncfusion/ej2-react-pdfviewer'; @@ -291,7 +310,8 @@ function App() { const root = ReactDOM.createRoot(document.getElementById('pdfViewer')); root.render(); -``` +{% endhighlight %} +{% endtabs %} ## commentDelete @@ -301,7 +321,8 @@ The [commentDelete](https://ej2.syncfusion.com/react/documentation/api/pdfviewer Example: -```jsx +{% tabs %} +{% highlight ts tabtitle="index.ts" %} import * as React from 'react'; import * as ReactDOM from 'react-dom/client'; import { PdfViewerComponent, Toolbar, Magnification, Navigation, LinkAnnotation, ThumbnailView, BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer, Inject } from '@syncfusion/ej2-react-pdfviewer'; @@ -326,7 +347,8 @@ function App() { const root = ReactDOM.createRoot(document.getElementById('pdfViewer')); root.render(); -``` +{% endhighlight %} +{% endtabs %} ## commentEdit @@ -336,7 +358,9 @@ The [commentEdit](https://ej2.syncfusion.com/react/documentation/api/pdfviewer/# Example: -```jsx +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + import * as React from 'react'; import * as ReactDOM from 'react-dom/client'; import { PdfViewerComponent, Toolbar, Magnification, Navigation, LinkAnnotation, ThumbnailView, BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer, Inject } from '@syncfusion/ej2-react-pdfviewer'; @@ -361,7 +385,8 @@ function App() { const root = ReactDOM.createRoot(document.getElementById('pdfViewer')); root.render(); -``` +{% endhighlight %} +{% endtabs %} ## commentSelect @@ -371,7 +396,9 @@ The [commentSelect](https://ej2.syncfusion.com/react/documentation/api/pdfviewer Example: -```jsx +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + import * as React from 'react'; import * as ReactDOM from 'react-dom/client'; import { PdfViewerComponent, Toolbar, Magnification, Navigation, LinkAnnotation, ThumbnailView, BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer, Inject } from '@syncfusion/ej2-react-pdfviewer'; @@ -396,7 +423,8 @@ function App() { const root = ReactDOM.createRoot(document.getElementById('pdfViewer')); root.render(); -``` +{% endhighlight %} +{% endtabs %} ## commentStatusChanged @@ -406,7 +434,8 @@ The [commentStatusChanged](https://ej2.syncfusion.com/react/documentation/api/pd Example: -```jsx +{% tabs %} +{% highlight ts tabtitle="index.ts" %} import * as React from 'react'; import * as ReactDOM from 'react-dom/client'; import { PdfViewerComponent, Toolbar, Magnification, Navigation, LinkAnnotation, ThumbnailView, BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer, Inject } from '@syncfusion/ej2-react-pdfviewer'; @@ -431,7 +460,9 @@ function App() { const root = ReactDOM.createRoot(document.getElementById('pdfViewer')); root.render(); -``` + +{% endhighlight %} +{% endtabs %} ## created @@ -441,7 +472,8 @@ The [created](https://ej2.syncfusion.com/react/documentation/api/pdfviewer/#crea Example: -```jsx +{% tabs %} +{% highlight ts tabtitle="index.ts" %} import * as React from 'react'; import * as ReactDOM from 'react-dom/client'; import { PdfViewerComponent, Toolbar, Magnification, Navigation, LinkAnnotation, ThumbnailView, BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer, Inject } from '@syncfusion/ej2-react-pdfviewer'; @@ -466,7 +498,9 @@ function App() { const root = ReactDOM.createRoot(document.getElementById('pdfViewer')); root.render(); -``` + +{% endhighlight %} +{% endtabs %} ## customContextMenuBeforeOpen @@ -478,7 +512,8 @@ The [customContextMenuBeforeOpen](https://ej2.syncfusion.com/react/documentation Example: -```jsx +{% tabs %} +{% highlight ts tabtitle="index.ts" %} import * as React from 'react'; import * as ReactDOM from 'react-dom/client'; import { PdfViewerComponent, Toolbar, Magnification, Navigation, LinkAnnotation, ThumbnailView, BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer, Inject } from '@syncfusion/ej2-react-pdfviewer'; @@ -521,7 +556,9 @@ function App() { const root = ReactDOM.createRoot(document.getElementById('pdfViewer')); root.render(); -``` + +{% endhighlight %} +{% endtabs %} ## customContextMenuSelect @@ -534,7 +571,8 @@ The [customContextMenuSelect](https://ej2.syncfusion.com/react/documentation/api Example: -```jsx +{% tabs %} +{% highlight ts tabtitle="index.ts" %} import * as React from 'react'; import * as ReactDOM from 'react-dom/client'; import { PdfViewerComponent, Toolbar, Magnification, Navigation, LinkAnnotation, ThumbnailView, BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer, Inject } from '@syncfusion/ej2-react-pdfviewer'; @@ -577,7 +615,9 @@ function App() { const root = ReactDOM.createRoot(document.getElementById('pdfViewer')); root.render(); -``` + +{% endhighlight %} +{% endtabs %} ## documentLoad @@ -587,7 +627,8 @@ The [documentLoad](https://ej2.syncfusion.com/react/documentation/api/pdfviewer/ Example: -```jsx +{% tabs %} +{% highlight ts tabtitle="index.ts" %} import * as React from 'react'; import * as ReactDOM from 'react-dom/client'; import { PdfViewerComponent, Toolbar, Magnification, Navigation, LinkAnnotation, ThumbnailView, BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer, Inject } from '@syncfusion/ej2-react-pdfviewer'; @@ -612,7 +653,9 @@ function App() { const root = ReactDOM.createRoot(document.getElementById('pdfViewer')); root.render(); -``` + +{% endhighlight %} +{% endtabs %} ## documentLoadFailed @@ -622,7 +665,8 @@ The [documentLoadFailed](https://ej2.syncfusion.com/react/documentation/api/pdfv Example: -```jsx +{% tabs %} +{% highlight ts tabtitle="index.ts" %} import * as React from 'react'; import * as ReactDOM from 'react-dom/client'; import { PdfViewerComponent, Toolbar, Magnification, Navigation, LinkAnnotation, ThumbnailView, BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer, Inject } from '@syncfusion/ej2-react-pdfviewer'; @@ -646,7 +690,9 @@ function App() { const root = ReactDOM.createRoot(document.getElementById('pdfViewer')); root.render(); -``` + +{% endhighlight %} +{% endtabs %} ## documentUnload @@ -656,7 +702,8 @@ The [documentUnload](https://ej2.syncfusion.com/react/documentation/api/pdfviewe Example: -```jsx +{% tabs %} +{% highlight ts tabtitle="index.ts" %} import * as React from 'react'; import * as ReactDOM from 'react-dom/client'; import { PdfViewerComponent, Toolbar, Magnification, Navigation, LinkAnnotation, ThumbnailView, BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer, Inject } from '@syncfusion/ej2-react-pdfviewer'; @@ -681,7 +728,9 @@ function App() { const root = ReactDOM.createRoot(document.getElementById('pdfViewer')); root.render(); -``` + +{% endhighlight %} +{% endtabs %} ## downloadEnd @@ -691,7 +740,8 @@ The [downloadEnd](https://ej2.syncfusion.com/react/documentation/api/pdfviewer/# Example: -```jsx +{% tabs %} +{% highlight ts tabtitle="index.ts" %} import * as React from 'react'; import * as ReactDOM from 'react-dom/client'; import { PdfViewerComponent, Toolbar, Magnification, Navigation, LinkAnnotation, ThumbnailView, BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer, Inject } from '@syncfusion/ej2-react-pdfviewer'; @@ -716,7 +766,9 @@ function App() { const root = ReactDOM.createRoot(document.getElementById('pdfViewer')); root.render(); -``` + +{% endhighlight %} +{% endtabs %} ## downloadStart @@ -726,7 +778,8 @@ The [downloadStart](https://ej2.syncfusion.com/react/documentation/api/pdfviewer Example: -```jsx +{% tabs %} +{% highlight ts tabtitle="index.ts" %} import * as React from 'react'; import * as ReactDOM from 'react-dom/client'; import { PdfViewerComponent, Toolbar, Magnification, Navigation, LinkAnnotation, ThumbnailView, BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer, Inject } from '@syncfusion/ej2-react-pdfviewer'; @@ -751,7 +804,9 @@ function App() { const root = ReactDOM.createRoot(document.getElementById('pdfViewer')); root.render(); -``` + +{% endhighlight %} +{% endtabs %} ## exportFailed @@ -761,7 +816,9 @@ The [exportFailed](https://ej2.syncfusion.com/react/documentation/api/pdfviewer/ Example: -```jsx +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + import * as React from 'react'; import * as ReactDOM from 'react-dom/client'; import { PdfViewerComponent, Toolbar, Magnification, Navigation, LinkAnnotation, ThumbnailView, BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer, Inject } from '@syncfusion/ej2-react-pdfviewer'; @@ -786,7 +843,9 @@ function App() { const root = ReactDOM.createRoot(document.getElementById('pdfViewer')); root.render(); -``` + +{% endhighlight %} +{% endtabs %} ## exportStart @@ -796,7 +855,8 @@ The [exportStart](https://ej2.syncfusion.com/react/documentation/api/pdfviewer/# Example: -```jsx +{% tabs %} +{% highlight ts tabtitle="index.ts" %} import * as React from 'react'; import * as ReactDOM from 'react-dom/client'; import { PdfViewerComponent, Toolbar, Magnification, Navigation, LinkAnnotation, ThumbnailView, BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer, Inject } from '@syncfusion/ej2-react-pdfviewer'; @@ -821,7 +881,9 @@ function App() { const root = ReactDOM.createRoot(document.getElementById('pdfViewer')); root.render(); -``` + +{% endhighlight %} +{% endtabs %} ## exportSuccess @@ -831,7 +893,8 @@ The [exportSuccess](https://ej2.syncfusion.com/react/documentation/api/pdfviewer Example: -```jsx +{% tabs %} +{% highlight ts tabtitle="index.ts" %} import * as React from 'react'; import * as ReactDOM from 'react-dom/client'; import { PdfViewerComponent, Toolbar, Magnification, Navigation, LinkAnnotation, ThumbnailView, BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer, Inject } from '@syncfusion/ej2-react-pdfviewer'; @@ -856,7 +919,9 @@ function App() { const root = ReactDOM.createRoot(document.getElementById('pdfViewer')); root.render(); -``` + +{% endhighlight %} +{% endtabs %} ## extractTextCompleted @@ -866,7 +931,8 @@ The [extractTextCompleted](https://ej2.syncfusion.com/react/documentation/api/pd Example: -```jsx +{% tabs %} +{% highlight ts tabtitle="index.ts" %} import * as React from 'react'; import * as ReactDOM from 'react-dom/client'; import { PdfViewerComponent, Toolbar, Magnification, Navigation, LinkAnnotation, ThumbnailView, BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer, Inject } from '@syncfusion/ej2-react-pdfviewer'; @@ -891,7 +957,9 @@ function App() { const root = ReactDOM.createRoot(document.getElementById('pdfViewer')); root.render(); -``` + +{% endhighlight %} +{% endtabs %} ## hyperlinkClick @@ -901,7 +969,8 @@ The [hyperlinkClick](https://ej2.syncfusion.com/react/documentation/api/pdfviewe Example: -```jsx +{% tabs %} +{% highlight ts tabtitle="index.ts" %} import * as React from 'react'; import * as ReactDOM from 'react-dom/client'; import { PdfViewerComponent, Toolbar, Magnification, Navigation, LinkAnnotation, ThumbnailView, BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer, Inject } from '@syncfusion/ej2-react-pdfviewer'; @@ -926,7 +995,9 @@ function App() { const root = ReactDOM.createRoot(document.getElementById('pdfViewer')); root.render(); -``` + +{% endhighlight %} +{% endtabs %} ## hyperlinkMouseOver @@ -936,7 +1007,9 @@ The [hyperlinkMouseOver](https://ej2.syncfusion.com/react/documentation/api/pdfv Example: -```jsx +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + import * as React from 'react'; import * as ReactDOM from 'react-dom/client'; import { PdfViewerComponent, Toolbar, Magnification, Navigation, LinkAnnotation, ThumbnailView, BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer, Inject } from '@syncfusion/ej2-react-pdfviewer'; @@ -961,7 +1034,9 @@ function App() { const root = ReactDOM.createRoot(document.getElementById('pdfViewer')); root.render(); -``` + +{% endhighlight %} +{% endtabs %} ## importFailed @@ -971,7 +1046,9 @@ The [importFailed](https://ej2.syncfusion.com/react/documentation/api/pdfviewer/ Example: -```jsx +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + import * as React from 'react'; import * as ReactDOM from 'react-dom/client'; import { PdfViewerComponent, Toolbar, Magnification, Navigation, LinkAnnotation, ThumbnailView, BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer, Inject } from '@syncfusion/ej2-react-pdfviewer'; @@ -996,7 +1073,9 @@ function App() { const root = ReactDOM.createRoot(document.getElementById('pdfViewer')); root.render(); -``` + +{% endhighlight %} +{% endtabs %} ## importStart @@ -1006,7 +1085,8 @@ The [importStart](https://ej2.syncfusion.com/react/documentation/api/pdfviewer/# Example: -```jsx +{% tabs %} +{% highlight ts tabtitle="index.ts" %} import * as React from 'react'; import * as ReactDOM from 'react-dom/client'; import { PdfViewerComponent, Toolbar, Magnification, Navigation, LinkAnnotation, ThumbnailView, BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer, Inject } from '@syncfusion/ej2-react-pdfviewer'; @@ -1031,7 +1111,9 @@ function App() { const root = ReactDOM.createRoot(document.getElementById('pdfViewer')); root.render(); -``` + +{% endhighlight %} +{% endtabs %} ## importSuccess @@ -1041,7 +1123,8 @@ The [importSuccess](https://ej2.syncfusion.com/react/documentation/api/pdfviewer Example: -```jsx +{% tabs %} +{% highlight ts tabtitle="index.ts" %} import * as React from 'react'; import * as ReactDOM from 'react-dom/client'; import { PdfViewerComponent, Toolbar, Magnification, Navigation, LinkAnnotation, ThumbnailView, BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer, Inject } from '@syncfusion/ej2-react-pdfviewer'; @@ -1066,7 +1149,9 @@ function App() { const root = ReactDOM.createRoot(document.getElementById('pdfViewer')); root.render(); -``` + +{% endhighlight %} +{% endtabs %} ## keyboardCustomCommands @@ -1083,7 +1168,8 @@ When it triggers Refer to [Keyboard interaction](./accessibility#keyboard-interaction) for details about adding and handling custom shortcut keys. Example: -```jsx +{% tabs %} +{% highlight ts tabtitle="index.ts" %} import * as React from 'react'; import * as ReactDOM from 'react-dom/client'; import { PdfViewerComponent, Toolbar, Magnification, Navigation, LinkAnnotation, ThumbnailView, BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer, Inject } from '@syncfusion/ej2-react-pdfviewer'; @@ -1123,7 +1209,9 @@ function App() { const root = ReactDOM.createRoot(document.getElementById('pdfViewer')); root.render(); -``` + +{% endhighlight %} +{% endtabs %} ## moveSignature @@ -1133,7 +1221,8 @@ The [moveSignature](https://ej2.syncfusion.com/react/documentation/api/pdfviewer Example: -```jsx +{% tabs %} +{% highlight ts tabtitle="index.ts" %} import * as React from 'react'; import * as ReactDOM from 'react-dom/client'; import { PdfViewerComponent, Toolbar, Magnification, Navigation, LinkAnnotation, ThumbnailView, BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer, Inject } from '@syncfusion/ej2-react-pdfviewer'; @@ -1158,7 +1247,9 @@ function App() { const root = ReactDOM.createRoot(document.getElementById('pdfViewer')); root.render(); -``` + +{% endhighlight %} +{% endtabs %} ## pageChange @@ -1168,7 +1259,8 @@ The [pageChange](https://ej2.syncfusion.com/react/documentation/api/pdfviewer/#p Example: -```jsx +{% tabs %} +{% highlight ts tabtitle="index.ts" %} import * as React from 'react'; import * as ReactDOM from 'react-dom/client'; import { PdfViewerComponent, Toolbar, Magnification, Navigation, LinkAnnotation, ThumbnailView, BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer, Inject } from '@syncfusion/ej2-react-pdfviewer'; @@ -1193,7 +1285,9 @@ function App() { const root = ReactDOM.createRoot(document.getElementById('pdfViewer')); root.render(); -``` + +{% endhighlight %} +{% endtabs %} ## pageClick @@ -1203,7 +1297,8 @@ The [pageClick](https://ej2.syncfusion.com/react/documentation/api/pdfviewer/#pa Example: -```jsx +{% tabs %} +{% highlight ts tabtitle="index.ts" %} import * as React from 'react'; import * as ReactDOM from 'react-dom/client'; import { PdfViewerComponent, Toolbar, Magnification, Navigation, LinkAnnotation, ThumbnailView, BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer, Inject } from '@syncfusion/ej2-react-pdfviewer'; @@ -1228,7 +1323,9 @@ function App() { const root = ReactDOM.createRoot(document.getElementById('pdfViewer')); root.render(); -``` + +{% endhighlight %} +{% endtabs %} ## pageMouseover @@ -1238,7 +1335,8 @@ The [pageMouseover](https://ej2.syncfusion.com/react/documentation/api/pdfviewer Example: -```jsx +{% tabs %} +{% highlight ts tabtitle="index.ts" %} import * as React from 'react'; import * as ReactDOM from 'react-dom/client'; import { PdfViewerComponent, Toolbar, Magnification, Navigation, LinkAnnotation, ThumbnailView, BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer, Inject } from '@syncfusion/ej2-react-pdfviewer'; @@ -1263,7 +1361,9 @@ function App() { const root = ReactDOM.createRoot(document.getElementById('pdfViewer')); root.render(); -``` + +{% endhighlight %} +{% endtabs %} ## pageOrganizerSaveAs @@ -1273,7 +1373,8 @@ The [pageOrganizerSaveAs](https://ej2.syncfusion.com/react/documentation/api/pdf Example: -```jsx +{% tabs %} +{% highlight ts tabtitle="index.ts" %} import * as React from 'react'; import * as ReactDOM from 'react-dom/client'; import { PdfViewerComponent, Toolbar, Magnification, Navigation, LinkAnnotation, ThumbnailView, BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer, Inject } from '@syncfusion/ej2-react-pdfviewer'; @@ -1298,7 +1399,9 @@ function App() { const root = ReactDOM.createRoot(document.getElementById('pdfViewer')); root.render(); -``` + +{% endhighlight %} +{% endtabs %} ## pageRenderComplete @@ -1308,7 +1411,8 @@ The [pageRenderComplete](https://ej2.syncfusion.com/react/documentation/api/pdfv Example: -```jsx +{% tabs %} +{% highlight ts tabtitle="index.ts" %} import * as React from 'react'; import * as ReactDOM from 'react-dom/client'; import { PdfViewerComponent, Toolbar, Magnification, Navigation, LinkAnnotation, ThumbnailView, BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer, Inject } from '@syncfusion/ej2-react-pdfviewer'; @@ -1333,7 +1437,9 @@ function App() { const root = ReactDOM.createRoot(document.getElementById('pdfViewer')); root.render(); -``` + +{% endhighlight %} +{% endtabs %} ## pageRenderInitiate @@ -1343,7 +1449,8 @@ The [pageRenderInitiate](https://ej2.syncfusion.com/react/documentation/api/pdfv Example: -```jsx +{% tabs %} +{% highlight ts tabtitle="index.ts" %} import * as React from 'react'; import * as ReactDOM from 'react-dom/client'; import { PdfViewerComponent, Toolbar, Magnification, Navigation, LinkAnnotation, ThumbnailView, BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer, Inject } from '@syncfusion/ej2-react-pdfviewer'; @@ -1368,7 +1475,9 @@ function App() { const root = ReactDOM.createRoot(document.getElementById('pdfViewer')); root.render(); -``` + +{% endhighlight %} +{% endtabs %} ## printEnd @@ -1378,7 +1487,8 @@ The [printEnd](https://ej2.syncfusion.com/react/documentation/api/pdfviewer/#pri Example: -```jsx +{% tabs %} +{% highlight ts tabtitle="index.ts" %} import * as React from 'react'; import * as ReactDOM from 'react-dom/client'; import { PdfViewerComponent, Toolbar, Magnification, Navigation, LinkAnnotation, ThumbnailView, BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer, Inject } from '@syncfusion/ej2-react-pdfviewer'; @@ -1403,7 +1513,9 @@ function App() { const root = ReactDOM.createRoot(document.getElementById('pdfViewer')); root.render(); -``` + +{% endhighlight %} +{% endtabs %} ## printStart @@ -1413,7 +1525,8 @@ The [printStart](https://ej2.syncfusion.com/react/documentation/api/pdfviewer/#p Example: -```jsx +{% tabs %} +{% highlight ts tabtitle="index.ts" %} import * as React from 'react'; import * as ReactDOM from 'react-dom/client'; import { PdfViewerComponent, Toolbar, Magnification, Navigation, LinkAnnotation, ThumbnailView, BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer, Inject } from '@syncfusion/ej2-react-pdfviewer'; @@ -1438,7 +1551,9 @@ function App() { const root = ReactDOM.createRoot(document.getElementById('pdfViewer')); root.render(); -``` + +{% endhighlight %} +{% endtabs %} ## removeSignature @@ -1448,7 +1563,8 @@ The [removeSignature](https://ej2.syncfusion.com/react/documentation/api/pdfview Example: -```jsx +{% tabs %} +{% highlight ts tabtitle="index.ts" %} import * as React from 'react'; import * as ReactDOM from 'react-dom/client'; import { PdfViewerComponent, Toolbar, Magnification, Navigation, LinkAnnotation, ThumbnailView, BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer, Inject } from '@syncfusion/ej2-react-pdfviewer'; @@ -1473,7 +1589,9 @@ function App() { const root = ReactDOM.createRoot(document.getElementById('pdfViewer')); root.render(); -``` + +{% endhighlight %} +{% endtabs %} ## resizeSignature @@ -1483,7 +1601,8 @@ The [resizeSignature](https://ej2.syncfusion.com/react/documentation/api/pdfview Example: -```jsx +{% tabs %} +{% highlight ts tabtitle="index.ts" %} import * as React from 'react'; import * as ReactDOM from 'react-dom/client'; import { PdfViewerComponent, Toolbar, Magnification, Navigation, LinkAnnotation, ThumbnailView, BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer, Inject } from '@syncfusion/ej2-react-pdfviewer'; @@ -1508,7 +1627,9 @@ function App() { const root = ReactDOM.createRoot(document.getElementById('pdfViewer')); root.render(); -``` + +{% endhighlight %} +{% endtabs %} ## resourcesLoaded @@ -1518,7 +1639,8 @@ The [resourcesLoaded](https://ej2.syncfusion.com/react/documentation/api/pdfview Example: -```jsx +{% tabs %} +{% highlight ts tabtitle="index.ts" %} import * as React from 'react'; import * as ReactDOM from 'react-dom/client'; import { PdfViewerComponent, Toolbar, Magnification, Navigation, LinkAnnotation, ThumbnailView, BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer, Inject } from '@syncfusion/ej2-react-pdfviewer'; @@ -1543,7 +1665,9 @@ function App() { const root = ReactDOM.createRoot(document.getElementById('pdfViewer')); root.render(); -``` + +{% endhighlight %} +{% endtabs %} ## signaturePropertiesChange @@ -1553,7 +1677,8 @@ The [signaturePropertiesChange](https://ej2.syncfusion.com/react/documentation/a Example: -```jsx +{% tabs %} +{% highlight ts tabtitle="index.ts" %} import * as React from 'react'; import * as ReactDOM from 'react-dom/client'; import { PdfViewerComponent, Toolbar, Magnification, Navigation, LinkAnnotation, ThumbnailView, BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer, Inject } from '@syncfusion/ej2-react-pdfviewer'; @@ -1578,7 +1703,9 @@ function App() { const root = ReactDOM.createRoot(document.getElementById('pdfViewer')); root.render(); -``` + +{% endhighlight %} +{% endtabs %} ## signatureSelect @@ -1588,7 +1715,8 @@ The [signatureSelect](https://ej2.syncfusion.com/react/documentation/api/pdfview Example: -```jsx +{% tabs %} +{% highlight ts tabtitle="index.ts" %} import * as React from 'react'; import * as ReactDOM from 'react-dom/client'; import { PdfViewerComponent, Toolbar, Magnification, Navigation, LinkAnnotation, ThumbnailView, BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer, Inject } from '@syncfusion/ej2-react-pdfviewer'; @@ -1613,7 +1741,9 @@ function App() { const root = ReactDOM.createRoot(document.getElementById('pdfViewer')); root.render(); -``` + +{% endhighlight %} +{% endtabs %} ## signatureUnselect @@ -1623,7 +1753,8 @@ The [signatureUnselect](https://ej2.syncfusion.com/react/documentation/api/pdfvi Example: -```jsx +{% tabs %} +{% highlight ts tabtitle="index.ts" %} import * as React from 'react'; import * as ReactDOM from 'react-dom/client'; import { PdfViewerComponent, Toolbar, Magnification, Navigation, LinkAnnotation, ThumbnailView, BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer, Inject } from '@syncfusion/ej2-react-pdfviewer'; @@ -1648,7 +1779,9 @@ function App() { const root = ReactDOM.createRoot(document.getElementById('pdfViewer')); root.render(); -``` + +{% endhighlight %} +{% endtabs %} ## textSearchComplete @@ -1658,7 +1791,8 @@ The [textSearchComplete](https://ej2.syncfusion.com/react/documentation/api/pdfv Example: -```jsx +{% tabs %} +{% highlight ts tabtitle="index.ts" %} import * as React from 'react'; import * as ReactDOM from 'react-dom/client'; import { PdfViewerComponent, Toolbar, Magnification, Navigation, LinkAnnotation, ThumbnailView, BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer, Inject } from '@syncfusion/ej2-react-pdfviewer'; @@ -1683,7 +1817,9 @@ function App() { const root = ReactDOM.createRoot(document.getElementById('pdfViewer')); root.render(); -``` + +{% endhighlight %} +{% endtabs %} ## textSearchHighlight @@ -1693,7 +1829,8 @@ The [textSearchHighlight](https://ej2.syncfusion.com/react/documentation/api/pdf Example: -```jsx +{% tabs %} +{% highlight ts tabtitle="index.ts" %} import * as React from 'react'; import * as ReactDOM from 'react-dom/client'; import { PdfViewerComponent, Toolbar, Magnification, Navigation, LinkAnnotation, ThumbnailView, BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer, Inject } from '@syncfusion/ej2-react-pdfviewer'; @@ -1718,7 +1855,9 @@ function App() { const root = ReactDOM.createRoot(document.getElementById('pdfViewer')); root.render(); -``` + +{% endhighlight %} +{% endtabs %} ## textSearchStart @@ -1728,7 +1867,8 @@ The [textSearchStart](https://ej2.syncfusion.com/react/documentation/api/pdfview Example: -```jsx +{% tabs %} +{% highlight ts tabtitle="index.ts" %} import * as React from 'react'; import * as ReactDOM from 'react-dom/client'; import { PdfViewerComponent, Toolbar, Magnification, Navigation, LinkAnnotation, ThumbnailView, BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer, Inject } from '@syncfusion/ej2-react-pdfviewer'; @@ -1753,7 +1893,9 @@ function App() { const root = ReactDOM.createRoot(document.getElementById('pdfViewer')); root.render(); -``` + +{% endhighlight %} +{% endtabs %} ## textSelectionEnd @@ -1763,7 +1905,8 @@ The [textSelectionEnd](https://ej2.syncfusion.com/react/documentation/api/pdfvie Example: -```jsx +{% tabs %} +{% highlight ts tabtitle="index.ts" %} import * as React from 'react'; import * as ReactDOM from 'react-dom/client'; import { PdfViewerComponent, Toolbar, Magnification, Navigation, LinkAnnotation, ThumbnailView, BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer, Inject } from '@syncfusion/ej2-react-pdfviewer'; @@ -1788,7 +1931,9 @@ function App() { const root = ReactDOM.createRoot(document.getElementById('pdfViewer')); root.render(); -``` + +{% endhighlight %} +{% endtabs %} ## textSelectionStart @@ -1798,7 +1943,8 @@ The [textSelectionStart](https://ej2.syncfusion.com/react/documentation/api/pdfv Example: -```jsx +{% tabs %} +{% highlight ts tabtitle="index.ts" %} import * as React from 'react'; import * as ReactDOM from 'react-dom/client'; import { PdfViewerComponent, Toolbar, Magnification, Navigation, LinkAnnotation, ThumbnailView, BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer, Inject } from '@syncfusion/ej2-react-pdfviewer'; @@ -1823,7 +1969,9 @@ function App() { const root = ReactDOM.createRoot(document.getElementById('pdfViewer')); root.render(); -``` + +{% endhighlight %} +{% endtabs %} ## thumbnailClick @@ -1833,7 +1981,9 @@ The [thumbnailClick](https://ej2.syncfusion.com/react/documentation/api/pdfviewe Example: -```jsx +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + import * as React from 'react'; import * as ReactDOM from 'react-dom/client'; import { PdfViewerComponent, Toolbar, Magnification, Navigation, LinkAnnotation, ThumbnailView, BookmarkView, TextSelection, Annotation, FormDesigner, FormFields, PageOrganizer, Inject } from '@syncfusion/ej2-react-pdfviewer'; @@ -1858,7 +2008,9 @@ function App() { const root = ReactDOM.createRoot(document.getElementById('pdfViewer')); root.render(); -``` + +{% endhighlight %} +{% endtabs %} > Tip: For annotation and signature-specific events and arguments, see the dedicated Annotations Events topic. diff --git a/Document-Processing/PDF/PDF-Viewer/react/interactive-pdf-navigation/bookmark-navigation.md b/Document-Processing/PDF/PDF-Viewer/react/navigation/bookmark.md similarity index 100% rename from Document-Processing/PDF/PDF-Viewer/react/interactive-pdf-navigation/bookmark-navigation.md rename to Document-Processing/PDF/PDF-Viewer/react/navigation/bookmark.md diff --git a/Document-Processing/PDF/PDF-Viewer/react/interactive-pdf-navigation/hyperlink-navigation.md b/Document-Processing/PDF/PDF-Viewer/react/navigation/hyperlink.md similarity index 100% rename from Document-Processing/PDF/PDF-Viewer/react/interactive-pdf-navigation/hyperlink-navigation.md rename to Document-Processing/PDF/PDF-Viewer/react/navigation/hyperlink.md diff --git a/Document-Processing/PDF/PDF-Viewer/react/interactive-pdf-navigation/page-thumbnail-navigation.md b/Document-Processing/PDF/PDF-Viewer/react/navigation/page-thumbnail.md similarity index 100% rename from Document-Processing/PDF/PDF-Viewer/react/interactive-pdf-navigation/page-thumbnail-navigation.md rename to Document-Processing/PDF/PDF-Viewer/react/navigation/page-thumbnail.md diff --git a/Document-Processing/PDF/PDF-Viewer/react/interactive-pdf-navigation/page-navigation.md b/Document-Processing/PDF/PDF-Viewer/react/navigation/page.md similarity index 100% rename from Document-Processing/PDF/PDF-Viewer/react/interactive-pdf-navigation/page-navigation.md rename to Document-Processing/PDF/PDF-Viewer/react/navigation/page.md diff --git a/Document-Processing/PDF/PDF-Viewer/react/organize-pdf/organize-pdf-events.md b/Document-Processing/PDF/PDF-Viewer/react/organize-pdf/events.md similarity index 100% rename from Document-Processing/PDF/PDF-Viewer/react/organize-pdf/organize-pdf-events.md rename to Document-Processing/PDF/PDF-Viewer/react/organize-pdf/events.md diff --git a/Document-Processing/PDF/PDF-Viewer/react/organize-pdf/organize-page-mobile-view.md b/Document-Processing/PDF/PDF-Viewer/react/organize-pdf/mobile-view.md similarity index 100% rename from Document-Processing/PDF/PDF-Viewer/react/organize-pdf/organize-page-mobile-view.md rename to Document-Processing/PDF/PDF-Viewer/react/organize-pdf/mobile-view.md diff --git a/Document-Processing/PDF/PDF-Viewer/react/organize-pdf-overview.md b/Document-Processing/PDF/PDF-Viewer/react/organize-pdf/overview.md similarity index 100% rename from Document-Processing/PDF/PDF-Viewer/react/organize-pdf-overview.md rename to Document-Processing/PDF/PDF-Viewer/react/organize-pdf/overview.md diff --git a/Document-Processing/PDF/PDF-Viewer/react/organize-pdf/programmatic-support-for-organize-page.md b/Document-Processing/PDF/PDF-Viewer/react/organize-pdf/programmatic-support.md similarity index 100% rename from Document-Processing/PDF/PDF-Viewer/react/organize-pdf/programmatic-support-for-organize-page.md rename to Document-Processing/PDF/PDF-Viewer/react/organize-pdf/programmatic-support.md diff --git a/Document-Processing/PDF/PDF-Viewer/react/organize-pdf/toolbar-organize-page.md b/Document-Processing/PDF/PDF-Viewer/react/organize-pdf/toolbar.md similarity index 100% rename from Document-Processing/PDF/PDF-Viewer/react/organize-pdf/toolbar-organize-page.md rename to Document-Processing/PDF/PDF-Viewer/react/organize-pdf/toolbar.md diff --git a/Document-Processing/PDF/PDF-Viewer/react/organize-pdf/ui-interactions-organize-page.md b/Document-Processing/PDF/PDF-Viewer/react/organize-pdf/ui-interactions.md similarity index 100% rename from Document-Processing/PDF/PDF-Viewer/react/organize-pdf/ui-interactions-organize-page.md rename to Document-Processing/PDF/PDF-Viewer/react/organize-pdf/ui-interactions.md diff --git a/Document-Processing/PDF/PDF-Viewer/react/toolbar-customization/annotation-toolbar-customization.md b/Document-Processing/PDF/PDF-Viewer/react/toolbar/annotation-toolbar.md similarity index 100% rename from Document-Processing/PDF/PDF-Viewer/react/toolbar-customization/annotation-toolbar-customization.md rename to Document-Processing/PDF/PDF-Viewer/react/toolbar/annotation-toolbar.md diff --git a/Document-Processing/PDF/PDF-Viewer/react/toolbar-customization/custom-toolbar.md b/Document-Processing/PDF/PDF-Viewer/react/toolbar/custom-toolbar.md similarity index 100% rename from Document-Processing/PDF/PDF-Viewer/react/toolbar-customization/custom-toolbar.md rename to Document-Processing/PDF/PDF-Viewer/react/toolbar/custom-toolbar.md diff --git a/Document-Processing/PDF/PDF-Viewer/react/toolbar-customization/form-designer-toolbar-customization.md b/Document-Processing/PDF/PDF-Viewer/react/toolbar/form-designer-toolbar.md similarity index 100% rename from Document-Processing/PDF/PDF-Viewer/react/toolbar-customization/form-designer-toolbar-customization.md rename to Document-Processing/PDF/PDF-Viewer/react/toolbar/form-designer-toolbar.md diff --git a/Document-Processing/PDF/PDF-Viewer/react/toolbar-customization/mobile-toolbar.md b/Document-Processing/PDF/PDF-Viewer/react/toolbar/mobile-toolbar.md similarity index 100% rename from Document-Processing/PDF/PDF-Viewer/react/toolbar-customization/mobile-toolbar.md rename to Document-Processing/PDF/PDF-Viewer/react/toolbar/mobile-toolbar.md diff --git a/Document-Processing/PDF/PDF-Viewer/react/toolbar-customization/primary-toolbar-customization.md b/Document-Processing/PDF/PDF-Viewer/react/toolbar/primary-toolbar.md similarity index 100% rename from Document-Processing/PDF/PDF-Viewer/react/toolbar-customization/primary-toolbar-customization.md rename to Document-Processing/PDF/PDF-Viewer/react/toolbar/primary-toolbar.md diff --git a/Document-Processing/PDF/PDF-Viewer/vue/how-to/add-save-button.md b/Document-Processing/PDF/PDF-Viewer/vue/how-to/add-save-button.md index 593bb9d5e..c06d7379a 100644 --- a/Document-Processing/PDF/PDF-Viewer/vue/how-to/add-save-button.md +++ b/Document-Processing/PDF/PDF-Viewer/vue/how-to/add-save-button.md @@ -8,7 +8,7 @@ documentation: ug domainurl: ##DomainURL## --- -# Integrate a Save Button into the Vue PDF Viewer Toolbar +# Add a Save button to the built-in toolbar PDF Viewer supports customizing toolbar items, including adding, showing, hiding, enabling, and disabling items. diff --git a/Document-Processing/PDF/PDF-Viewer/vue/interactive-pdf-navigation/bookmark-navigation.md b/Document-Processing/PDF/PDF-Viewer/vue/navigation/bookmark.md similarity index 100% rename from Document-Processing/PDF/PDF-Viewer/vue/interactive-pdf-navigation/bookmark-navigation.md rename to Document-Processing/PDF/PDF-Viewer/vue/navigation/bookmark.md diff --git a/Document-Processing/PDF/PDF-Viewer/vue/interactive-pdf-navigation/hyperlink-navigation.md b/Document-Processing/PDF/PDF-Viewer/vue/navigation/hyperlink.md similarity index 100% rename from Document-Processing/PDF/PDF-Viewer/vue/interactive-pdf-navigation/hyperlink-navigation.md rename to Document-Processing/PDF/PDF-Viewer/vue/navigation/hyperlink.md diff --git a/Document-Processing/PDF/PDF-Viewer/vue/interactive-pdf-navigation/page-thumbnail-navigation.md b/Document-Processing/PDF/PDF-Viewer/vue/navigation/page-thumbnail.md similarity index 100% rename from Document-Processing/PDF/PDF-Viewer/vue/interactive-pdf-navigation/page-thumbnail-navigation.md rename to Document-Processing/PDF/PDF-Viewer/vue/navigation/page-thumbnail.md diff --git a/Document-Processing/PDF/PDF-Viewer/vue/interactive-pdf-navigation/page-navigation.md b/Document-Processing/PDF/PDF-Viewer/vue/navigation/page.md similarity index 100% rename from Document-Processing/PDF/PDF-Viewer/vue/interactive-pdf-navigation/page-navigation.md rename to Document-Processing/PDF/PDF-Viewer/vue/navigation/page.md diff --git a/Document-Processing/PDF/PDF-Viewer/vue/organize-pdf/organize-pdf-events.md b/Document-Processing/PDF/PDF-Viewer/vue/organize-pdf/events.md similarity index 100% rename from Document-Processing/PDF/PDF-Viewer/vue/organize-pdf/organize-pdf-events.md rename to Document-Processing/PDF/PDF-Viewer/vue/organize-pdf/events.md diff --git a/Document-Processing/PDF/PDF-Viewer/vue/organize-pdf/organize-page-mobile-view.md b/Document-Processing/PDF/PDF-Viewer/vue/organize-pdf/mobile-view.md similarity index 100% rename from Document-Processing/PDF/PDF-Viewer/vue/organize-pdf/organize-page-mobile-view.md rename to Document-Processing/PDF/PDF-Viewer/vue/organize-pdf/mobile-view.md diff --git a/Document-Processing/PDF/PDF-Viewer/vue/organize-pdf-overview.md b/Document-Processing/PDF/PDF-Viewer/vue/organize-pdf/organize-pdf-overview.md similarity index 100% rename from Document-Processing/PDF/PDF-Viewer/vue/organize-pdf-overview.md rename to Document-Processing/PDF/PDF-Viewer/vue/organize-pdf/organize-pdf-overview.md diff --git a/Document-Processing/PDF/PDF-Viewer/vue/organize-pdf/overview.md b/Document-Processing/PDF/PDF-Viewer/vue/organize-pdf/overview.md new file mode 100644 index 000000000..3eea270a7 --- /dev/null +++ b/Document-Processing/PDF/PDF-Viewer/vue/organize-pdf/overview.md @@ -0,0 +1,38 @@ +--- +layout: post +title: Organize pages in Vue PDF Viewer | Syncfusion +description: Learn how to reorder, rotate, insert, delete, and save pages with the Syncfusion Vue PDF Viewer component. +platform: document-processing +control: PDF Viewer +documentation: ug +domainurl: ##DomainURL## +--- + +# Organize pages in Vue PDF Viewer + +The Vue PDF Viewer component provides an Organize Pages panel that helps you prepare documents before sharing them. Use it to tidy scanned files, move pages into the right order, and duplicate important content without leaving the viewer. + +To open the Organize Pages panel, load a document, ensure that the Organize Pages toolbar item is enabled, and choose **Organize Pages** from the left vertical toolbar. The document must allow page-level edits; otherwise, the toolbar item is hidden. + +The Organize Pages panel supports the following actions: + +* **Rotate pages**: Fix page orientation in 90-degree increments to correct scanned pages. +* **Rearrange pages**: Drag and drop thumbnails to update the reading order. +* **Insert new pages**: Add blank pages at the required position. +* **Delete pages**: Remove pages that are no longer needed. +* **Copy pages**: Duplicate selected pages to reuse content elsewhere in the document. +* **Import a PDF document**: Merge the current document with pages from another PDF file. +* **Select all pages**: Apply bulk actions, such as rotation or deletion, to every page. +* **Save updates**: Review changes in real time and use **Save** or **Save As** to download the revised document. + +After completing the changes, apply them by selecting **Save** to overwrite the current document or **Save As** to download a new copy that retains the updated page order. + +For a full guide to Organize Pages in Vue, see the feature landing page: [Organize pages in Vue PDF Viewer](./organize-pdf). + +See also + +- [UI interactions for Organize Pages](./organize-pdf/ui-interactions-organize-page) +- [Toolbar items for Organize Pages](./organize-pdf/toolbar-organize-page) +- [Programmatic support for Organize Pages](./organize-pdf/programmatic-support-for-organize-page) +- [Organize Pages events](./organize-pdf/organize-pdf-events) +- [Organize Pages in mobile view](./organize-pdf/organize-page-mobile-view) diff --git a/Document-Processing/PDF/PDF-Viewer/vue/organize-pdf/programmatic-support-for-organize-page.md b/Document-Processing/PDF/PDF-Viewer/vue/organize-pdf/programmatic-support.md similarity index 100% rename from Document-Processing/PDF/PDF-Viewer/vue/organize-pdf/programmatic-support-for-organize-page.md rename to Document-Processing/PDF/PDF-Viewer/vue/organize-pdf/programmatic-support.md diff --git a/Document-Processing/PDF/PDF-Viewer/vue/organize-pdf/toolbar-organize-page.md b/Document-Processing/PDF/PDF-Viewer/vue/organize-pdf/toolbar.md similarity index 100% rename from Document-Processing/PDF/PDF-Viewer/vue/organize-pdf/toolbar-organize-page.md rename to Document-Processing/PDF/PDF-Viewer/vue/organize-pdf/toolbar.md diff --git a/Document-Processing/PDF/PDF-Viewer/vue/organize-pdf/ui-interactions-organize-page.md b/Document-Processing/PDF/PDF-Viewer/vue/organize-pdf/ui-interactions.md similarity index 100% rename from Document-Processing/PDF/PDF-Viewer/vue/organize-pdf/ui-interactions-organize-page.md rename to Document-Processing/PDF/PDF-Viewer/vue/organize-pdf/ui-interactions.md diff --git a/Document-Processing/PDF/PDF-Viewer/vue/overview.md b/Document-Processing/PDF/PDF-Viewer/vue/overview.md index 12ca86fe0..66727b7ee 100644 --- a/Document-Processing/PDF/PDF-Viewer/vue/overview.md +++ b/Document-Processing/PDF/PDF-Viewer/vue/overview.md @@ -63,7 +63,7 @@ Add CSS references needed for PDF Viewer in `style` section of the `App.vue` fil ``` ### Add PDF Viewer component -Add the Vue PDF Viewer by using `ejs-pdfviewer` selector in template section of the `App.vue` file. +Add the Vue PDF Viewer by using `ej-pdfviewer` selector in template section of the `App.vue` file. ```
  • Vue
  • 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 literal 0 HcmV?d00001 diff --git a/Document-Processing/PowerPoint/Conversions/PowerPoint-To-PDF/NET/Workingwith-Blazor/Blazor_image_Server_Web_Additional_Information.png b/Document-Processing/PowerPoint/Conversions/PowerPoint-To-PDF/NET/Workingwith-Blazor/Blazor_image_Server_Web_Additional_Information.png new file mode 100644 index 0000000000000000000000000000000000000000..4f8ec78c0dbabbf9564e8301f391093d35b7864d GIT binary patch literal 39258 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