using DevExpress.Drawing; using DevExpress.Pdf; using EnvelopeGenerator.Application.Common.Dto; using EnvelopeGenerator.Application.Common.Interfaces.Doc; namespace EnvelopeGenerator.Infrastructure.Doc; public class PdfPageImageRenderer : IPdfPageImageRenderer { private const float RenderDpi = 110f; public Task> RenderPagesAsImagesAsync(byte[] pdfBytes, CancellationToken cancellationToken = default) { ArgumentNullException.ThrowIfNull(pdfBytes); if (pdfBytes.Length == 0) return Task.FromResult>(Array.Empty()); using var stream = new MemoryStream(pdfBytes, writable: false); using var processor = new PdfDocumentProcessor(); processor.LoadDocument(stream); var pages = processor.Document.Pages; if (pages.Count == 0) return Task.FromResult>(Array.Empty()); var renderOptions = PdfPageRenderingParameters.CreateWithResolution(RenderDpi); var results = new List(pages.Count); for (var i = 0; i < pages.Count; i++) { cancellationToken.ThrowIfCancellationRequested(); var pageNumber = i + 1; var page = pages[i]; var cropBox = page.CropBox; using DXBitmap bitmap = processor.CreateDXBitmap(pageNumber, renderOptions); using var imageStream = new MemoryStream(); bitmap.Save(imageStream, DXImageFormat.Png); var dataUrl = $"data:image/png;base64,{Convert.ToBase64String(imageStream.ToArray())}"; results.Add(new PdfPageImageDto { PageNumber = pageNumber, WidthPt = cropBox.Width, HeightPt = cropBox.Height, WidthPx = bitmap.Width, HeightPx = bitmap.Height, ImageDataUrl = dataUrl }); } return Task.FromResult>(results); } }