From f1c8e223dd93cd294eb0ad85b806d566f7ffce61 Mon Sep 17 00:00:00 2001 From: TekH Date: Mon, 19 Oct 2026 14:49:48 +0200 Subject: [PATCH] Refactor ComposeSignaturePreviewPng to return Stream Updated the `ComposeSignaturePreviewPng` method in the `IPdfPageImageRenderer` interface to return a `Stream` instead of a `byte[]` for improved memory efficiency when handling large image data. - Added `ComposeSignaturePreviewPngBytes` extension method to convert the `Stream` to a `byte[]` for backward compatibility. - Updated `PdfPageImageRenderer` to return a `Stream` and adjusted its internal logic to reset the `MemoryStream` position before returning. - Modified `DevSignatureInkController` to use the `Stream`-based implementation for HTTP responses. - Made minor formatting adjustments in `PdfPageImageRenderer`. These changes optimize memory usage while maintaining compatibility with existing workflows that require `byte[]`. --- .../Interfaces/Doc/IPdfPageImageRenderer.cs | 16 ++++++++++++++-- .../PdfPageImageRenderer.cs | 9 +++++---- .../Controllers/DevSignatureInkController.cs | 4 ++-- 3 files changed, 21 insertions(+), 8 deletions(-) diff --git a/EnvelopeGenerator.Application/Common/Interfaces/Doc/IPdfPageImageRenderer.cs b/EnvelopeGenerator.Application/Common/Interfaces/Doc/IPdfPageImageRenderer.cs index 8dcbf9b3..08473724 100644 --- a/EnvelopeGenerator.Application/Common/Interfaces/Doc/IPdfPageImageRenderer.cs +++ b/EnvelopeGenerator.Application/Common/Interfaces/Doc/IPdfPageImageRenderer.cs @@ -22,7 +22,7 @@ public interface IPdfPageImageRenderer /// /// /// - byte[] ComposeSignaturePreviewPng(ISignatureInkPayload element); + Stream ComposeSignaturePreviewPng(ISignatureInkPayload element); /// /// @@ -51,4 +51,16 @@ public static class PdfPageImageRendererExtensions return inkBytes; } -} \ No newline at end of file + + public static byte[] ComposeSignaturePreviewPngBytes(this IPdfPageImageRenderer renderer, ISignatureInkPayload element) + { + using var stream = renderer.ComposeSignaturePreviewPng(element); + + if (stream is MemoryStream memoryStream) + return memoryStream.ToArray(); + + using var copy = new MemoryStream(); + stream.CopyTo(copy); + return copy.ToArray(); + } +} diff --git a/EnvelopeGenerator.Infrastructure.Doc/PdfPageImageRenderer.cs b/EnvelopeGenerator.Infrastructure.Doc/PdfPageImageRenderer.cs index 7aa15145..4f541a09 100644 --- a/EnvelopeGenerator.Infrastructure.Doc/PdfPageImageRenderer.cs +++ b/EnvelopeGenerator.Infrastructure.Doc/PdfPageImageRenderer.cs @@ -57,7 +57,7 @@ public class PdfPageImageRenderer : IPdfPageImageRenderer return Task.FromResult>(results); } - public byte[] ComposeSignaturePreviewPng(ISignatureInkPayload element) + public Stream ComposeSignaturePreviewPng(ISignatureInkPayload element) { const double sigW = 1.77 * 72; const double sigH = 1.96 * 72; @@ -137,9 +137,10 @@ public class PdfPageImageRenderer : IPdfPageImageRenderer var renderOptions = PdfPageRenderingParameters.CreateWithResolution(400f); using DXBitmap bitmap = rasterProcessor.CreateDXBitmap(1, renderOptions); - using var pngStream = new MemoryStream(); + var pngStream = new MemoryStream(); bitmap.Save(pngStream, DXImageFormat.Png); - return pngStream.ToArray(); + pngStream.Position = 0; + return pngStream; } private static System.Drawing.RectangleF FitImageContain(System.Drawing.RectangleF area, byte[] imageBytes) @@ -176,4 +177,4 @@ public class PdfPageImageRenderer : IPdfPageImageRenderer return isJpeg; } -} \ No newline at end of file +} diff --git a/EnvelopeGenerator.Server/EnvelopeGenerator.Server/Controllers/DevSignatureInkController.cs b/EnvelopeGenerator.Server/EnvelopeGenerator.Server/Controllers/DevSignatureInkController.cs index 902983b1..081e2399 100644 --- a/EnvelopeGenerator.Server/EnvelopeGenerator.Server/Controllers/DevSignatureInkController.cs +++ b/EnvelopeGenerator.Server/EnvelopeGenerator.Server/Controllers/DevSignatureInkController.cs @@ -90,8 +90,8 @@ public class DevSignatureInkController( if (!renderer.IsSupportedImageFormat(element.Ink!)) return StatusCode(StatusCodes.Status415UnsupportedMediaType); - var composedBytes = renderer.ComposeSignaturePreviewPng(element); - return File(composedBytes, "image/png", $"signature-composed-{id}.png"); + var composedStream = renderer.ComposeSignaturePreviewPng(element); + return File(composedStream, "image/png", $"signature-composed-{id}.png"); } private bool IsEndpointEnabled()