Desktop.PdfRenderer.cs 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. using InABox.Core;
  2. using Syncfusion.Pdf;
  3. using Syncfusion.Pdf.Graphics;
  4. using Syncfusion.PdfToImageConverter;
  5. namespace InABox.Avalonia.Platform.Desktop;
  6. public class Desktop_PdfRenderer : IPdfRenderer
  7. {
  8. public byte[]? PdfToImage(byte[]? pdf, int page, int dpi)
  9. {
  10. if (pdf?.Any() != true)
  11. return null;
  12. using (var inData = new MemoryStream(pdf))
  13. {
  14. using (var converter = new PdfToImageConverter(inData))
  15. {
  16. var output = converter.Convert(page, true, false) as MemoryStream;
  17. return output.ToArray();
  18. }
  19. }
  20. }
  21. public Task<byte[]?> PdfToImageAsync(byte[]? pdf, int page, int dpi)
  22. => Task.Run(() => PdfToImage(pdf, page, dpi));
  23. public byte[]? ImageToPdf(byte[]? image)
  24. {
  25. if (image?.Any() != true)
  26. return null;
  27. using var imgStream = new MemoryStream(image);
  28. var bmp = new PdfBitmap(imgStream);
  29. var doc = new PdfDocument();
  30. var section = doc.Sections.Add();
  31. section.PageSettings.Margins.All = 0;
  32. section.PageSettings.Width = bmp.Width;
  33. section.PageSettings.Height = bmp.Height;
  34. var page = section.Pages.Add();
  35. page.Graphics.DrawImage(bmp, 0, 0, page.Size.Width, page.Size.Height);
  36. using var docStream = new MemoryStream();
  37. doc.Save(docStream);
  38. return docStream.GetBuffer();
  39. }
  40. public Task<byte[]?> ImageToPdfAsync(byte[]? image)
  41. => Task.Run(() => ImageToPdf(image));
  42. public Logger? Logger { get; set; }
  43. }