diff --git a/Source/Demo/WPF/DemoWindow.xaml b/Source/Demo/WPF/DemoWindow.xaml index 538e685e5..df4592567 100644 --- a/Source/Demo/WPF/DemoWindow.xaml +++ b/Source/Demo/WPF/DemoWindow.xaml @@ -43,7 +43,7 @@ - + diff --git a/Source/Demo/WPF/DemoWindow.xaml.cs b/Source/Demo/WPF/DemoWindow.xaml.cs index 474572865..168ac351b 100644 --- a/Source/Demo/WPF/DemoWindow.xaml.cs +++ b/Source/Demo/WPF/DemoWindow.xaml.cs @@ -17,7 +17,9 @@ using System.Windows.Media; using System.Windows.Threading; using TheArtOfDev.HtmlRenderer.Demo.Common; +using TheArtOfDev.HtmlRenderer.PdfSharp; using TheArtOfDev.HtmlRenderer.WPF; +using PdfSharp; namespace TheArtOfDev.HtmlRenderer.Demo.WPF { @@ -111,6 +113,24 @@ private void OnGenerateImage_Click(object sender, RoutedEventArgs e) w.ShowDialog(); } + /// + /// Create PDF using PdfSharp project, save to file and open that file. + /// + private void OnGeneratePdf_Click(object sender, RoutedEventArgs e) + { + var config = new PdfGenerateConfig(); + config.PageSize = PageSize.A4; + config.SetMargins(20); + + var doc = PdfGenerator.GeneratePdf(_mainControl.GetHtml(), config, null, DemoUtils.OnStylesheetLoad, HtmlRenderingHelper.OnImageLoadPdfSharp); + + var tmpFile = Path.GetTempFileName(); + var pdfFile = Path.ChangeExtension(tmpFile, ".pdf"); + doc.Save(pdfFile); + + Process.Start(new ProcessStartInfo(pdfFile) { UseShellExecute = true }); + } + /// /// Execute performance test by setting all sample HTMLs in a loop. /// diff --git a/Source/Demo/WPF/HtmlRenderer.Demo.WPF.csproj b/Source/Demo/WPF/HtmlRenderer.Demo.WPF.csproj index 3f48b0da1..a34cc5538 100644 --- a/Source/Demo/WPF/HtmlRenderer.Demo.WPF.csproj +++ b/Source/Demo/WPF/HtmlRenderer.Demo.WPF.csproj @@ -15,6 +15,7 @@ + diff --git a/Source/Demo/WPF/HtmlRenderingHelper.cs b/Source/Demo/WPF/HtmlRenderingHelper.cs index 2fb88670e..cf9ba3d57 100644 --- a/Source/Demo/WPF/HtmlRenderingHelper.cs +++ b/Source/Demo/WPF/HtmlRenderingHelper.cs @@ -16,6 +16,7 @@ using System.Threading; using System.Windows; using System.Windows.Media.Imaging; +using PdfSharp.Drawing; using TheArtOfDev.HtmlRenderer.Core.Entities; using TheArtOfDev.HtmlRenderer.Demo.Common; using TheArtOfDev.HtmlRenderer.WPF; @@ -60,6 +61,7 @@ public static BitmapEncoder GetBitmapEncoder(string ext) return new PngBitmapEncoder(); } + } /// @@ -118,12 +120,29 @@ public static void OnImageLoad(object sender, HtmlImageLoadEventArgs args) ImageLoad(args); } + /// + /// On image load in renderer set the image by event async. + /// + public static void OnImageLoadPdfSharp(object sender, HtmlImageLoadEventArgs args) + { + ImageLoad(args, true); + } + /// /// On image load in renderer set the image by event async. /// public static void ImageLoad(HtmlImageLoadEventArgs e) + { + ImageLoad(e, false); + } + + /// + /// On image load in renderer set the image by event async. + /// + public static void ImageLoad(HtmlImageLoadEventArgs e, bool pdfSharp) { var img = TryLoadResourceImage(e.Src); + var imgObj = pdfSharp ? (object)(img != null ? CreatePdfSharpImage(img) : null) : img; if (!e.Handled && e.Attributes != null) { @@ -150,13 +169,31 @@ public static void ImageLoad(HtmlImageLoadEventArgs e) { var split = e.Attributes["byrect"].Split(','); var rect = new Rect(Int32.Parse(split[0]), Int32.Parse(split[1]), Int32.Parse(split[2]), Int32.Parse(split[3])); - e.Callback(img ?? TryLoadResourceImage("htmlicon"), rect.X, rect.Y, rect.Width, rect.Height); + var defaultResourceImage = TryLoadResourceImage("htmlicon"); + var defaultImg = pdfSharp && defaultResourceImage != null ? (object)CreatePdfSharpImage(defaultResourceImage) : defaultResourceImage; + e.Callback(imgObj ?? defaultImg, rect.X, rect.Y, rect.Width, rect.Height); return; } } if (img != null) - e.Callback(img); + e.Callback(imgObj); + } + + /// + /// Convert image to PNG before creating because PdfSharp does not support GIF streams. + /// + private static XImage CreatePdfSharpImage(BitmapSource image) + { + var encoder = new PngBitmapEncoder(); + encoder.Frames.Add(BitmapFrame.Create(image)); + + using (var ms = new MemoryStream()) + { + encoder.Save(ms); + ms.Position = 0; + return XImage.FromStream(ms); + } } } } \ No newline at end of file