From 011668fb4cef2f95d603fb6638c20eb9829fba12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcin=20Zi=C4=85bek?= Date: Fri, 29 Oct 2021 01:23:46 +0200 Subject: [PATCH] Image: added support for common overloads --- QuestPDF.Examples/ComplexLayoutBenchmark.cs | 57 ++++++++++++++++++++ QuestPDF.Examples/Engine/RenderingTest.cs | 10 +++- QuestPDF.Examples/ImageExamples.cs | 41 ++++++++++++++ QuestPDF.Examples/QuestPDF.Examples.csproj | 3 ++ QuestPDF.Examples/logo.png | Bin 0 -> 27032 bytes QuestPDF/Fluent/ImageExtensions.cs | 27 ++++++++-- QuestPDF/QuestPDF.csproj | 2 +- 7 files changed, 133 insertions(+), 7 deletions(-) create mode 100644 QuestPDF.Examples/ComplexLayoutBenchmark.cs create mode 100644 QuestPDF.Examples/ImageExamples.cs create mode 100644 QuestPDF.Examples/logo.png diff --git a/QuestPDF.Examples/ComplexLayoutBenchmark.cs b/QuestPDF.Examples/ComplexLayoutBenchmark.cs new file mode 100644 index 0000000..8f7df56 --- /dev/null +++ b/QuestPDF.Examples/ComplexLayoutBenchmark.cs @@ -0,0 +1,57 @@ +using NUnit.Framework; +using QuestPDF.Examples.Engine; +using QuestPDF.Fluent; +using QuestPDF.Helpers; +using QuestPDF.Infrastructure; + +namespace QuestPDF.Examples +{ + public class ComplexLayoutBenchmark + { + [Test] + public void ComplexLayout() + { + RenderingTest + .Create() + .PageSize(PageSizes.A4) + .ProducePdf() + .ShowResults() + .Render(x => x.Image(new byte[] { 1, 2, 3 })); + //.Render(x => GenerateStructure(x, 16)); + } + + private void GenerateStructure(IContainer container, int level) + { + if (level <= 0) + { + container.Background(Placeholders.BackgroundColor()).Height(10); + return; + } + + level--; + + if (level % 3 == 0) + { + container + .Border(level / 10f) + .BorderColor(Colors.Black) + .Row(row => + { + row.RelativeColumn().Element(x => GenerateStructure(x, level)); + row.RelativeColumn().Element(x => GenerateStructure(x, level)); + }); + } + else + { + container + .Border(level / 10f) + .BorderColor(Colors.Black) + .Stack(stack => + { + stack.Item().Element(x => GenerateStructure(x, level)); + stack.Item().Element(x => GenerateStructure(x, level)); + }); + } + } + } +} \ No newline at end of file diff --git a/QuestPDF.Examples/Engine/RenderingTest.cs b/QuestPDF.Examples/Engine/RenderingTest.cs index 6279a99..3309c4a 100644 --- a/QuestPDF.Examples/Engine/RenderingTest.cs +++ b/QuestPDF.Examples/Engine/RenderingTest.cs @@ -18,6 +18,7 @@ namespace QuestPDF.Examples.Engine { private string FileNamePrefix = "test"; private Size Size { get; set; } + private int? MaxPagesThreshold { get; set; } private bool ShowResult { get; set; } private RenderingTestResult ResultType { get; set; } = RenderingTestResult.Images; @@ -77,11 +78,16 @@ namespace QuestPDF.Examples.Engine }); }); } + + public void MaxPages(int value) + { + MaxPagesThreshold = value; + } public void RenderDocument(Action content) { - var maxPages = ResultType == RenderingTestResult.Pdf ? 1000 : 10; - var document = new SimpleDocument(content, maxPages); + MaxPagesThreshold ??= ResultType == RenderingTestResult.Pdf ? 1000 : 10; + var document = new SimpleDocument(content, MaxPagesThreshold.Value); Render(document); } diff --git a/QuestPDF.Examples/ImageExamples.cs b/QuestPDF.Examples/ImageExamples.cs new file mode 100644 index 0000000..89801bf --- /dev/null +++ b/QuestPDF.Examples/ImageExamples.cs @@ -0,0 +1,41 @@ +using System.IO; +using NUnit.Framework; +using QuestPDF.Examples.Engine; +using QuestPDF.Fluent; +using QuestPDF.Helpers; + +namespace QuestPDF.Examples +{ + public class ImageExamples + { + [Test] + public void LoadingImage() + { + RenderingTest + .Create() + .PageSize(PageSizes.A5) + .ProducePdf() + .ShowResults() + .Render(page => + { + page.Padding(25).Stack(stack => + { + stack.Spacing(25); + stack.Item().Image(File.ReadAllBytes("logo.png")); + stack.Item().Image("logo.png"); + }); + }); + } + + [Test] + public void Exception() + { + RenderingTest + .Create() + .PageSize(PageSizes.A5) + .ProducePdf() + .ShowResults() + .Render(page => page.Image("non_existent.png")); + } + } +} \ No newline at end of file diff --git a/QuestPDF.Examples/QuestPDF.Examples.csproj b/QuestPDF.Examples/QuestPDF.Examples.csproj index 5dc14b7..a7a0014 100644 --- a/QuestPDF.Examples/QuestPDF.Examples.csproj +++ b/QuestPDF.Examples/QuestPDF.Examples.csproj @@ -23,6 +23,9 @@ PreserveNewest + + PreserveNewest + diff --git a/QuestPDF.Examples/logo.png b/QuestPDF.Examples/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..a0d780f366898ad01679f708814b0c3bcae511b5 GIT binary patch literal 27032 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 T>-ll{hf2>>wN*-$%>(}r1j0kU literal 0 HcmV?d00001 diff --git a/QuestPDF/Fluent/ImageExtensions.cs b/QuestPDF/Fluent/ImageExtensions.cs index 7a3fe4e..bc29883 100644 --- a/QuestPDF/Fluent/ImageExtensions.cs +++ b/QuestPDF/Fluent/ImageExtensions.cs @@ -1,4 +1,6 @@ using System; +using System.IO; +using QuestPDF.Drawing.Exceptions; using QuestPDF.Elements; using QuestPDF.Infrastructure; using SkiaSharp; @@ -7,12 +9,29 @@ namespace QuestPDF.Fluent { public static class ImageExtensions { - public static void Image(this IContainer parent, byte[] data, ImageScaling scaling = ImageScaling.FitWidth) + public static void Image(this IContainer parent, byte[] imageData, ImageScaling scaling = ImageScaling.FitWidth) { - if (data == null) - return; + var image = SKImage.FromEncodedData(imageData); + parent.Image(image, scaling); + } + + public static void Image(this IContainer parent, string filePath, ImageScaling scaling = ImageScaling.FitWidth) + { + var image = SKImage.FromEncodedData(filePath); + parent.Image(image, scaling); + } + + public static void Image(this IContainer parent, Stream fileStream, ImageScaling scaling = ImageScaling.FitWidth) + { + var image = SKImage.FromEncodedData(fileStream); + parent.Image(image, scaling); + } + + private static void Image(this IContainer parent, SKImage image, ImageScaling scaling = ImageScaling.FitWidth) + { + if (image == null) + throw new DocumentComposeException("Cannot load or decode provided image."); - var image = SKImage.FromEncodedData(data); var aspectRatio = image.Width / (float)image.Height; var imageElement = new Image diff --git a/QuestPDF/QuestPDF.csproj b/QuestPDF/QuestPDF.csproj index bd435f7..e74e2fb 100644 --- a/QuestPDF/QuestPDF.csproj +++ b/QuestPDF/QuestPDF.csproj @@ -4,7 +4,7 @@ MarcinZiabek CodeFlint QuestPDF - 2021.11.0-beta + 2021.11.0-beta2 QuestPDF is an open-source, modern and battle-tested library that can help you with generating PDF documents by offering friendly, discoverable and predictable C# fluent API. Implemented new elements: SkipOnce and Inlined. Added possibility to define global, page-wide test style. Improved exception handling experience. 8