From 90637b384854644c36eb9ee6ee8b57431a972f01 Mon Sep 17 00:00:00 2001 From: ivanszabo Date: Wed, 2 Apr 2025 13:01:49 +0200 Subject: [PATCH] =?UTF-8?q?PDF=20k=C3=A9sz=C3=ADt=C3=A9s=20DevExpressel.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/CheckListController.cs | 24 ++++ .../Pdf/CheckList_Template_V1.docx | Bin 0 -> 36358 bytes .../DocumentGenerator/DokumentumGenerator.cs | 121 ++++-------------- .../Services/CheckListService.cs | 20 ++- src/WorkFlowCheck.BL/WorkFlowCheck.BL.csproj | 2 +- .../CheckListHeaderPage.cshtml | 3 +- .../CheckListHeaderPage.cshtml.cs | 27 +++- .../Services/CheckListService.cs | 25 +++- .../Services/Interfaces/ICheckListService.cs | 1 + 9 files changed, 114 insertions(+), 109 deletions(-) create mode 100644 src/WorkFlowCheck.API/Pdf/CheckList_Template_V1.docx diff --git a/src/WorkFlowCheck.API/Controllers/CheckListController.cs b/src/WorkFlowCheck.API/Controllers/CheckListController.cs index af37a54..6436d79 100644 --- a/src/WorkFlowCheck.API/Controllers/CheckListController.cs +++ b/src/WorkFlowCheck.API/Controllers/CheckListController.cs @@ -39,6 +39,30 @@ namespace WorkFlowCheck.API.Controllers return retVal; } + [HttpGet("CreatePDF/{id}")] + public async Task> CreatePDF(int id) + { + var retVal = new ApiResponseDTO() + { + IsSuccess = true, + }; + var checkListHeader = await _checkListService.GetCheckListHeaderAsync(id); + var response = _checkListService.CreatePDF(id); + + if (response != null) + { + + retVal.IsSuccess = true; + retVal.Data = response; + } + else + { + retVal.IsSuccess = false; + retVal.Errors.Add("No data!"); + } + + return retVal; + } [HttpGet("GetAllCheckListHeaders")] public async Task>> GetAllCheckListHeadersAsync() { diff --git a/src/WorkFlowCheck.API/Pdf/CheckList_Template_V1.docx b/src/WorkFlowCheck.API/Pdf/CheckList_Template_V1.docx new file mode 100644 index 0000000000000000000000000000000000000000..b0a99cfeb635f8f291e100876392a4f0337d0ad5 GIT binary patch literal 36358 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 literal 0 HcmV?d00001 diff --git a/src/WorkFlowCheck.BL/DocumentGenerator/DokumentumGenerator.cs b/src/WorkFlowCheck.BL/DocumentGenerator/DokumentumGenerator.cs index c0622b0..42ea204 100644 --- a/src/WorkFlowCheck.BL/DocumentGenerator/DokumentumGenerator.cs +++ b/src/WorkFlowCheck.BL/DocumentGenerator/DokumentumGenerator.cs @@ -1,108 +1,35 @@ -using Aspose.Words; -using Aspose.Words.Tables; -using Serilog; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using DevExpress.XtraRichEdit; namespace WorkFlowCheck.BL.DocumentGenerator { public class DokumentumGenerator { - static DokumentumGenerator() + public static byte[] DocxToPdf(byte[] wordBytes) { - Aspose.Words.License license = new Aspose.Words.License(); - - try + using (MemoryStream inputStream = new MemoryStream(wordBytes)) + using (MemoryStream outputStream = new MemoryStream()) { - license.SetLicense("Aspose.Words.lic"); - Log.Information("License set successfully."); + try + { + // RichEditDocumentServer használata a konverzióhoz + using (RichEditDocumentServer wordProcessor = new RichEditDocumentServer()) + { + // Dokumentum betöltése a byte tömbből + wordProcessor.LoadDocument(inputStream, DevExpress.XtraRichEdit.DocumentFormat.OpenXml); + + // PDF formátumba mentés a memóriafolyamba + wordProcessor.ExportToPdf(outputStream); + + // PDF byte tömb visszaadása + return outputStream.ToArray(); + } + } + catch (Exception ex) + { + Console.WriteLine("Hiba a konverzió során: " + ex.Message); + return new byte[0]; + } } - catch (Exception e) - { - Log.Error(e, "\nThere was an error setting the license: " + e.Message); - } - } - - public static byte[] HtmlToDocx(string html) - { - byte[] generated = Encoding.UTF8.GetBytes(html); - var docHTML = new Aspose.Words.Document(); - - Aspose.Words.DocumentBuilder builder = new Aspose.Words.DocumentBuilder(docHTML); - builder.InsertHtml(html); - - docHTML.CompatibilityOptions.OptimizeFor(Aspose.Words.Settings.MsWordVersion.Word2016); - - MemoryStream outStream = new MemoryStream(); - docHTML.Save(outStream, Aspose.Words.SaveFormat.Docx); - - generated = outStream.ToArray(); - - outStream.Dispose(); - - return generated; - } - - public static byte[] HtmlToPdf(string html) - { - byte[] generated = Encoding.UTF8.GetBytes(html); - - Stream inStream = new MemoryStream(generated); - var docHTML = new Aspose.Words.Document(inStream); - MemoryStream outStream = new MemoryStream(); - docHTML.Save(outStream, Aspose.Words.SaveFormat.Pdf); - - generated = outStream.ToArray(); - - inStream.Dispose(); - outStream.Dispose(); - - return generated; - } - - public static byte[] DocxToPdf(byte[] generated) - { - Stream inStream = new MemoryStream(generated); - var doc = new Aspose.Words.Document(inStream); - MemoryStream outStream = new MemoryStream(); - doc.Save(outStream, Aspose.Words.SaveFormat.Pdf); - - generated = outStream.ToArray(); - - inStream.Dispose(); - outStream.Dispose(); - - return generated; - } - - public static byte[] DocxToPdfForTopic(byte[] generated) - { - Stream inStream = new MemoryStream(generated); - var doc = new Aspose.Words.Document(inStream); - - doc.Styles.DefaultFont.Name = "Times New Roman"; - doc.Styles.DefaultFont.Size = 12; - - var collection = doc.GetChildNodes(NodeType.Row, true); - - foreach (Row row in collection) - { - row.RowFormat.Height = 40; - row.RowFormat.HeightRule = HeightRule.AtLeast; - } - - MemoryStream outStream = new MemoryStream(); - doc.Save(outStream, Aspose.Words.SaveFormat.Pdf); - - generated = outStream.ToArray(); - - inStream.Dispose(); - outStream.Dispose(); - - return generated; } } } diff --git a/src/WorkFlowCheck.BL/Services/CheckListService.cs b/src/WorkFlowCheck.BL/Services/CheckListService.cs index b7738de..c3c8137 100644 --- a/src/WorkFlowCheck.BL/Services/CheckListService.cs +++ b/src/WorkFlowCheck.BL/Services/CheckListService.cs @@ -426,14 +426,22 @@ namespace WorkFlowCheck.BL.Services public byte[] CreatePDF(int checkListHeaderId) { - var location = System.Reflection.Assembly.GetEntryAssembly().Location; - var directory = System.IO.Path.GetDirectoryName(location); - byte[] byteArray = System.IO.File.ReadAllBytes(Path.Combine(directory, "DocumentGenerator", "CheckList_Template_V1.docx")); - SablonGenerator gen = new SablonGenerator(byteArray); + try + { + string pdfDirectory = Path.Combine(Directory.GetCurrentDirectory(), "Pdf"); - byte[] content = gen.CloseAndGetDocument(); + byte[] byteArray = File.ReadAllBytes(Path.Combine(pdfDirectory, "CheckList_Template_V1.docx")); + SablonGenerator gen = new SablonGenerator(byteArray); - return DokumentumGenerator.DocxToPdf(content); + byte[] content = gen.CloseAndGetDocument(); + + return DokumentumGenerator.DocxToPdf(content); + } + catch (Exception ex) + { + Log.Error(ex.Message); + } + return new byte[0]; } } } diff --git a/src/WorkFlowCheck.BL/WorkFlowCheck.BL.csproj b/src/WorkFlowCheck.BL/WorkFlowCheck.BL.csproj index bd3f6b2..dd1a6a6 100644 --- a/src/WorkFlowCheck.BL/WorkFlowCheck.BL.csproj +++ b/src/WorkFlowCheck.BL/WorkFlowCheck.BL.csproj @@ -7,8 +7,8 @@ - + diff --git a/src/WorkFlowCheck.Web/Pages/CheckList/CheckListHeader/CheckListHeaderPage.cshtml b/src/WorkFlowCheck.Web/Pages/CheckList/CheckListHeader/CheckListHeaderPage.cshtml index f78ee59..298fe81 100644 --- a/src/WorkFlowCheck.Web/Pages/CheckList/CheckListHeader/CheckListHeaderPage.cshtml +++ b/src/WorkFlowCheck.Web/Pages/CheckList/CheckListHeader/CheckListHeaderPage.cshtml @@ -115,7 +115,8 @@ $('#tbCheckListHeadersPage').on('click', '.pdf-btn', function () { const row = table.row($(this).closest('tr')).data(); - window.location.href = `@Url.Page("./CheckListHeaderEditPage")?id=${row.id}`; + window.location.href = `@Url.Page("./CheckListHeaderPage")?handler=CreatePDF&id=${row.id}`; + }); $('#tbCheckListHeadersPage').on('click', '.delete-btn', function () diff --git a/src/WorkFlowCheck.Web/Pages/CheckList/CheckListHeader/CheckListHeaderPage.cshtml.cs b/src/WorkFlowCheck.Web/Pages/CheckList/CheckListHeader/CheckListHeaderPage.cshtml.cs index 28533cd..9fcaa80 100644 --- a/src/WorkFlowCheck.Web/Pages/CheckList/CheckListHeader/CheckListHeaderPage.cshtml.cs +++ b/src/WorkFlowCheck.Web/Pages/CheckList/CheckListHeader/CheckListHeaderPage.cshtml.cs @@ -22,14 +22,37 @@ namespace WorkFlowCheck.Web.Pages.CheckList.CheckListHeader } public async Task OnGet() { - CheckStatus = _checkListService.GetCheckStatus(); + CheckStatus = _checkListService.GetCheckStatus(); } - + public async Task OnGetLoadCheckListHeaders() { var results = await _checkListService.GetAllCheckListHeaderAsync(); return new JsonResult(new { data = results }); } + + public async Task OnGetCreatePDF(int id) + { + var checkListHeaderDTO = await _checkListService.GetCheckListHeader(id); + + var response = await _checkListService.CreatePDF(id); + + if (response.IsSuccess) + { + var timestamp = DateTime.Now.ToString("yyyyMMdd_HHmmss"); + var fileName = $"PH_{timestamp}_{checkListHeaderDTO.Id}.pdf"; + var result = new FileContentResult(response.Data, "application/pdf") + { + FileDownloadName = fileName, + FileContents = response.Data + }; + return result; + } + else + { + return new JsonResult(new { success = false }); + } + } } } diff --git a/src/WorkFlowCheck.Web/Services/CheckListService.cs b/src/WorkFlowCheck.Web/Services/CheckListService.cs index 512e813..5c7aa80 100644 --- a/src/WorkFlowCheck.Web/Services/CheckListService.cs +++ b/src/WorkFlowCheck.Web/Services/CheckListService.cs @@ -15,7 +15,7 @@ namespace WorkFlowCheck.Web.Services public CheckListService(HttpClient httpClient, IConfiguration configuration, IHttpContextAccessor httpContextAccessor) : base(httpClient, configuration, httpContextAccessor) { } - + public async Task> GetAllCheckListHeaderAsync() { var endpoint = $"{_httpClient.BaseAddress}api/CheckList/GetAllCheckListHeaders"; @@ -60,6 +60,27 @@ namespace WorkFlowCheck.Web.Services } public async Task> UpdateCheckListHeader(CheckListHeaderDTO checkListHeaderDTO) => throw new NotImplementedException(); + public async Task> CreatePDF(int id) + { + var retVal = new ApiResponseDTO(); + var endpoint = $"{_httpClient.BaseAddress}api/CheckList/CreatePDF/{id}"; + try + { + var response = await _httpClient.GetFromJsonAsync>(endpoint); + if (response != null) + { + if (response.IsSuccess) + { + return response; + } + } + } + catch (Exception ex) + { + Log.Error(ex.Message); + } + return retVal; + } public async Task> GetAllCheckListTemplateHeaderAsync() { @@ -250,5 +271,5 @@ namespace WorkFlowCheck.Web.Services .GetCustomAttribute()?.Name ?? enumValue.ToString(); } } - + } diff --git a/src/WorkFlowCheck.Web/Services/Interfaces/ICheckListService.cs b/src/WorkFlowCheck.Web/Services/Interfaces/ICheckListService.cs index 20df9b4..bc92bb7 100644 --- a/src/WorkFlowCheck.Web/Services/Interfaces/ICheckListService.cs +++ b/src/WorkFlowCheck.Web/Services/Interfaces/ICheckListService.cs @@ -8,6 +8,7 @@ namespace WorkFlowCheck.Web.Services.Interfaces Task GetCheckListHeader(int id); Task> GetAllCheckListHeaderAsync(); Task> UpdateCheckListHeader(CheckListHeaderDTO checkListHeaderDTO); + Task> CreatePDF(int id); Task GetCheckListTemplateHeader(int id); Task> GetAllCheckListTemplateHeaderAsync();