SkiaSharpIntegrationExamples.cs 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. using QuestPDF.Fluent;
  2. using QuestPDF.Helpers;
  3. using QuestPDF.Infrastructure;
  4. using QuestPDF.SkiaSharpIntegration;
  5. using SkiaSharp;
  6. namespace QuestPDF.DocumentationExamples;
  7. public class SkiaSharpIntegrationExamples
  8. {
  9. [Test]
  10. public void Svg()
  11. {
  12. Document
  13. .Create(document =>
  14. {
  15. document.Page(page =>
  16. {
  17. page.Size(350, 350);
  18. page.Margin(25);
  19. page.Content()
  20. .Width(300)
  21. .Height(300)
  22. .SkiaSharpSvgCanvas((canvas, size) =>
  23. {
  24. var centerX = size.Width / 2;
  25. var centerY = size.Height / 2;
  26. var radius = Math.Min(centerX, centerY);
  27. // draw clock face
  28. using var facePaint = new SKPaint
  29. {
  30. Color = new SKColor(Colors.Blue.Lighten4)
  31. };
  32. canvas.DrawCircle(centerX, centerY, radius, facePaint);
  33. // draw clock ticks
  34. using var tickPaint = new SKPaint
  35. {
  36. Color = new SKColor(Colors.Blue.Darken4),
  37. StrokeWidth = 4,
  38. StrokeCap = SKStrokeCap.Round
  39. };
  40. canvas.Save();
  41. canvas.Translate(centerX, centerY);
  42. foreach (var i in Enumerable.Range(0, 12))
  43. {
  44. canvas.DrawLine(new SKPoint(0, radius * 0.85f), new SKPoint(0, radius * 0.95f), tickPaint);
  45. canvas.RotateDegrees(30);
  46. }
  47. canvas.Restore();
  48. // draw clock hands
  49. using var hourHandPaint = new SKPaint
  50. {
  51. Color = new SKColor(Colors.Blue.Darken4),
  52. StrokeWidth = 8,
  53. StrokeCap = SKStrokeCap.Round
  54. };
  55. using var minuteHandPaint = new SKPaint
  56. {
  57. Color = new SKColor(Colors.Blue.Darken2),
  58. StrokeWidth = 4,
  59. StrokeCap = SKStrokeCap.Round
  60. };
  61. canvas.Translate(centerX, centerY);
  62. canvas.Save();
  63. canvas.RotateDegrees(6 * DateTime.Now.Minute);
  64. canvas.DrawLine(new SKPoint(0, 0), new SKPoint(0, -radius * 0.7f), minuteHandPaint);
  65. canvas.Restore();
  66. canvas.Save();
  67. canvas.RotateDegrees(30 * DateTime.Now.Hour + DateTime.Now.Minute / 2);
  68. canvas.DrawLine(new SKPoint(0, 0), new SKPoint(0, -radius * 0.5f), hourHandPaint);
  69. canvas.Restore();
  70. });
  71. });
  72. })
  73. .GenerateImages(x => "skiasharp-integration-svg.webp", new ImageGenerationSettings() { ImageFormat = ImageFormat.Webp, ImageCompressionQuality = ImageCompressionQuality.Best, RasterDpi = 144 });
  74. }
  75. [Test]
  76. public void Resterized()
  77. {
  78. Document
  79. .Create(document =>
  80. {
  81. document.Page(page =>
  82. {
  83. page.Size(new PageSize(500, 400));
  84. page.DefaultTextStyle(x => x.FontSize(20));
  85. page.Content()
  86. .Padding(25)
  87. .SkiaSharpRasterizedCanvas((canvas, size) =>
  88. {
  89. // add padding to properly display the shadow effect
  90. const float padding = 25;
  91. canvas.Translate(padding, padding);
  92. // load image and scale canvas space
  93. using var bitmap = SKBitmap.Decode("Resources/landscape.jpg");
  94. var targetBitmapSize = new SKSize(size.Width - 2 * padding, size.Height - 2 * padding);
  95. var scale = Math.Min(targetBitmapSize.Width / bitmap.Width, targetBitmapSize.Height / bitmap.Height);
  96. canvas.Scale(scale);
  97. var drawingArea = new SKRoundRect(new SKRect(0, 0, bitmap.Width, bitmap.Height), 32, 32);
  98. // draw drop shadow
  99. using var dropShadowFilter = SKImageFilter.CreateDropShadow(8, 8, 16, 16, SKColors.Black);
  100. using var paint = new SKPaint
  101. {
  102. ImageFilter = dropShadowFilter
  103. };
  104. canvas.DrawRoundRect(drawingArea, paint);
  105. // draw image
  106. canvas.ClipRoundRect(drawingArea, antialias: true);
  107. canvas.DrawBitmap(bitmap, SKPoint.Empty);
  108. });
  109. });
  110. })
  111. .GenerateImages(x => "skiasharp-integration-rasterized.webp", new ImageGenerationSettings() { ImageFormat = ImageFormat.Webp, ImageCompressionQuality = ImageCompressionQuality.VeryHigh, RasterDpi = 144 });
  112. }
  113. }