From d5a98be1d7d7a1e942f52ddf6a5be54904774515 Mon Sep 17 00:00:00 2001 From: mohammedaffanc Date: Wed, 6 Aug 2025 13:21:48 +0530 Subject: [PATCH 1/2] 717577: Added Compare API in the Docker Image --- .../Controllers/DocumentEditorController.cs | 48 +++++++++++++++++-- 1 file changed, 44 insertions(+), 4 deletions(-) diff --git a/src/ej2-documenteditor-server/Controllers/DocumentEditorController.cs b/src/ej2-documenteditor-server/Controllers/DocumentEditorController.cs index bde5dfc..9577311 100644 --- a/src/ej2-documenteditor-server/Controllers/DocumentEditorController.cs +++ b/src/ej2-documenteditor-server/Controllers/DocumentEditorController.cs @@ -99,7 +99,7 @@ public string SpellCheck([FromBody] SpellCheckJsonData spellChecker) return "{\"SpellCollection\":[],\"HasSpellingError\":false,\"Suggestions\":null}"; } } - // GET api/values + // GET api/values [HttpGet] public IEnumerable Get() { @@ -144,7 +144,7 @@ public class CustomParameter [HttpPost] [EnableCors("AllowAllOrigins")] [Route("SystemClipboard")] - public string SystemClipboard([FromBody]CustomParameter param) + public string SystemClipboard([FromBody] CustomParameter param) { if (param.content != null && param.content != "") { @@ -181,7 +181,7 @@ public class UploadDocument [HttpPost] [EnableCors("AllowAllOrigins")] [Route("RestrictEditing")] - public string[] RestrictEditing([FromBody]CustomRestrictParameter param) + public string[] RestrictEditing([FromBody] CustomRestrictParameter param) { if (param.passwordBase64 == "" && param.passwordBase64 == null) return null; @@ -208,7 +208,7 @@ public string LoadDefault() [Route("LoadDocument")] public string LoadDocument([FromForm] UploadDocument uploadDocument) { - string documentPath= Path.Combine(path, uploadDocument.DocumentName); + string documentPath = Path.Combine(path, uploadDocument.DocumentName); Stream stream = null; if (System.IO.File.Exists(documentPath)) { @@ -355,6 +355,46 @@ public FileStreamResult Export(IFormCollection data) FileDownloadName = fileName }; } + [HttpPost] + [Route("CompareDocuments")] + public string CompareDocuments(IFormCollection data) + { + if (data.Files.Count < 2) return null; + IFormFile originalDoc = data.Files[0]; + IFormFile revisedDoc = data.Files[1]; + string type1 = Path.GetExtension(originalDoc.FileName)?.ToLower() ?? ".docx"; + string type2 = Path.GetExtension(revisedDoc.FileName)?.ToLower() ?? ".docx"; + + Stream originalStream = GetDocumentStream(originalDoc, type1); + + Stream revisedStream = GetDocumentStream(revisedDoc, type2); + + using (originalStream) + using (WDocument originalDocument = new WDocument(originalStream, WFormatType.Docx)) + using (revisedStream) + using (WDocument revisedDocument = new WDocument(revisedStream, WFormatType.Docx)) + { + originalDocument.Compare(revisedDocument); + var wordDoc = Syncfusion.EJ2.DocumentEditor.WordDocument.Load(originalDocument); + return Newtonsoft.Json.JsonConvert.SerializeObject(wordDoc); + } + } + private Stream GetDocumentStream(IFormFile file, string fileType) + { + if (fileType == ".docx") + { + return file.OpenReadStream(); + } + + using (var reader = new StreamReader(file.OpenReadStream())) + { + string sfdtContent = reader.ReadToEnd(); + WDocument document = WordDocument.Save(sfdtContent); + var stream = new MemoryStream(); + document.Save(stream, Syncfusion.DocIO.FormatType.Docx); + return stream; + } + } private string GetValue(IFormCollection data, string key) { if (data.ContainsKey(key)) From eb286acefe2744b21451afa824beca4d95131031 Mon Sep 17 00:00:00 2001 From: mohammedaffanc Date: Wed, 6 Aug 2025 14:39:58 +0530 Subject: [PATCH 2/2] 71577: Updated the Compare API --- .../Controllers/DocumentEditorController.cs | 70 ++++++++++++------- 1 file changed, 44 insertions(+), 26 deletions(-) diff --git a/src/ej2-documenteditor-server/Controllers/DocumentEditorController.cs b/src/ej2-documenteditor-server/Controllers/DocumentEditorController.cs index 9577311..16c0b5b 100644 --- a/src/ej2-documenteditor-server/Controllers/DocumentEditorController.cs +++ b/src/ej2-documenteditor-server/Controllers/DocumentEditorController.cs @@ -355,44 +355,62 @@ public FileStreamResult Export(IFormCollection data) FileDownloadName = fileName }; } + [AcceptVerbs("Post")] [HttpPost] + [EnableCors("AllowAllOrigins")] [Route("CompareDocuments")] public string CompareDocuments(IFormCollection data) { - if (data.Files.Count < 2) return null; - IFormFile originalDoc = data.Files[0]; - IFormFile revisedDoc = data.Files[1]; - string type1 = Path.GetExtension(originalDoc.FileName)?.ToLower() ?? ".docx"; - string type2 = Path.GetExtension(revisedDoc.FileName)?.ToLower() ?? ".docx"; + if (data.Files.Count == 0 || data.Files.Count < 2) + return null; - Stream originalStream = GetDocumentStream(originalDoc, type1); + IFormFile originalFile = data.Files[0]; + IFormFile revisedFile = data.Files[1]; - Stream revisedStream = GetDocumentStream(revisedDoc, type2); + WDocument originalDocument = GetWordDocument(originalFile); + WDocument revisedDocument = GetWordDocument(revisedFile); + originalDocument.Compare(revisedDocument); + //Hooks MetafileImageParsed event. + WordDocument.MetafileImageParsed += OnMetafileImageParsed; + WordDocument document = WordDocument.Load(originalDocument); + //Unhooks MetafileImageParsed event. + WordDocument.MetafileImageParsed -= OnMetafileImageParsed; + originalDocument.Close(); + revisedDocument.Close(); - using (originalStream) - using (WDocument originalDocument = new WDocument(originalStream, WFormatType.Docx)) - using (revisedStream) - using (WDocument revisedDocument = new WDocument(revisedStream, WFormatType.Docx)) - { - originalDocument.Compare(revisedDocument); - var wordDoc = Syncfusion.EJ2.DocumentEditor.WordDocument.Load(originalDocument); - return Newtonsoft.Json.JsonConvert.SerializeObject(wordDoc); - } + string json = Newtonsoft.Json.JsonConvert.SerializeObject(document); + document.Dispose(); + return json; } - private Stream GetDocumentStream(IFormFile file, string fileType) + + private static WDocument GetWordDocument(IFormFile file) { - if (fileType == ".docx") + Stream stream = new MemoryStream(); + int index = file.FileName.LastIndexOf('.'); + string type = index > -1 && index < file.FileName.Length - 1 ? + file.FileName.Substring(index) : ".docx"; + file.CopyTo(stream); + stream.Position = 0; + + WDocument document; + if (type == ".sfdt") { - return file.OpenReadStream(); + using (var reader = new StreamReader(stream)) + { + string sfdtContent = reader.ReadToEnd(); + document = WordDocument.Save(sfdtContent); + var outStream = new MemoryStream(); + document.Save(outStream, WFormatType.Docx); + document.Close(); + WDocument wordDocument = new WDocument(outStream, WFormatType.Docx); + return wordDocument; + } } - - using (var reader = new StreamReader(file.OpenReadStream())) + else { - string sfdtContent = reader.ReadToEnd(); - WDocument document = WordDocument.Save(sfdtContent); - var stream = new MemoryStream(); - document.Save(stream, Syncfusion.DocIO.FormatType.Docx); - return stream; + document = new WDocument(stream, GetWFormatType(type)); + stream.Dispose(); + return document; } } private string GetValue(IFormCollection data, string key)