Desktop.PdfRenderer.cs 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  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. using (var outData = new MemoryStream())
  17. {
  18. converter.Convert(page,true,false)
  19. .CopyTo(outData);
  20. return outData.ToArray();
  21. }
  22. }
  23. }
  24. }
  25. public Task<byte[]?> PdfToImageAsync(byte[]? pdf, int page, int dpi)
  26. => Task.Run(() => PdfToImage(pdf, page, dpi));
  27. public byte[]? ImageToPdf(byte[]? image)
  28. {
  29. if (image?.Any() != true)
  30. return null;
  31. using var imgStream = new MemoryStream(image);
  32. var bmp = new PdfBitmap(imgStream);
  33. var doc = new PdfDocument();
  34. var section = doc.Sections.Add();
  35. section.PageSettings.Margins.All = 0;
  36. section.PageSettings.Width = bmp.Width;
  37. section.PageSettings.Height = bmp.Height;
  38. var page = section.Pages.Add();
  39. page.Graphics.DrawImage(bmp, 0, 0, page.Size.Width, page.Size.Height);
  40. using var docStream = new MemoryStream();
  41. doc.Save(docStream);
  42. return docStream.GetBuffer();
  43. }
  44. public Task<byte[]?> ImageToPdfAsync(byte[]? image)
  45. => Task.Run(() => ImageToPdf(image));
  46. public Logger? Logger { get; set; }
  47. }