ImageExtensions.cs 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. using System;
  2. using System.IO;
  3. using QuestPDF.Drawing.Exceptions;
  4. using QuestPDF.Elements;
  5. using QuestPDF.Infrastructure;
  6. namespace QuestPDF.Fluent
  7. {
  8. public static class ImageExtensions
  9. {
  10. public static void Image(this IContainer parent, byte[] imageData, ImageScaling scaling = ImageScaling.FitWidth)
  11. {
  12. var image = Infrastructure.Image.FromBinaryData(imageData).DisposeAfterDocumentGeneration();
  13. parent.Image(image, scaling);
  14. }
  15. public static void Image(this IContainer parent, string filePath, ImageScaling scaling = ImageScaling.FitWidth)
  16. {
  17. var image = Infrastructure.Image.FromFile(filePath).DisposeAfterDocumentGeneration();
  18. parent.Image(image, scaling);
  19. }
  20. public static void Image(this IContainer parent, Stream fileStream, ImageScaling scaling = ImageScaling.FitWidth)
  21. {
  22. var image = Infrastructure.Image.FromStream(fileStream).DisposeAfterDocumentGeneration();
  23. parent.Image(image, scaling);
  24. }
  25. public static void Image(this IContainer parent, Infrastructure.Image image, ImageScaling scaling = ImageScaling.FitWidth)
  26. {
  27. if (image == null)
  28. throw new DocumentComposeException("Cannot load or decode provided image.");
  29. var imageElement = new QuestPDF.Elements.Image
  30. {
  31. DocumentImage = image
  32. };
  33. if (scaling != ImageScaling.Resize)
  34. {
  35. var aspectRatio = image.Width / (float)image.Height;
  36. parent = parent.AspectRatio(aspectRatio, Map(scaling));
  37. }
  38. parent.Element(imageElement);
  39. static AspectRatioOption Map(ImageScaling scaling)
  40. {
  41. return scaling switch
  42. {
  43. ImageScaling.FitWidth => AspectRatioOption.FitWidth,
  44. ImageScaling.FitHeight => AspectRatioOption.FitHeight,
  45. ImageScaling.FitArea => AspectRatioOption.FitArea,
  46. _ => throw new ArgumentOutOfRangeException()
  47. };
  48. }
  49. }
  50. public static void Image(this IContainer element, Func<Size, byte[]> imageSource)
  51. {
  52. element.Element(new DynamicImage
  53. {
  54. Source = imageSource
  55. });
  56. }
  57. }
  58. }