diff --git a/src/Business/Grand.Business.Common/Services/Pdf/HtmlToPdfService.cs b/src/Business/Grand.Business.Common/Services/Pdf/HtmlToPdfService.cs index d6f107098..e5daab2c8 100644 --- a/src/Business/Grand.Business.Common/Services/Pdf/HtmlToPdfService.cs +++ b/src/Business/Grand.Business.Common/Services/Pdf/HtmlToPdfService.cs @@ -6,6 +6,7 @@ using Grand.Domain.Shipping; using Grand.SharedKernel.Extensions; using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Logging; using Scryber; using Scryber.Components; using Path = System.IO.Path; @@ -21,18 +22,21 @@ public class HtmlToPdfService : IPdfService private const string ShipmentsTemplate = "~/Views/PdfTemplates/ShipmentPdfTemplate.cshtml"; private readonly IRepository _downloadRepository; private readonly ILanguageService _languageService; + private readonly ILogger _logger; private readonly IStoreFilesContext _storeFilesContext; private readonly IViewRenderService _viewRenderService; private readonly IWebHostEnvironment _webHostEnvironment; public HtmlToPdfService(IViewRenderService viewRenderService, IRepository downloadRepository, - ILanguageService languageService, IStoreFilesContext storeFilesContext, IWebHostEnvironment webHostEnvironment) + ILanguageService languageService, IStoreFilesContext storeFilesContext, IWebHostEnvironment webHostEnvironment, + ILogger logger) { _viewRenderService = viewRenderService; _languageService = languageService; _downloadRepository = downloadRepository; _storeFilesContext = storeFilesContext; _webHostEnvironment = webHostEnvironment; + _logger = logger; } public async Task PrintOrdersToPdf(Stream stream, IList orders, string languageId = "", @@ -43,9 +47,17 @@ public async Task PrintOrdersToPdf(Stream stream, IList orders, string la var html = await _viewRenderService.RenderToStringAsync(OrderTemplate, new ValueTuple, string>(orders, vendorId)); - TextReader sr = new StringReader(html); - using var doc = Document.ParseDocument(sr, ParseSourceType.DynamicContent); - doc.SaveAsPDF(stream); + try + { + TextReader sr = new StringReader(html); + using var doc = Document.ParseDocument(sr, ParseSourceType.DynamicContent); + doc.SaveAsPDF(stream); + } + catch (Exception ex) + { + _logger.LogError(ex, "Error generating PDF from order HTML. HTML content: {Html}", html); + throw; + } } public async Task PrintOrderToPdf(Order order, string languageId, string vendorId = "") @@ -78,9 +90,17 @@ public async Task PrintPackagingSlipsToPdf(Stream stream, IList shipme throw new ArgumentException($"Cannot load language. ID={languageId}"); var html = await _viewRenderService.RenderToStringAsync(ShipmentsTemplate, shipments); - TextReader sr = new StringReader(html); - using var doc = Document.ParseDocument(sr, ParseSourceType.DynamicContent); - doc.SaveAsPDF(stream); + try + { + TextReader sr = new StringReader(html); + using var doc = Document.ParseDocument(sr, ParseSourceType.DynamicContent); + doc.SaveAsPDF(stream); + } + catch (Exception ex) + { + _logger.LogError(ex, "Error generating PDF from shipment HTML. HTML content: {Html}", html); + throw; + } } public async Task SaveOrderToBinary(Order order, string languageId, string vendorId = "") diff --git a/src/Web/Grand.Web.Common/ViewRender/ViewRenderService.cs b/src/Web/Grand.Web.Common/ViewRender/ViewRenderService.cs index cf9605427..765934196 100644 --- a/src/Web/Grand.Web.Common/ViewRender/ViewRenderService.cs +++ b/src/Web/Grand.Web.Common/ViewRender/ViewRenderService.cs @@ -7,6 +7,7 @@ using Microsoft.AspNetCore.Mvc.Rendering; using Microsoft.AspNetCore.Mvc.ViewFeatures; using Microsoft.AspNetCore.Routing; +using Microsoft.Extensions.Logging; namespace Grand.Web.Common.ViewRender; @@ -15,6 +16,7 @@ namespace Grand.Web.Common.ViewRender; /// public class ViewRenderService : IViewRenderService { + private readonly ILogger _logger; private readonly IRazorViewEngine _razorViewEngine; private readonly IServiceProvider _serviceProvider; private readonly ITempDataProvider _tempDataProvider; @@ -22,11 +24,13 @@ public class ViewRenderService : IViewRenderService public ViewRenderService(IRazorViewEngine razorViewEngine, ITempDataProvider tempDataProvider, - IServiceProvider serviceProvider) + IServiceProvider serviceProvider, + ILogger logger) { _razorViewEngine = razorViewEngine; _tempDataProvider = tempDataProvider; _serviceProvider = serviceProvider; + _logger = logger; } @@ -53,7 +57,18 @@ public async Task RenderToStringAsync(string viewPath, TModel mo new HtmlHelperOptions() ); - await viewResult.View.RenderAsync(viewContext); + try + { + await viewResult.View.RenderAsync(viewContext); + } + catch (Exception ex) + { + var partialHtmlLength = sw.GetStringBuilder().Length; + _logger.LogError(ex, "Error rendering view '{ViewPath}'. Partial HTML length: {PartialHtmlLength}", + viewPath, partialHtmlLength); + throw; + } + return sw.ToString(); } } \ No newline at end of file