58 lines
2.0 KiB
C#
58 lines
2.0 KiB
C#
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<IReadOnlyList<PdfPageImageDto>> RenderPagesAsImagesAsync(byte[] pdfBytes, CancellationToken cancellationToken = default)
|
|
{
|
|
ArgumentNullException.ThrowIfNull(pdfBytes);
|
|
|
|
if (pdfBytes.Length == 0)
|
|
return Task.FromResult<IReadOnlyList<PdfPageImageDto>>(Array.Empty<PdfPageImageDto>());
|
|
|
|
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<IReadOnlyList<PdfPageImageDto>>(Array.Empty<PdfPageImageDto>());
|
|
|
|
var renderOptions = PdfPageRenderingParameters.CreateWithResolution(RenderDpi);
|
|
var results = new List<PdfPageImageDto>(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<IReadOnlyList<PdfPageImageDto>>(results);
|
|
}
|
|
}
|