using InABox.Core; using Syncfusion.Pdf; using Syncfusion.Pdf.Graphics; using Syncfusion.PdfToImageConverter; namespace InABox.Avalonia.Platform.Desktop; public class Desktop_PdfRenderer : IPdfRenderer { public byte[]? PdfToImage(byte[]? pdf, int page, int dpi) { if (pdf?.Any() != true) return null; using var inData = new MemoryStream(pdf); using var converter = new PdfToImageConverter(inData); var output = converter.Convert(page, true, false) as MemoryStream; return output.ToArray(); } public Task PdfToImageAsync(byte[]? pdf, int page, int dpi) => Task.Run(() => PdfToImage(pdf, page, dpi)); public byte[][]? PdfToImages(byte[]? pdf, int dpi) { if (pdf is null || pdf.Length == 0) return null; using var inData = new MemoryStream(pdf); using var converter = new PdfToImageConverter(inData); return Enumerable.Range(0, converter.PageCount).Select(i => { var output = converter.Convert(i, true, false) as MemoryStream; return output.ToArray(); }).ToArray(); } public Task PdfToImagesAsync(byte[]? pdf, int dpi) => Task.Run(() => PdfToImages(pdf, dpi)); public int? PdfPageCount(byte[]? pdf) { if (pdf is null || pdf.Length == 0) return null; using var inData = new MemoryStream(pdf); using var converter = new PdfToImageConverter(inData); return converter.PageCount; } public Task PdfPageCountAsync(byte[]? pdf) => Task.Run(() => PdfPageCount(pdf)); public byte[]? ImageToPdf(byte[]? image) { if (image?.Any() != true) return null; using var imgStream = new MemoryStream(image); var bmp = new PdfBitmap(imgStream); var doc = new PdfDocument(); var section = doc.Sections.Add(); section.PageSettings.Margins.All = 0; section.PageSettings.Width = bmp.Width; section.PageSettings.Height = bmp.Height; var page = section.Pages.Add(); page.Graphics.DrawImage(bmp, 0, 0, page.Size.Width, page.Size.Height); using var docStream = new MemoryStream(); doc.Save(docStream); return docStream.GetBuffer(); } public Task ImageToPdfAsync(byte[]? image) => Task.Run(() => ImageToPdf(image)); public Logger? Logger { get; set; } }