From 739d3c46424257f500a9d58c9a762b9689ba4eff Mon Sep 17 00:00:00 2001 From: Mike Phares Date: Thu, 22 May 2025 15:40:26 -0700 Subject: [PATCH] Removed PdfViewController, HtmlViewRenderer and FakeView to be replaced with ViewEngineResult Render method --- Fab2ApprovalSystem/Content/Site.css | 10 +- .../Controllers/ECNController.cs | 52 +++++-- .../Controllers/LotTravelerController.cs | 52 +++++-- .../PdfGenerator/BinaryContentResult.cs | 70 +++++---- Fab2ApprovalSystem/PdfGenerator/FakeView.cs | 28 ---- .../PdfGenerator/HtmlViewRenderer.cs | 49 ------ .../PdfGenerator/PdfViewController.cs | 55 +------ .../PdfGenerator/PrintHeaderFooter.cs | 147 ++++++++++-------- .../PdfGenerator/StandardPdfRenderer.cs | 63 ++++---- 9 files changed, 241 insertions(+), 285 deletions(-) diff --git a/Fab2ApprovalSystem/Content/Site.css b/Fab2ApprovalSystem/Content/Site.css index 7d1ad82..ab58787 100644 --- a/Fab2ApprovalSystem/Content/Site.css +++ b/Fab2ApprovalSystem/Content/Site.css @@ -112,7 +112,11 @@ input[type="checkbox"].input-validation-error { } .affix { - position: fixed; - top: 55px; - left: 25px; + position: fixed; + top: 55px; + left: 25px; +} + +.navbar-header-hidden { + display: none; } \ No newline at end of file diff --git a/Fab2ApprovalSystem/Controllers/ECNController.cs b/Fab2ApprovalSystem/Controllers/ECNController.cs index b0541e4..5d942be 100644 --- a/Fab2ApprovalSystem/Controllers/ECNController.cs +++ b/Fab2ApprovalSystem/Controllers/ECNController.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Configuration; +using System.IO; using System.Linq; using System.Web; using System.Web.Mvc; @@ -21,7 +22,7 @@ namespace Fab2ApprovalSystem.Controllers; [Authorize] [OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")] [SessionExpireFilter] -public class ECNController : PdfViewController { +public class ECNController : Controller { private const string ECN_PREFIX = "ECN_"; private const string TECN_PREFIX = "TECN_"; @@ -669,9 +670,6 @@ public class ECNController : PdfViewController { } } - /// - /// Get a list of Approvers and the status - /// public ActionResult GetApproversList([DataSourceRequest] DataSourceRequest request, int issueID, byte step, bool isTECN, bool isEmergrncyTECN) { int isITARCompliant = 0; ECN ecn = new ECN(); @@ -893,10 +891,12 @@ public class ECNController : PdfViewController { if (!di.Exists) di.Create(); - // To render a PDF instead of an HTML, all we need to do is call ViewPdf instead of View. This - // requires the controller to be inherited from MyController instead of MVC's Controller. - SavePdf(ecnFolderPath + "\\ECNForm_" + outputFileName, "ECNPdf", ecn); - SavePdf(ecnFolderPath + "\\ECNApprovalLog_" + outputFileName, "ECNApprovalPdf", ecn); + string htmlText; + string pageTitle = string.Empty; + htmlText = RenderViewToString("ECNPdf", ecn); + StandardPdfRenderer.WritePortableDocumentFormatToFile(pageTitle, htmlText, $"{ecnFolderPath}\\ECNForm_{outputFileName}"); + htmlText = RenderViewToString("ECNApprovalPdf", ecn); + StandardPdfRenderer.WritePortableDocumentFormatToFile(pageTitle, htmlText, $"{ecnFolderPath}\\ECNApprovalLog_{outputFileName}"); } catch (Exception ex) { EventLogDMO.Add(new WinEventLog() { IssueID = ecnNumber, UserID = @User.Identity.Name, DocumentType = "ECN", OperationType = "Generate PDF", Comments = ex.Message }); ecn = null; @@ -906,6 +906,25 @@ public class ECNController : PdfViewController { 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); + string htmlText = writer.GetStringBuilder().ToString(); + result = htmlText.Replace("navbar-header", "navbar-header-hidden"); + } catch (Exception ex) { + result = $"Failed - {ex.Message}"; + } + } + return result; + } + public bool GenerateECNPdfDifferentLocation(int ecnNumber, int folderName) { ECNPdf ecn = new ECNPdf(); try { @@ -923,9 +942,9 @@ public class ECNController : PdfViewController { if (!di.Exists) di.Create(); - // To render a PDF instead of an HTML, all we need to do is call ViewPdf instead of View. This - // requires the controller to be inherited from MyController instead of MVC's Controller. - SavePdf(ecnFolderPath + "\\ECNForm_" + outputFileName, "ECNPdf", ecn); + string pageTitle = string.Empty; + string htmlText = RenderViewToString("ECNPdf", ecn); + StandardPdfRenderer.WritePortableDocumentFormatToFile(pageTitle, htmlText, $"{ecnFolderPath}\\ECNForm_{outputFileName}"); } catch (Exception ex) { EventLogDMO.Add(new WinEventLog() { IssueID = ecnNumber, UserID = @User.Identity.Name, DocumentType = "ECN", OperationType = "Generate PDF", Comments = ex.Message }); ecn = null; @@ -941,9 +960,14 @@ public class ECNController : PdfViewController { ecn = ecnDMO.GetECNPdf(ecnNumber); ViewBag.Category = ecnDMO.GetCategoryID(ecn); 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 - // requires the controller to be inherited from MyController instead of MVC's Controller. - return this.ViewPdf("", "ECNPdf", ecn); + string pageTitle = string.Empty; + string htmlText = RenderViewToString("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) { EventLogDMO.Add(new WinEventLog() { IssueID = ecnNumber, UserID = @User.Identity.Name, DocumentType = "ECN", OperationType = "Print PDF", Comments = ex.Message }); ecn = null; diff --git a/Fab2ApprovalSystem/Controllers/LotTravelerController.cs b/Fab2ApprovalSystem/Controllers/LotTravelerController.cs index b1503d7..adb9cf0 100644 --- a/Fab2ApprovalSystem/Controllers/LotTravelerController.cs +++ b/Fab2ApprovalSystem/Controllers/LotTravelerController.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Configuration; +using System.IO; using System.Linq; using System.Threading; using System.Web; @@ -20,7 +21,7 @@ namespace Fab2ApprovalSystem.Controllers; [Authorize] [OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")] [SessionExpireFilter] -public class LotTravelerController : PdfViewController { +public class LotTravelerController : Controller { LotTravelerDMO LotTravDMO = new LotTravelerDMO(); string docTypeString = "LotTraveler"; @@ -199,9 +200,14 @@ public class LotTravelerController : PdfViewController { try { workRequest = LotTravDMO.GetLTWorkRequestItemPDF(workRequestID); - // To render a PDF instead of an HTML, all we need to do is call ViewPdf instead of View. This - // requires the controller to be inherited from MyController instead of MVC's Controller. - return this.ViewPdf("", "WorkRequestPDF", workRequest); + string pageTitle = string.Empty; + string htmlText = RenderViewToString("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) { 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 }); @@ -210,6 +216,25 @@ 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); + string htmlText = writer.GetStringBuilder().ToString(); + result = htmlText.Replace("navbar-header", "navbar-header-hidden"); + } catch (Exception ex) { + result = $"Failed - {ex.Message}"; + } + } + return result; + } + public ActionResult WorkRequestRevision(int workRequestID) { int isITARCompliant = 1; LTWorkRequest workRequest = new LTWorkRequest(); @@ -251,9 +276,7 @@ public class LotTravelerController : PdfViewController { return Content("Successfully Saved"); } - /// - /// - /// + public JsonResult GetBaseFlowLocations(string baseFlow) { List loclist = LotTravDMO.GetBaseFlowLocations(baseFlow); return Json(loclist, JsonRequestBehavior.AllowGet); @@ -332,9 +355,6 @@ public class LotTravelerController : PdfViewController { return Content(newWorkRequestID.ToString()); } - /// - /// For the Revison - /// public ActionResult UpdateMaterialDetailRevision(LTWorkRequest model) { var modelMaterialDetail = model.LTMaterial; int previousMaterialID = model.LTMaterial.ID; @@ -1232,15 +1252,19 @@ public class LotTravelerController : PdfViewController { LotTravDMO.DeleteLot(ltLotID); } - /// public ActionResult DisplayLotTravlerPdf(int ltLotID, int revisionNumber) { LotTravelerPdf traveler = new LotTravelerPdf(); try { 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 - // requires the controller to be inherited from MyController instead of MVC's Controller. - return this.ViewPdf("", "LotTravelerPDF", traveler); + string pageTitle = string.Empty; + string htmlText = RenderViewToString("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) { EventLogDMO.Add(new WinEventLog() { IssueID = traveler.SWRNumber, UserID = @User.Identity.Name, DocumentType = "LotTraveler", OperationType = "Generate PDF", Comments = ex.Message }); traveler = null; diff --git a/Fab2ApprovalSystem/PdfGenerator/BinaryContentResult.cs b/Fab2ApprovalSystem/PdfGenerator/BinaryContentResult.cs index ba08fc7..461925d 100644 --- a/Fab2ApprovalSystem/PdfGenerator/BinaryContentResult.cs +++ b/Fab2ApprovalSystem/PdfGenerator/BinaryContentResult.cs @@ -1,43 +1,47 @@ #if !NET8 +using System.Web; +using System.Web.Mvc; +using System.Web.Security; +#endif -// -------------------------------------------------------------------------------------------------------------------- -// -// http://www.SemanticArchitecture.net pkalkie@gmail.com -// -// -// An ActionResult used to send binary data to the browser. -// -// -------------------------------------------------------------------------------------------------------------------- +#if NET8 +using Microsoft.AspNetCore.Mvc; +#endif -namespace Fab2ApprovalSystem.PdfGenerator { - using System.IO; - using System.Web; - using System.Web.Mvc; +#if !NET8 +using System; +using System.Collections.Generic; +using System.Net; +using System.Net.Http; +using System.Security.Claims; +using System.Threading.Tasks; +using System.IO; +#endif - /// - /// An ActionResult used to send binary data to the browser. - /// - public class BinaryContentResult : ActionResult { - private readonly string contentType; - private readonly byte[] contentBytes; +namespace Fab2ApprovalSystem.PdfGenerator; - public BinaryContentResult(byte[] contentBytes, string contentType) { - this.contentBytes = contentBytes; - this.contentType = contentType; - } +public class BinaryContentResult : ActionResult { + private readonly string contentType; + private readonly byte[] contentBytes; - public override void ExecuteResult(ControllerContext context) { - var response = context.HttpContext.Response; - response.Clear(); - response.Cache.SetCacheability(HttpCacheability.Public); - response.ContentType = this.contentType; + public BinaryContentResult(byte[] contentBytes, string contentType) { + this.contentBytes = contentBytes; + this.contentType = contentType; + } - using (var stream = new MemoryStream(this.contentBytes)) { - stream.WriteTo(response.OutputStream); - stream.Flush(); - } +#if !NET8 + public override void ExecuteResult(ControllerContext context) { + var response = context.HttpContext.Response; + response.Clear(); + response.Cache.SetCacheability(HttpCacheability.Public); + response.ContentType = contentType; + + using (var stream = new MemoryStream(contentBytes)) { + stream.WriteTo(response.OutputStream); + stream.Flush(); } } -} -#endif \ No newline at end of file +#endif + +} \ No newline at end of file diff --git a/Fab2ApprovalSystem/PdfGenerator/FakeView.cs b/Fab2ApprovalSystem/PdfGenerator/FakeView.cs index 1aff427..e69de29 100644 --- a/Fab2ApprovalSystem/PdfGenerator/FakeView.cs +++ b/Fab2ApprovalSystem/PdfGenerator/FakeView.cs @@ -1,28 +0,0 @@ -#if !NET8 - -// -------------------------------------------------------------------------------------------------------------------- -// -// http://www.SemanticArchitecture.net pkalkie@gmail.com -// -// -// Defines the FakeView type. -// -// -------------------------------------------------------------------------------------------------------------------- - -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 \ No newline at end of file diff --git a/Fab2ApprovalSystem/PdfGenerator/HtmlViewRenderer.cs b/Fab2ApprovalSystem/PdfGenerator/HtmlViewRenderer.cs index d3ba69d..e69de29 100644 --- a/Fab2ApprovalSystem/PdfGenerator/HtmlViewRenderer.cs +++ b/Fab2ApprovalSystem/PdfGenerator/HtmlViewRenderer.cs @@ -1,49 +0,0 @@ -#if !NET8 - -// -------------------------------------------------------------------------------------------------------------------- -// -// http://www.SemanticArchitecture.net pkalkie@gmail.com -// -// -// This class is responsible for rendering a HTML view to a string. -// -// -------------------------------------------------------------------------------------------------------------------- - -namespace Fab2ApprovalSystem.PdfGenerator { - using System.IO; - using System.Text; - using System.Web; - using System.Web.Mvc; - using System.Web.Mvc.Html; - - /// - /// This class is responsible for rendering a HTML view into a string. - /// - 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 \ No newline at end of file diff --git a/Fab2ApprovalSystem/PdfGenerator/PdfViewController.cs b/Fab2ApprovalSystem/PdfGenerator/PdfViewController.cs index f55bdef..5f28270 100644 --- a/Fab2ApprovalSystem/PdfGenerator/PdfViewController.cs +++ b/Fab2ApprovalSystem/PdfGenerator/PdfViewController.cs @@ -1,54 +1 @@ -#if !NET8 - -// -------------------------------------------------------------------------------------------------------------------- -// -// http://www.SemanticArchitecture.net pkalkie@gmail.com -// -// -// Extends the controller with functionality for rendering PDF views -// -// -------------------------------------------------------------------------------------------------------------------- - -namespace Fab2ApprovalSystem.PdfGenerator { - using System.Web.Mvc; - using System.IO; - - /// - /// Extends the controller with functionality for rendering PDF views - /// - 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 \ No newline at end of file + \ No newline at end of file diff --git a/Fab2ApprovalSystem/PdfGenerator/PrintHeaderFooter.cs b/Fab2ApprovalSystem/PdfGenerator/PrintHeaderFooter.cs index 00322fc..23af4ef 100644 --- a/Fab2ApprovalSystem/PdfGenerator/PrintHeaderFooter.cs +++ b/Fab2ApprovalSystem/PdfGenerator/PrintHeaderFooter.cs @@ -1,79 +1,102 @@ +#if !NET8 +using System.Web; +using System.Web.Mvc; +using System.Web.Security; +#endif #if !NET8 -namespace Fab2ApprovalSystem.PdfGenerator { - using iTextSharp.text; - using iTextSharp.text.pdf; +using iTextSharp.text; +using iTextSharp.text.pdf; +#endif - using System; +#if !NET8 +using System; +using System.Collections.Generic; +using System.Net; +using System.Net.Http; +using System.Security.Claims; +using System.Threading.Tasks; +#endif - /// - /// This class represents the standard header and footer for a PDF print. - /// application. - /// - public class PrintHeaderFooter : PdfPageEventHelper { - private PdfContentByte pdfContent; - private PdfTemplate pageNumberTemplate; - private BaseFont baseFont; - private DateTime printTime; +namespace Fab2ApprovalSystem.PdfGenerator; - public string Title { get; set; } +#if !NET8 - public override void OnOpenDocument(PdfWriter writer, Document document) { - printTime = DateTime.Now; - baseFont = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED); - pdfContent = writer.DirectContent; - pageNumberTemplate = pdfContent.CreateTemplate(50, 50); - } +public class PrintHeaderFooter : PdfPageEventHelper { - public override void OnStartPage(PdfWriter writer, Document document) { - base.OnStartPage(writer, document); + private PdfContentByte pdfContent; + private PdfTemplate pageNumberTemplate; + private BaseFont baseFont; + private DateTime printTime; +#endif - Rectangle pageSize = document.PageSize; +#if NET8 - if (Title != string.Empty) { - pdfContent.BeginText(); - pdfContent.SetFontAndSize(baseFont, 11); - pdfContent.SetRGBColorFill(0, 0, 0); - pdfContent.SetTextMatrix(pageSize.GetLeft(40), pageSize.GetTop(40)); - pdfContent.ShowText(Title); - pdfContent.EndText(); - } - } +public class PrintHeaderFooter { - public override void OnEndPage(PdfWriter writer, Document document) { - base.OnEndPage(writer, document); +#endif - int pageN = writer.PageNumber; - string text = pageN + " - "; - float len = baseFont.GetWidthPoint(text, 8); + public string Title { get; set; } - Rectangle pageSize = document.PageSize; - pdfContent = writer.DirectContent; - pdfContent.SetRGBColorFill(100, 100, 100); +#if !NET8 + public override void OnOpenDocument(PdfWriter writer, Document document) { + printTime = DateTime.Now; + baseFont = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED); + pdfContent = writer.DirectContent; + pageNumberTemplate = pdfContent.CreateTemplate(50, 50); + } + + public override void OnStartPage(PdfWriter writer, Document document) { + base.OnStartPage(writer, document); + + Rectangle pageSize = document.PageSize; + + if (Title != string.Empty) { pdfContent.BeginText(); - pdfContent.SetFontAndSize(baseFont, 8); - pdfContent.SetTextMatrix(pageSize.Width / 2, pageSize.GetBottom(30)); - pdfContent.ShowText(text); + pdfContent.SetFontAndSize(baseFont, 11); + pdfContent.SetRGBColorFill(0, 0, 0); + pdfContent.SetTextMatrix(pageSize.GetLeft(40), pageSize.GetTop(40)); + pdfContent.ShowText(Title); pdfContent.EndText(); - - pdfContent.AddTemplate(pageNumberTemplate, (pageSize.Width / 2) + len, pageSize.GetBottom(30)); - - pdfContent.BeginText(); - pdfContent.SetFontAndSize(baseFont, 8); - pdfContent.ShowTextAligned(PdfContentByte.ALIGN_RIGHT, printTime.ToString(), pageSize.GetRight(40), pageSize.GetBottom(30), 0); - pdfContent.EndText(); - } - - public override void OnCloseDocument(PdfWriter writer, Document document) { - base.OnCloseDocument(writer, document); - - pageNumberTemplate.BeginText(); - pageNumberTemplate.SetFontAndSize(baseFont, 8); - pageNumberTemplate.SetTextMatrix(0, 0); - pageNumberTemplate.ShowText(string.Empty + (writer.PageNumber - 1)); - pageNumberTemplate.EndText(); } } -} -#endif \ No newline at end of file + + public override void OnEndPage(PdfWriter writer, Document document) { + base.OnEndPage(writer, document); + + int pageN = writer.PageNumber; + string text = pageN + " - "; + float len = baseFont.GetWidthPoint(text, 8); + + Rectangle pageSize = document.PageSize; + pdfContent = writer.DirectContent; + pdfContent.SetRGBColorFill(100, 100, 100); + + pdfContent.BeginText(); + pdfContent.SetFontAndSize(baseFont, 8); + pdfContent.SetTextMatrix(pageSize.Width / 2, pageSize.GetBottom(30)); + pdfContent.ShowText(text); + pdfContent.EndText(); + + pdfContent.AddTemplate(pageNumberTemplate, (pageSize.Width / 2) + len, pageSize.GetBottom(30)); + + pdfContent.BeginText(); + pdfContent.SetFontAndSize(baseFont, 8); + pdfContent.ShowTextAligned(PdfContentByte.ALIGN_RIGHT, printTime.ToString(), pageSize.GetRight(40), pageSize.GetBottom(30), 0); + pdfContent.EndText(); + } + + public override void OnCloseDocument(PdfWriter writer, Document document) { + base.OnCloseDocument(writer, document); + + pageNumberTemplate.BeginText(); + pageNumberTemplate.SetFontAndSize(baseFont, 8); + pageNumberTemplate.SetTextMatrix(0, 0); + pageNumberTemplate.ShowText(string.Empty + (writer.PageNumber - 1)); + pageNumberTemplate.EndText(); + } + +#endif + +} \ No newline at end of file diff --git a/Fab2ApprovalSystem/PdfGenerator/StandardPdfRenderer.cs b/Fab2ApprovalSystem/PdfGenerator/StandardPdfRenderer.cs index 27b0946..241a033 100644 --- a/Fab2ApprovalSystem/PdfGenerator/StandardPdfRenderer.cs +++ b/Fab2ApprovalSystem/PdfGenerator/StandardPdfRenderer.cs @@ -8,37 +8,44 @@ using System.IO; namespace Fab2ApprovalSystem.PdfGenerator; -/// -/// This class is responsible for rendering a html text string to a PDF document using the html renderer of iTextSharp. -/// public class StandardPdfRenderer { + private const int HorizontalMargin = 40; private const int VerticalMargin = 40; - public byte[] Render(string htmlText, string pageTitle) { - byte[] renderedBuffer; - - using (MemoryStream outputMemoryStream = new()) { -#if !NET8 - using (Document pdfDocument = new Document(PageSize.A4, HorizontalMargin, HorizontalMargin, VerticalMargin, VerticalMargin)) { - PdfWriter pdfWriter = PdfWriter.GetInstance(pdfDocument, outputMemoryStream); - pdfWriter.CloseStream = false; - pdfWriter.PageEvent = new PrintHeaderFooter { Title = pageTitle }; - pdfDocument.Open(); - using (StringReader htmlViewReader = new StringReader(htmlText)) { - using (HTMLWorker htmlWorker = new HTMLWorker(pdfDocument)) { - htmlWorker.Parse(htmlViewReader); - } - } - - } -#endif - - renderedBuffer = new byte[outputMemoryStream.Position]; - outputMemoryStream.Position = 0; - outputMemoryStream.Read(renderedBuffer, 0, renderedBuffer.Length); - } - - return renderedBuffer; + public static byte[] GetPortableDocumentFormatBytes(string pageTitle, string htmlText) { + byte[] results; + MemoryStream memoryStream = GetPortableDocumentFormat(pageTitle, htmlText); + results = new byte[memoryStream.Position]; + memoryStream.Position = 0; + memoryStream.Read(results, 0, results.Length); + return results; } + + public static void WritePortableDocumentFormatToFile(string pageTitle, string htmlText, string path) { + using (MemoryStream memoryStream = GetPortableDocumentFormat(pageTitle, htmlText)) { + using (FileStream fileStream = new FileStream(path, FileMode.Create)) { + memoryStream.CopyTo(fileStream); + } + } + } + + public static MemoryStream GetPortableDocumentFormat(string pageTitle, string htmlText) { + MemoryStream result = new(); +#if !NET8 + using (Document pdfDocument = new Document(PageSize.A4, HorizontalMargin, HorizontalMargin, VerticalMargin, VerticalMargin)) { + PdfWriter pdfWriter = PdfWriter.GetInstance(pdfDocument, result); + pdfWriter.CloseStream = false; + pdfWriter.PageEvent = new PrintHeaderFooter { Title = pageTitle }; + pdfDocument.Open(); + using (StringReader htmlViewReader = new StringReader(htmlText)) { + using (HTMLWorker htmlWorker = new HTMLWorker(pdfDocument)) { + htmlWorker.Parse(htmlViewReader); + } + } + } +#endif + return result; + } + } \ No newline at end of file