ImageExamples.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322
  1. using QuestPDF.Elements;
  2. using QuestPDF.Fluent;
  3. using QuestPDF.Helpers;
  4. using QuestPDF.Infrastructure;
  5. using SkiaSharp;
  6. namespace QuestPDF.DocumentationExamples;
  7. public class ImageExamples
  8. {
  9. [Test]
  10. public void Example()
  11. {
  12. Document
  13. .Create(document =>
  14. {
  15. document.Page(page =>
  16. {
  17. page.MinSize(new PageSize(0, 0));
  18. page.MaxSize(new PageSize(400, 1000));
  19. page.DefaultTextStyle(x => x.FontSize(20));
  20. page.Margin(25);
  21. page.Content()
  22. .Grid(grid =>
  23. {
  24. grid.Columns(2);
  25. grid.Spacing(10);
  26. grid.Item(2).Text("My photo gallery:").Bold();
  27. grid.Item().Image("Resources/Photos/photo-gallery-1.jpg");
  28. grid.Item().Image("Resources/Photos/photo-gallery-2.jpg");
  29. grid.Item().Image("Resources/Photos/photo-gallery-3.jpg");
  30. grid.Item().Image("Resources/Photos/photo-gallery-4.jpg");
  31. });
  32. });
  33. })
  34. .GenerateImages(x => "image-example.webp", new ImageGenerationSettings() { ImageFormat = ImageFormat.Webp, ImageCompressionQuality = ImageCompressionQuality.VeryHigh, RasterDpi = 144 });
  35. }
  36. [Test]
  37. public void ImageScaling()
  38. {
  39. Document
  40. .Create(document =>
  41. {
  42. document.Page(page =>
  43. {
  44. page.MinSize(new PageSize(0, 0));
  45. page.MaxSize(new PageSize(1000, 1500));
  46. page.Margin(25);
  47. page.Content()
  48. .Column(column =>
  49. {
  50. column.Item().PaddingBottom(5).Text("FitWidth").Bold();
  51. column.Item()
  52. .Width(200)
  53. .Height(150)
  54. .Border(4)
  55. .BorderColor(Colors.Red.Medium)
  56. .Image("Resources/Photos/photo.jpg")
  57. .FitWidth();
  58. column.Item().Height(15);
  59. column.Item().PaddingBottom(5).Text("FitHeight").Bold();
  60. column.Item()
  61. .Width(200)
  62. .Height(100)
  63. .Border(4)
  64. .BorderColor(Colors.Red.Medium)
  65. .Image("Resources/Photos/photo.jpg")
  66. .FitHeight();
  67. column.Item().Height(15);
  68. column.Item().PaddingBottom(5).Text("FitArea 1").Bold();
  69. column.Item()
  70. .Width(200)
  71. .Height(100)
  72. .Border(4)
  73. .BorderColor(Colors.Red.Medium)
  74. .Image("Resources/Photos/photo.jpg")
  75. .FitArea();
  76. column.Item().Height(15);
  77. column.Item().PaddingBottom(5).Text("FitArea 2").Bold();
  78. column.Item()
  79. .Width(200)
  80. .Height(150)
  81. .Border(4)
  82. .BorderColor(Colors.Red.Medium)
  83. .Image("Resources/Photos/photo.jpg")
  84. .FitArea();
  85. column.Item().Height(15);
  86. column.Item().PaddingBottom(5).Text("FitUnproportionally").Bold();
  87. column.Item()
  88. .Width(200)
  89. .Height(50)
  90. .Border(4)
  91. .BorderColor(Colors.Red.Medium)
  92. .Image("Resources/Photos/photo.jpg")
  93. .FitUnproportionally();
  94. });
  95. });
  96. })
  97. .GenerateImages(x => "image-scaling.webp", new ImageGenerationSettings() { ImageFormat = ImageFormat.Webp, ImageCompressionQuality = ImageCompressionQuality.VeryHigh, RasterDpi = 144 });
  98. }
  99. [Test]
  100. public void DpiSetting()
  101. {
  102. Document
  103. .Create(document =>
  104. {
  105. document.Page(page =>
  106. {
  107. page.MinSize(new PageSize(0, 0));
  108. page.MaxSize(new PageSize(400, 1000));
  109. page.Margin(25);
  110. page.Content()
  111. .Column(column =>
  112. {
  113. column.Spacing(10);
  114. // lower raster dpi = lower resolution, pixelation
  115. column
  116. .Item()
  117. .Image("Resources/Photos/photo.jpg")
  118. .WithRasterDpi(16);
  119. // higher raster dpi = higher resolution
  120. column
  121. .Item()
  122. .Image("Resources/Photos/photo.jpg")
  123. .WithRasterDpi(288);
  124. });
  125. });
  126. })
  127. .GenerateImages(x => "image-dpi.webp", new ImageGenerationSettings() { ImageFormat = ImageFormat.Webp, ImageCompressionQuality = ImageCompressionQuality.VeryHigh, RasterDpi = 144 });
  128. }
  129. [Test]
  130. public void CompressionSetting()
  131. {
  132. Document
  133. .Create(document =>
  134. {
  135. document.Page(page =>
  136. {
  137. page.MinSize(new PageSize(0, 0));
  138. page.MaxSize(new PageSize(400, 1000));
  139. page.Margin(25);
  140. page.Content()
  141. .Column(column =>
  142. {
  143. column.Spacing(10);
  144. // low quality = smaller output file
  145. column
  146. .Item()
  147. .Image("Resources/Photos/photo.jpg")
  148. .WithCompressionQuality(ImageCompressionQuality.VeryLow);
  149. // high quality / fidelity = larger output file
  150. column
  151. .Item()
  152. .Image("Resources/Photos/photo.jpg")
  153. .WithCompressionQuality(ImageCompressionQuality.VeryHigh);
  154. });
  155. });
  156. })
  157. .GenerateImages(x => "image-compression.webp", new ImageGenerationSettings() { ImageFormat = ImageFormat.Webp, ImageCompressionQuality = ImageCompressionQuality.VeryHigh, RasterDpi = 144 });
  158. }
  159. [Test]
  160. public void GlobalSettings()
  161. {
  162. Document
  163. .Create(document =>
  164. {
  165. document.Page(page =>
  166. {
  167. page.Content().Image("Resources/Photos/photo.jpg");
  168. });
  169. })
  170. .WithSettings(new DocumentSettings
  171. {
  172. // default: ImageCompressionQuality.High;
  173. ImageCompressionQuality = ImageCompressionQuality.Medium,
  174. // default: 288
  175. ImageRasterDpi = 14
  176. })
  177. .GeneratePdf("image-global-settings.pdf");
  178. }
  179. [Test]
  180. public void SharedImages()
  181. {
  182. using var image = Image.FromFile("Resources/checkbox.png");
  183. Document
  184. .Create(document =>
  185. {
  186. document.Page(page =>
  187. {
  188. page.MinSize(new PageSize(0, 0));
  189. page.MaxSize(new PageSize(350, 1000));
  190. page.DefaultTextStyle(x => x.FontSize(20));
  191. page.Margin(25);
  192. page.Content()
  193. .Column(column =>
  194. {
  195. column.Spacing(15);
  196. foreach (var i in Enumerable.Range(0, 5))
  197. {
  198. column.Item().Row(row =>
  199. {
  200. row.AutoItem().Width(28).Image(image);
  201. row.RelativeItem().PaddingLeft(8).AlignMiddle().Text(Placeholders.Label());
  202. });
  203. }
  204. });
  205. });
  206. })
  207. .GenerateImages(x => "image-shared.webp", new ImageGenerationSettings() { ImageFormat = ImageFormat.Webp, ImageCompressionQuality = ImageCompressionQuality.VeryHigh, RasterDpi = 144 });
  208. }
  209. [Test]
  210. public void DynamicImage()
  211. {
  212. Document
  213. .Create(document =>
  214. {
  215. document.Page(page =>
  216. {
  217. page.MinSize(new PageSize(0, 0));
  218. page.MaxSize(new PageSize(350, 1000));
  219. page.DefaultTextStyle(x => x.FontSize(20));
  220. page.PageColor(Colors.Grey.Lighten3);
  221. page.Margin(25);
  222. page.Content()
  223. .Column(column =>
  224. {
  225. column.Spacing(10);
  226. column.Item().Text(text =>
  227. {
  228. text.Span("The national flag of Poland").Bold();
  229. text.Span(" consists of two horizontal stripes of equal width, the upper one white and the lower one red.");
  230. });
  231. column.Item()
  232. .AspectRatio(80 / 50f)
  233. .Border(2)
  234. .Image(GenerateNationalFlagOfPoland);
  235. });
  236. byte[]? GenerateNationalFlagOfPoland(GenerateDynamicImageDelegatePayload context)
  237. {
  238. using var whitePaint = new SKPaint
  239. {
  240. Color = SKColors.White,
  241. };
  242. using var redPaint = new SKPaint
  243. {
  244. Color = SKColor.Parse("#BB0A30"),
  245. };
  246. using var bitmap = new SKBitmap(context.ImageSize.Width, context.ImageSize.Height);
  247. using var canvas = new SKCanvas(bitmap);
  248. canvas.DrawRect(0, 0, context.ImageSize.Width, context.ImageSize.Height / 2, whitePaint);
  249. canvas.DrawRect(0, context.ImageSize.Height / 2, context.ImageSize.Width, context.ImageSize.Height, redPaint);
  250. canvas.Flush();
  251. using var content = bitmap.Encode(SKEncodedImageFormat.Png, 100);
  252. return content.ToArray();
  253. }
  254. });
  255. })
  256. .GenerateImages(x => "image-dynamic.webp", new ImageGenerationSettings() { ImageFormat = ImageFormat.Webp, ImageCompressionQuality = ImageCompressionQuality.VeryHigh, RasterDpi = 144 });
  257. }
  258. [Test]
  259. public void SvgSupport()
  260. {
  261. Document
  262. .Create(document =>
  263. {
  264. document.Page(page =>
  265. {
  266. page.ContinuousSize(250);
  267. page.DefaultTextStyle(x => x.FontSize(20));
  268. page.Margin(25);
  269. var svgContent = File.ReadAllText("Resources/pdf-icon.svg");
  270. page.Content()
  271. .Column(column =>
  272. {
  273. column.Item().Text("The classic PDF icon looks like this:").Bold();
  274. column.Item().Height(15);
  275. column.Item().Svg(svgContent);
  276. });
  277. });
  278. })
  279. .GenerateImages(x => "image-svg.webp", new ImageGenerationSettings() { ImageFormat = ImageFormat.Webp, ImageCompressionQuality = ImageCompressionQuality.VeryHigh, RasterDpi = 144 });
  280. }
  281. }