Desktop.PdfRenderer.cs 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  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. using var converter = new PdfToImageConverter(inData);
  14. var output = converter.Convert(page, true, false) as MemoryStream;
  15. return output.ToArray();
  16. }
  17. public Task<byte[]?> PdfToImageAsync(byte[]? pdf, int page, int dpi)
  18. => Task.Run(() => PdfToImage(pdf, page, dpi));
  19. public byte[][]? PdfToImages(byte[]? pdf, int dpi)
  20. {
  21. if (pdf is null || pdf.Length == 0)
  22. return null;
  23. using var inData = new MemoryStream(pdf);
  24. using var converter = new PdfToImageConverter(inData);
  25. return Enumerable.Range(0, converter.PageCount).Select(i =>
  26. {
  27. var output = converter.Convert(i, true, false) as MemoryStream;
  28. return output.ToArray();
  29. }).ToArray();
  30. }
  31. public Task<byte[][]?> PdfToImagesAsync(byte[]? pdf, int dpi)
  32. => Task.Run(() => PdfToImages(pdf, dpi));
  33. public int? PdfPageCount(byte[]? pdf)
  34. {
  35. if (pdf is null || pdf.Length == 0)
  36. return null;
  37. using var inData = new MemoryStream(pdf);
  38. using var converter = new PdfToImageConverter(inData);
  39. return converter.PageCount;
  40. }
  41. public Task<int?> PdfPageCountAsync(byte[]? pdf)
  42. => Task.Run(() => PdfPageCount(pdf));
  43. public byte[]? ImageToPdf(byte[]? image)
  44. {
  45. if (image?.Any() != true)
  46. return null;
  47. using var imgStream = new MemoryStream(image);
  48. var bmp = new PdfBitmap(imgStream);
  49. var doc = new PdfDocument();
  50. var section = doc.Sections.Add();
  51. section.PageSettings.Margins.All = 0;
  52. section.PageSettings.Width = bmp.Width;
  53. section.PageSettings.Height = bmp.Height;
  54. var page = section.Pages.Add();
  55. page.Graphics.DrawImage(bmp, 0, 0, page.Size.Width, page.Size.Height);
  56. using var docStream = new MemoryStream();
  57. doc.Save(docStream);
  58. return docStream.GetBuffer();
  59. }
  60. public Task<byte[]?> ImageToPdfAsync(byte[]? image)
  61. => Task.Run(() => ImageToPdf(image));
  62. public Logger? Logger { get; set; }
  63. }