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[]`.
This commit is contained in:
2026-10-19 14:49:48 +02:00
parent 31bf64a6f2
commit f1c8e223dd
3 changed files with 21 additions and 8 deletions

View File

@@ -22,7 +22,7 @@ public interface IPdfPageImageRenderer
/// </summary>
/// <param name="element"></param>
/// <returns></returns>
byte[] ComposeSignaturePreviewPng(ISignatureInkPayload element);
Stream ComposeSignaturePreviewPng(ISignatureInkPayload element);
/// <summary>
///
@@ -51,4 +51,16 @@ public static class PdfPageImageRendererExtensions
return inkBytes;
}
}
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();
}
}

View File

@@ -57,7 +57,7 @@ public class PdfPageImageRenderer : IPdfPageImageRenderer
return Task.FromResult<IReadOnlyList<PdfPageImageDto>>(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;
}
}
}

View File

@@ -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()