Compare commits
	
		
			1 Commits
		
	
	
		
			05-23-b
			...
			65a433e9ab
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 65a433e9ab | 
| @ -1,6 +1,7 @@ | |||||||
| using System; | using System; | ||||||
| using System.Collections.Generic; | using System.Collections.Generic; | ||||||
| using System.Configuration; | using System.Configuration; | ||||||
|  | using System.IO; | ||||||
| using System.Linq; | using System.Linq; | ||||||
| using System.Web; | using System.Web; | ||||||
| using System.Web.Mvc; | using System.Web.Mvc; | ||||||
| @ -21,7 +22,7 @@ namespace Fab2ApprovalSystem.Controllers; | |||||||
| [Authorize] | [Authorize] | ||||||
| [OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")] | [OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")] | ||||||
| [SessionExpireFilter] | [SessionExpireFilter] | ||||||
| public class ECNController : PdfViewController { | public class ECNController : Controller { | ||||||
|  |  | ||||||
|     private const string ECN_PREFIX = "ECN_"; |     private const string ECN_PREFIX = "ECN_"; | ||||||
|     private const string TECN_PREFIX = "TECN_"; |     private const string TECN_PREFIX = "TECN_"; | ||||||
| @ -669,9 +670,6 @@ public class ECNController : PdfViewController { | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /// <summary> |  | ||||||
|     /// Get a list of Approvers and the status |  | ||||||
|     /// </summary> |  | ||||||
|     public ActionResult GetApproversList([DataSourceRequest] DataSourceRequest request, int issueID, byte step, bool isTECN, bool isEmergrncyTECN) { |     public ActionResult GetApproversList([DataSourceRequest] DataSourceRequest request, int issueID, byte step, bool isTECN, bool isEmergrncyTECN) { | ||||||
|         int isITARCompliant = 0; |         int isITARCompliant = 0; | ||||||
|         ECN ecn = new ECN(); |         ECN ecn = new ECN(); | ||||||
| @ -893,10 +891,12 @@ public class ECNController : PdfViewController { | |||||||
|             if (!di.Exists) |             if (!di.Exists) | ||||||
|                 di.Create(); |                 di.Create(); | ||||||
|  |  | ||||||
|             // To render a PDF instead of an HTML, all we need to do is call ViewPdf instead of View. This |             string htmlText; | ||||||
|             // requires the controller to be inherited from MyController instead of MVC's Controller. |             string pageTitle = string.Empty; | ||||||
|             SavePdf(ecnFolderPath + "\\ECNForm_" + outputFileName, "ECNPdf", ecn); |             htmlText = RenderViewToString("ECNPdf", ecn); | ||||||
|             SavePdf(ecnFolderPath + "\\ECNApprovalLog_" + outputFileName, "ECNApprovalPdf", ecn); |             StandardPdfRenderer.WritePortableDocumentFormatToFile(pageTitle, htmlText, $"{ecnFolderPath}\\ECNForm_{outputFileName}"); | ||||||
|  |             htmlText = RenderViewToString("ECNApprovalPdf", ecn); | ||||||
|  |             StandardPdfRenderer.WritePortableDocumentFormatToFile(pageTitle, htmlText, $"{ecnFolderPath}\\ECNApprovalLog_{outputFileName}"); | ||||||
|         } catch (Exception ex) { |         } catch (Exception ex) { | ||||||
|             EventLogDMO.Add(new WinEventLog() { IssueID = ecnNumber, UserID = @User.Identity.Name, DocumentType = "ECN", OperationType = "Generate PDF", Comments = ex.Message }); |             EventLogDMO.Add(new WinEventLog() { IssueID = ecnNumber, UserID = @User.Identity.Name, DocumentType = "ECN", OperationType = "Generate PDF", Comments = ex.Message }); | ||||||
|             ecn = null; |             ecn = null; | ||||||
| @ -906,6 +906,24 @@ public class ECNController : PdfViewController { | |||||||
|         return true; |         return true; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     private string RenderViewToString(string viewName, ECNPdf ecnPdf) { | ||||||
|  |         string result; | ||||||
|  |         ViewData.Model = ecnPdf; | ||||||
|  |         using (StringWriter writer = new()) { | ||||||
|  |             try { | ||||||
|  |                 ViewEngineResult viewResult = ViewEngines.Engines.FindView(ControllerContext, viewName, string.Empty); | ||||||
|  |                 if (viewResult is null) | ||||||
|  |                     return $"A view with the name '{viewName}' could not be found"; | ||||||
|  |                 ViewContext viewContext = new(ControllerContext, viewResult.View, ViewData, TempData, writer); | ||||||
|  |                 viewResult.View.Render(viewContext, writer); | ||||||
|  |                 result = writer.GetStringBuilder().ToString(); | ||||||
|  |             } catch (Exception ex) { | ||||||
|  |                 result = $"Failed - {ex.Message}"; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         return result; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     public bool GenerateECNPdfDifferentLocation(int ecnNumber, int folderName) { |     public bool GenerateECNPdfDifferentLocation(int ecnNumber, int folderName) { | ||||||
|         ECNPdf ecn = new ECNPdf(); |         ECNPdf ecn = new ECNPdf(); | ||||||
|         try { |         try { | ||||||
| @ -923,9 +941,9 @@ public class ECNController : PdfViewController { | |||||||
|             if (!di.Exists) |             if (!di.Exists) | ||||||
|                 di.Create(); |                 di.Create(); | ||||||
|  |  | ||||||
|             // To render a PDF instead of an HTML, all we need to do is call ViewPdf instead of View. This |             string pageTitle = string.Empty; | ||||||
|             // requires the controller to be inherited from MyController instead of MVC's Controller. |             string htmlText = RenderViewToString("ECNPdf", ecn); | ||||||
|             SavePdf(ecnFolderPath + "\\ECNForm_" + outputFileName, "ECNPdf", ecn); |             StandardPdfRenderer.WritePortableDocumentFormatToFile(pageTitle, htmlText, $"{ecnFolderPath}\\ECNForm_{outputFileName}"); | ||||||
|         } catch (Exception ex) { |         } catch (Exception ex) { | ||||||
|             EventLogDMO.Add(new WinEventLog() { IssueID = ecnNumber, UserID = @User.Identity.Name, DocumentType = "ECN", OperationType = "Generate PDF", Comments = ex.Message }); |             EventLogDMO.Add(new WinEventLog() { IssueID = ecnNumber, UserID = @User.Identity.Name, DocumentType = "ECN", OperationType = "Generate PDF", Comments = ex.Message }); | ||||||
|             ecn = null; |             ecn = null; | ||||||
| @ -941,9 +959,14 @@ public class ECNController : PdfViewController { | |||||||
|             ecn = ecnDMO.GetECNPdf(ecnNumber); |             ecn = ecnDMO.GetECNPdf(ecnNumber); | ||||||
|             ViewBag.Category = ecnDMO.GetCategoryID(ecn); |             ViewBag.Category = ecnDMO.GetCategoryID(ecn); | ||||||
|             ViewBag.TrainingNotificationTo = ecnDMO.GetTrainingNotificationTo(ecn, trainingDMO); |             ViewBag.TrainingNotificationTo = ecnDMO.GetTrainingNotificationTo(ecn, trainingDMO); | ||||||
|             // To render a PDF instead of an HTML, all we need to do is call ViewPdf instead of View. This |             string pageTitle = string.Empty; | ||||||
|             // requires the controller to be inherited from MyController instead of MVC's Controller. |             string htmlText = RenderViewToString("ECNPdf", ecn); | ||||||
|             return this.ViewPdf("", "ECNPdf", ecn); |             if (System.Diagnostics.Debugger.IsAttached) { | ||||||
|  |                 return Content(htmlText, "text/html"); | ||||||
|  |             } else { | ||||||
|  |                 byte[] buffer = StandardPdfRenderer.GetPortableDocumentFormatBytes(pageTitle, htmlText); | ||||||
|  |                 return new BinaryContentResult(buffer, "application/pdf"); | ||||||
|  |             } | ||||||
|         } catch (Exception ex) { |         } catch (Exception ex) { | ||||||
|             EventLogDMO.Add(new WinEventLog() { IssueID = ecnNumber, UserID = @User.Identity.Name, DocumentType = "ECN", OperationType = "Print PDF", Comments = ex.Message }); |             EventLogDMO.Add(new WinEventLog() { IssueID = ecnNumber, UserID = @User.Identity.Name, DocumentType = "ECN", OperationType = "Print PDF", Comments = ex.Message }); | ||||||
|             ecn = null; |             ecn = null; | ||||||
|  | |||||||
| @ -1,6 +1,7 @@ | |||||||
| using System; | using System; | ||||||
| using System.Collections.Generic; | using System.Collections.Generic; | ||||||
| using System.Configuration; | using System.Configuration; | ||||||
|  | using System.IO; | ||||||
| using System.Linq; | using System.Linq; | ||||||
| using System.Threading; | using System.Threading; | ||||||
| using System.Web; | using System.Web; | ||||||
| @ -20,7 +21,7 @@ namespace Fab2ApprovalSystem.Controllers; | |||||||
| [Authorize] | [Authorize] | ||||||
| [OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")] | [OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")] | ||||||
| [SessionExpireFilter] | [SessionExpireFilter] | ||||||
| public class LotTravelerController : PdfViewController { | public class LotTravelerController : Controller { | ||||||
|  |  | ||||||
|     LotTravelerDMO LotTravDMO = new LotTravelerDMO(); |     LotTravelerDMO LotTravDMO = new LotTravelerDMO(); | ||||||
|     string docTypeString = "LotTraveler"; |     string docTypeString = "LotTraveler"; | ||||||
| @ -199,9 +200,14 @@ public class LotTravelerController : PdfViewController { | |||||||
|         try { |         try { | ||||||
|             workRequest = LotTravDMO.GetLTWorkRequestItemPDF(workRequestID); |             workRequest = LotTravDMO.GetLTWorkRequestItemPDF(workRequestID); | ||||||
|  |  | ||||||
|             // To render a PDF instead of an HTML, all we need to do is call ViewPdf instead of View. This |             string pageTitle = string.Empty; | ||||||
|             // requires the controller to be inherited from MyController instead of MVC's Controller. |             string htmlText = RenderViewToString("WorkRequestPDF", workRequest); | ||||||
|             return this.ViewPdf("", "WorkRequestPDF", workRequest); |             if (System.Diagnostics.Debugger.IsAttached) { | ||||||
|  |                 return Content(htmlText, "text/html"); | ||||||
|  |             } else { | ||||||
|  |                 byte[] buffer = StandardPdfRenderer.GetPortableDocumentFormatBytes(pageTitle, htmlText); | ||||||
|  |                 return new BinaryContentResult(buffer, "application/pdf"); | ||||||
|  |             } | ||||||
|         } catch (Exception ex) { |         } catch (Exception ex) { | ||||||
|             Functions.WriteEvent(_AppSettings, @User.Identity.Name + "\r\n DisplayWorkRequestPDF - LotTraveler\r\n" + ex.InnerException.ToString(), System.Diagnostics.EventLogEntryType.Error); |             Functions.WriteEvent(_AppSettings, @User.Identity.Name + "\r\n DisplayWorkRequestPDF - LotTraveler\r\n" + ex.InnerException.ToString(), System.Diagnostics.EventLogEntryType.Error); | ||||||
|             EventLogDMO.Add(new WinEventLog() { IssueID = workRequest.SWRNumber, UserID = @User.Identity.Name, DocumentType = "LotTravler", OperationType = "Generate PDF", Comments = ex.Message }); |             EventLogDMO.Add(new WinEventLog() { IssueID = workRequest.SWRNumber, UserID = @User.Identity.Name, DocumentType = "LotTravler", OperationType = "Generate PDF", Comments = ex.Message }); | ||||||
| @ -210,6 +216,24 @@ public class LotTravelerController : PdfViewController { | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     private string RenderViewToString(string viewName, object model) { | ||||||
|  |         string result; | ||||||
|  |         ViewData.Model = model; | ||||||
|  |         using (StringWriter writer = new()) { | ||||||
|  |             try { | ||||||
|  |                 ViewEngineResult viewResult = ViewEngines.Engines.FindView(ControllerContext, viewName, string.Empty); | ||||||
|  |                 if (viewResult is null) | ||||||
|  |                     return $"A view with the name '{viewName}' could not be found"; | ||||||
|  |                 ViewContext viewContext = new(ControllerContext, viewResult.View, ViewData, TempData, writer); | ||||||
|  |                 viewResult.View.Render(viewContext, writer); | ||||||
|  |                 result = writer.GetStringBuilder().ToString(); | ||||||
|  |             } catch (Exception ex) { | ||||||
|  |                 result = $"Failed - {ex.Message}"; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         return result; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     public ActionResult WorkRequestRevision(int workRequestID) { |     public ActionResult WorkRequestRevision(int workRequestID) { | ||||||
|         int isITARCompliant = 1; |         int isITARCompliant = 1; | ||||||
|         LTWorkRequest workRequest = new LTWorkRequest(); |         LTWorkRequest workRequest = new LTWorkRequest(); | ||||||
| @ -251,9 +275,7 @@ public class LotTravelerController : PdfViewController { | |||||||
|  |  | ||||||
|         return Content("Successfully Saved"); |         return Content("Successfully Saved"); | ||||||
|     } |     } | ||||||
|     /// <summary> |  | ||||||
|     ///  |  | ||||||
|     /// </summary> |  | ||||||
|     public JsonResult GetBaseFlowLocations(string baseFlow) { |     public JsonResult GetBaseFlowLocations(string baseFlow) { | ||||||
|         List<BaseFlowLocation> loclist = LotTravDMO.GetBaseFlowLocations(baseFlow); |         List<BaseFlowLocation> loclist = LotTravDMO.GetBaseFlowLocations(baseFlow); | ||||||
|         return Json(loclist, JsonRequestBehavior.AllowGet); |         return Json(loclist, JsonRequestBehavior.AllowGet); | ||||||
| @ -332,9 +354,6 @@ public class LotTravelerController : PdfViewController { | |||||||
|         return Content(newWorkRequestID.ToString()); |         return Content(newWorkRequestID.ToString()); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /// <summary> |  | ||||||
|     /// For the Revison |  | ||||||
|     /// </summary> |  | ||||||
|     public ActionResult UpdateMaterialDetailRevision(LTWorkRequest model) { |     public ActionResult UpdateMaterialDetailRevision(LTWorkRequest model) { | ||||||
|         var modelMaterialDetail = model.LTMaterial; |         var modelMaterialDetail = model.LTMaterial; | ||||||
|         int previousMaterialID = model.LTMaterial.ID; |         int previousMaterialID = model.LTMaterial.ID; | ||||||
| @ -1232,15 +1251,19 @@ public class LotTravelerController : PdfViewController { | |||||||
|         LotTravDMO.DeleteLot(ltLotID); |         LotTravDMO.DeleteLot(ltLotID); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /// |  | ||||||
|     public ActionResult DisplayLotTravlerPdf(int ltLotID, int revisionNumber) { |     public ActionResult DisplayLotTravlerPdf(int ltLotID, int revisionNumber) { | ||||||
|         LotTravelerPdf traveler = new LotTravelerPdf(); |         LotTravelerPdf traveler = new LotTravelerPdf(); | ||||||
|         try { |         try { | ||||||
|             traveler = LotTravDMO.GetLotTravlerPdf(ltLotID, revisionNumber); |             traveler = LotTravDMO.GetLotTravlerPdf(ltLotID, revisionNumber); | ||||||
|  |  | ||||||
|             // To render a PDF instead of an HTML, all we need to do is call ViewPdf instead of View. This |             string pageTitle = string.Empty; | ||||||
|             // requires the controller to be inherited from MyController instead of MVC's Controller. |             string htmlText = RenderViewToString("LotTravelerPDF", traveler); | ||||||
|             return this.ViewPdf("", "LotTravelerPDF", traveler); |             if (System.Diagnostics.Debugger.IsAttached) { | ||||||
|  |                 return Content(htmlText, "text/html"); | ||||||
|  |             } else { | ||||||
|  |                 byte[] buffer = StandardPdfRenderer.GetPortableDocumentFormatBytes(pageTitle, htmlText); | ||||||
|  |                 return new BinaryContentResult(buffer, "application/pdf"); | ||||||
|  |             } | ||||||
|         } catch (Exception ex) { |         } catch (Exception ex) { | ||||||
|             EventLogDMO.Add(new WinEventLog() { IssueID = traveler.SWRNumber, UserID = @User.Identity.Name, DocumentType = "LotTraveler", OperationType = "Generate PDF", Comments = ex.Message }); |             EventLogDMO.Add(new WinEventLog() { IssueID = traveler.SWRNumber, UserID = @User.Identity.Name, DocumentType = "LotTraveler", OperationType = "Generate PDF", Comments = ex.Message }); | ||||||
|             traveler = null; |             traveler = null; | ||||||
|  | |||||||
| @ -325,9 +325,6 @@ | |||||||
|     <Compile Include="Models\WinEventLogModel.cs" /> |     <Compile Include="Models\WinEventLogModel.cs" /> | ||||||
|     <Compile Include="Models\WorkFlowModels.cs" /> |     <Compile Include="Models\WorkFlowModels.cs" /> | ||||||
|     <Compile Include="PdfGenerator\BinaryContentResult.cs" /> |     <Compile Include="PdfGenerator\BinaryContentResult.cs" /> | ||||||
|     <Compile Include="PdfGenerator\FakeView.cs" /> |  | ||||||
|     <Compile Include="PdfGenerator\HtmlViewRenderer.cs" /> |  | ||||||
|     <Compile Include="PdfGenerator\PdfViewController.cs" /> |  | ||||||
|     <Compile Include="PdfGenerator\PrintHeaderFooter.cs" /> |     <Compile Include="PdfGenerator\PrintHeaderFooter.cs" /> | ||||||
|     <Compile Include="PdfGenerator\StandardPdfRenderer.cs" /> |     <Compile Include="PdfGenerator\StandardPdfRenderer.cs" /> | ||||||
|     <Compile Include="Properties\AssemblyInfo.cs" /> |     <Compile Include="Properties\AssemblyInfo.cs" /> | ||||||
|  | |||||||
| @ -1,28 +0,0 @@ | |||||||
| #if !NET8 |  | ||||||
|  |  | ||||||
| // -------------------------------------------------------------------------------------------------------------------- |  | ||||||
| // <copyright file="FakeView.cs" company="SemanticArchitecture"> |  | ||||||
| //   http://www.SemanticArchitecture.net pkalkie@gmail.com |  | ||||||
| // </copyright> |  | ||||||
| // <summary> |  | ||||||
| //   Defines the FakeView type. |  | ||||||
| // </summary> |  | ||||||
| // -------------------------------------------------------------------------------------------------------------------- |  | ||||||
|  |  | ||||||
| namespace Fab2ApprovalSystem.PdfGenerator { |  | ||||||
|     using System; |  | ||||||
|     using System.IO; |  | ||||||
|     using System.Web.Mvc; |  | ||||||
|  |  | ||||||
|     public class FakeView : IView { |  | ||||||
|         #region IView Members |  | ||||||
|  |  | ||||||
|         public void Render(ViewContext viewContext, TextWriter writer) { |  | ||||||
|             throw new NotImplementedException(); |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         #endregion |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| #endif |  | ||||||
| @ -1,49 +0,0 @@ | |||||||
| #if !NET8 |  | ||||||
|  |  | ||||||
| // -------------------------------------------------------------------------------------------------------------------- |  | ||||||
| // <copyright file="HtmlViewRenderer.cs" company="SemanticArchitecture"> |  | ||||||
| //   http://www.SemanticArchitecture.net pkalkie@gmail.com |  | ||||||
| // </copyright> |  | ||||||
| // <summary> |  | ||||||
| //   This class is responsible for rendering a HTML view to a string. |  | ||||||
| // </summary> |  | ||||||
| // -------------------------------------------------------------------------------------------------------------------- |  | ||||||
|  |  | ||||||
| namespace Fab2ApprovalSystem.PdfGenerator { |  | ||||||
|     using System.IO; |  | ||||||
|     using System.Text; |  | ||||||
|     using System.Web; |  | ||||||
|     using System.Web.Mvc; |  | ||||||
|     using System.Web.Mvc.Html; |  | ||||||
|  |  | ||||||
|     /// <summary> |  | ||||||
|     /// This class is responsible for rendering a HTML view into a string.  |  | ||||||
|     /// </summary> |  | ||||||
|     public class HtmlViewRenderer { |  | ||||||
|         public string RenderViewToString(Controller controller, string viewName, object viewData) { |  | ||||||
|             var renderedView = new StringBuilder(); |  | ||||||
|             using (var responseWriter = new StringWriter(renderedView)) { |  | ||||||
|                 var fakeResponse = new HttpResponse(responseWriter); |  | ||||||
|                 var fakeContext = new HttpContext(HttpContext.Current.Request, fakeResponse); |  | ||||||
|                 var fakeControllerContext = new ControllerContext(new HttpContextWrapper(fakeContext), controller.ControllerContext.RouteData, controller.ControllerContext.Controller); |  | ||||||
|  |  | ||||||
|                 var oldContext = HttpContext.Current; |  | ||||||
|                 HttpContext.Current = fakeContext; |  | ||||||
|  |  | ||||||
|                 using (var viewPage = new ViewPage()) { |  | ||||||
|                     var html = new HtmlHelper(CreateViewContext(responseWriter, fakeControllerContext), viewPage); |  | ||||||
|                     html.RenderPartial(viewName, viewData); |  | ||||||
|                     HttpContext.Current = oldContext; |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|  |  | ||||||
|             return renderedView.ToString(); |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         private static ViewContext CreateViewContext(TextWriter responseWriter, ControllerContext fakeControllerContext) { |  | ||||||
|             return new ViewContext(fakeControllerContext, new FakeView(), new ViewDataDictionary(), new TempDataDictionary(), responseWriter); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| #endif |  | ||||||
| @ -1,54 +0,0 @@ | |||||||
| #if !NET8 |  | ||||||
|  |  | ||||||
| // -------------------------------------------------------------------------------------------------------------------- |  | ||||||
| // <copyright file="PdfViewController.cs" company="SemanticArchitecture"> |  | ||||||
| //   http://www.SemanticArchitecture.net pkalkie@gmail.com |  | ||||||
| // </copyright> |  | ||||||
| // <summary> |  | ||||||
| //   Extends the controller with functionality for rendering PDF views |  | ||||||
| // </summary> |  | ||||||
| // -------------------------------------------------------------------------------------------------------------------- |  | ||||||
|  |  | ||||||
| namespace Fab2ApprovalSystem.PdfGenerator { |  | ||||||
|     using System.Web.Mvc; |  | ||||||
|     using System.IO; |  | ||||||
|  |  | ||||||
|     /// <summary> |  | ||||||
|     /// Extends the controller with functionality for rendering PDF views |  | ||||||
|     /// </summary> |  | ||||||
|     public class PdfViewController : Controller { |  | ||||||
|         private readonly HtmlViewRenderer htmlViewRenderer; |  | ||||||
|         private readonly StandardPdfRenderer standardPdfRenderer; |  | ||||||
|  |  | ||||||
|         public PdfViewController() { |  | ||||||
|             this.htmlViewRenderer = new HtmlViewRenderer(); |  | ||||||
|             this.standardPdfRenderer = new StandardPdfRenderer(); |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         protected ActionResult ViewPdf(string pageTitle, string viewName, object model) { |  | ||||||
|             // Render the view html to a string. |  | ||||||
|             string htmlText = this.htmlViewRenderer.RenderViewToString(this, viewName, model); |  | ||||||
|  |  | ||||||
|             // Let the html be rendered into a PDF document through iTextSharp. |  | ||||||
|             byte[] buffer = standardPdfRenderer.Render(htmlText, pageTitle); |  | ||||||
|  |  | ||||||
|             // Return the PDF as a binary stream to the client. |  | ||||||
|             return new BinaryContentResult(buffer, "application/pdf"); |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         protected void SavePdf(string fileName, string viewName, object model) { |  | ||||||
|             // Render the view html to a string. |  | ||||||
|             string htmlText = this.htmlViewRenderer.RenderViewToString(this, viewName, model); |  | ||||||
|  |  | ||||||
|             // Let the html be rendered into a PDF document through iTextSharp. |  | ||||||
|             byte[] buffer = standardPdfRenderer.Render(htmlText, ""); |  | ||||||
|  |  | ||||||
|             using (FileStream fs = new FileStream(fileName, FileMode.Create)) { |  | ||||||
|                 fs.Write(buffer, 0, buffer.Length); |  | ||||||
|             } |  | ||||||
|  |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| #endif |  | ||||||
| @ -1,27 +1,38 @@ | |||||||
| #if !NET8 |  | ||||||
| using iTextSharp.text; | using iTextSharp.text; | ||||||
| using iTextSharp.text.html.simpleparser; | using iTextSharp.text.html.simpleparser; | ||||||
| using iTextSharp.text.pdf; | using iTextSharp.text.pdf; | ||||||
| #endif |  | ||||||
|  |  | ||||||
| using System.IO; | using System.IO; | ||||||
|  |  | ||||||
| namespace Fab2ApprovalSystem.PdfGenerator; | namespace Fab2ApprovalSystem.PdfGenerator; | ||||||
|  |  | ||||||
| /// <summary> |  | ||||||
| /// This class is responsible for rendering a html text string to a PDF document using the html renderer of iTextSharp. |  | ||||||
| /// </summary> |  | ||||||
| public class StandardPdfRenderer { | public class StandardPdfRenderer { | ||||||
|  |  | ||||||
|     private const int HorizontalMargin = 40; |     private const int HorizontalMargin = 40; | ||||||
|     private const int VerticalMargin = 40; |     private const int VerticalMargin = 40; | ||||||
|  |  | ||||||
|     public byte[] Render(string htmlText, string pageTitle) { |     public static byte[] GetPortableDocumentFormatBytes(string pageTitle, string htmlText) { | ||||||
|         byte[] renderedBuffer; |         byte[] results; | ||||||
|  |         using (MemoryStream memoryStream = GetPortableDocumentFormat(pageTitle, htmlText)) { | ||||||
|  |             results = new byte[memoryStream.Position]; | ||||||
|  |             memoryStream.Position = 0; | ||||||
|  |             memoryStream.Read(results, 0, results.Length); | ||||||
|  |         } | ||||||
|  |         return results; | ||||||
|  |     } | ||||||
|  |  | ||||||
|         using (MemoryStream outputMemoryStream = new()) { |     public static void WritePortableDocumentFormatToFile(string pageTitle, string htmlText, string path) { | ||||||
| #if !NET8 |         using (MemoryStream memoryStream = GetPortableDocumentFormat(pageTitle, htmlText)) { | ||||||
|  |             using (FileStream fileStream = new(path, FileMode.Create)) { | ||||||
|  |                 memoryStream.CopyTo(fileStream); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public static MemoryStream GetPortableDocumentFormat(string pageTitle, string htmlText) { | ||||||
|  |         MemoryStream result = new(); | ||||||
|         using (Document pdfDocument = new Document(PageSize.A4, HorizontalMargin, HorizontalMargin, VerticalMargin, VerticalMargin)) { |         using (Document pdfDocument = new Document(PageSize.A4, HorizontalMargin, HorizontalMargin, VerticalMargin, VerticalMargin)) { | ||||||
|                 PdfWriter pdfWriter = PdfWriter.GetInstance(pdfDocument, outputMemoryStream); |             using (PdfWriter pdfWriter = PdfWriter.GetInstance(pdfDocument, result)) { | ||||||
|                 pdfWriter.CloseStream = false; |                 pdfWriter.CloseStream = false; | ||||||
|                 pdfWriter.PageEvent = new PrintHeaderFooter { Title = pageTitle }; |                 pdfWriter.PageEvent = new PrintHeaderFooter { Title = pageTitle }; | ||||||
|                 pdfDocument.Open(); |                 pdfDocument.Open(); | ||||||
| @ -30,15 +41,9 @@ public class StandardPdfRenderer { | |||||||
|                         htmlWorker.Parse(htmlViewReader); |                         htmlWorker.Parse(htmlViewReader); | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|  |  | ||||||
|             } |             } | ||||||
| #endif |         } | ||||||
|  |         return result; | ||||||
|             renderedBuffer = new byte[outputMemoryStream.Position]; |  | ||||||
|             outputMemoryStream.Position = 0; |  | ||||||
|             outputMemoryStream.Read(renderedBuffer, 0, renderedBuffer.Length); |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|         return renderedBuffer; |  | ||||||
|     } |  | ||||||
| } | } | ||||||
| @ -1,5 +1,19 @@ | |||||||
| @model Fab2ApprovalSystem.ViewModels.ECNPdf | @model Fab2ApprovalSystem.ViewModels.ECNPdf | ||||||
| <table style="width:100%;"> | @{ | ||||||
|  |     Layout = null; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | <!DOCTYPE html> | ||||||
|  |  | ||||||
|  | <head> | ||||||
|  |     <meta charset="utf-8" /> | ||||||
|  |     <meta name="viewport" content="width=device-width, initial-scale=1.0"> | ||||||
|  |     <meta http-equiv="X-UA-Compatible" content="IE=edge"> | ||||||
|  |     <title></title> | ||||||
|  | </head> | ||||||
|  |  | ||||||
|  | <body class="navbar-inner"> | ||||||
|  |     <table style="width:100%;"> | ||||||
|         <tr> |         <tr> | ||||||
|             <td> |             <td> | ||||||
|                 <table cellpadding="3" cellspacing="3" border="1"> |                 <table cellpadding="3" cellspacing="3" border="1"> | ||||||
| @ -107,7 +121,6 @@ | |||||||
|                             </table> |                             </table> | ||||||
|                         </td> |                         </td> | ||||||
|                     </tr> |                     </tr> | ||||||
|  |  | ||||||
|                 </table> |                 </table> | ||||||
|             </td> |             </td> | ||||||
|         </tr> |         </tr> | ||||||
| @ -227,7 +240,6 @@ | |||||||
|                         </td> |                         </td> | ||||||
|                     </tr> |                     </tr> | ||||||
|  |  | ||||||
|  |  | ||||||
|                 </table> |                 </table> | ||||||
|             </td> |             </td> | ||||||
|         </tr> |         </tr> | ||||||
| @ -254,35 +266,6 @@ | |||||||
|                 </table> |                 </table> | ||||||
|             </td> |             </td> | ||||||
|         </tr> |         </tr> | ||||||
|     @*<tr> |  | ||||||
|     <td> |  | ||||||
|  |  | ||||||
|     <table border="1"> |  | ||||||
|     <tr bgcolor="#c4baba" color="#000000"> |  | ||||||
|     <td colspan="3">Training Notification</td> |  | ||||||
|     </tr> |  | ||||||
|     <tr> |  | ||||||
|     <td> |  | ||||||
|     <table border="0"> |  | ||||||
|     <tr> |  | ||||||
|     <td> |  | ||||||
|     <font size="1"> |  | ||||||
|     Training: |  | ||||||
|     @(Model.TrainingRequired ? "Yes" : "No") |  | ||||||
|     </font> |  | ||||||
|  |  | ||||||
|     <font size="1"> |  | ||||||
|     @(Model.TrainingBy.Length > 0 ? "(" + Model.TrainingBy + ")" : Model.TrainingBy) |  | ||||||
|     </font> |  | ||||||
|     </td> |  | ||||||
|     </tr> |  | ||||||
|     </table> |  | ||||||
|     </td> |  | ||||||
|     </tr> |  | ||||||
|     </table> |  | ||||||
|  |  | ||||||
|     </td> |  | ||||||
|     </tr>*@ |  | ||||||
|         <tr> |         <tr> | ||||||
|             <td> |             <td> | ||||||
|  |  | ||||||
| @ -338,10 +321,8 @@ | |||||||
|                             </font> |                             </font> | ||||||
|                         </td> |                         </td> | ||||||
|                     </tr> |                     </tr> | ||||||
|  |  | ||||||
|                 </table> |                 </table> | ||||||
|  |  | ||||||
|  |  | ||||||
|             </td> |             </td> | ||||||
|         </tr> |         </tr> | ||||||
|         <tr> |         <tr> | ||||||
| @ -349,7 +330,7 @@ | |||||||
|  |  | ||||||
|                 <table border="1"> |                 <table border="1"> | ||||||
|                     <tr bgcolor="#c4baba" color="#000000"> |                     <tr bgcolor="#c4baba" color="#000000"> | ||||||
|                     <td colspan="5">Training Notification</td> |                         <td colspan="1">Training Notification</td> | ||||||
|                     </tr> |                     </tr> | ||||||
|                     <tr style="display:block;"> |                     <tr style="display:block;"> | ||||||
|                         <td> |                         <td> | ||||||
| @ -367,10 +348,8 @@ | |||||||
|                             </font> |                             </font> | ||||||
|                         </td> |                         </td> | ||||||
|                     </tr> |                     </tr> | ||||||
|  |  | ||||||
|                 </table> |                 </table> | ||||||
|  |  | ||||||
|  |  | ||||||
|             </td> |             </td> | ||||||
|         </tr> |         </tr> | ||||||
|         <tr> |         <tr> | ||||||
| @ -517,19 +496,11 @@ | |||||||
|                         </tr> |                         </tr> | ||||||
|                     } |                     } | ||||||
|  |  | ||||||
|  |  | ||||||
|                 </table> |                 </table> | ||||||
|             </td> |             </td> | ||||||
|         </tr> |         </tr> | ||||||
|  |  | ||||||
|  |     </table> | ||||||
|  | </body> | ||||||
|  |  | ||||||
| </table> <!--main table --> | </html> | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
		Reference in New Issue
	
	Block a user