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 diff --git a/Source/Demo/WinForms/HtmlRenderingHelper.cs b/Source/Demo/WinForms/HtmlRenderingHelper.cs index 33b6ae5e7..8a502b058 100644 --- a/Source/Demo/WinForms/HtmlRenderingHelper.cs +++ b/Source/Demo/WinForms/HtmlRenderingHelper.cs @@ -14,6 +14,7 @@ using System; using System.Collections.Generic; using System.Drawing; +using System.Drawing.Imaging; using System.IO; using System.Threading; using TheArtOfDev.HtmlRenderer.Core.Entities; @@ -71,18 +72,11 @@ public static Image TryLoadResourceImage(string src) public static XImage TryLoadResourceXImage(string src) { var img = TryLoadResourceImage(src); - XImage xImg; if (img == null) return null; - using (var ms = new MemoryStream()) - { - img.Save(ms, img.RawFormat); - xImg = img != null ? XImage.FromStream(ms) : null; - } - - return xImg; + return CreatePdfSharpImage(img); } /// @@ -107,20 +101,10 @@ public static void OnImageLoadPdfSharp(object sender, HtmlImageLoadEventArgs e) public static void ImageLoad(HtmlImageLoadEventArgs e, bool pdfSharp) { var img = TryLoadResourceImage(e.Src); - XImage xImg = null; - - if (img != null) - { - using (var ms = new MemoryStream()) - { - img.Save(ms, img.RawFormat); - xImg = img != null ? XImage.FromStream(ms) : null; - } - } object imgObj; if (pdfSharp) - imgObj = xImg; + imgObj = img != null ? CreatePdfSharpImage(img) : null; else imgObj = img; @@ -157,5 +141,17 @@ public static void ImageLoad(HtmlImageLoadEventArgs e, bool pdfSharp) if (img != null) e.Callback(imgObj); } + + /// + /// Convert image to PNG before creating because PdfSharp does not support GIF streams. + /// + private static XImage CreatePdfSharpImage(Image img) + { + using (var ms = new MemoryStream()) + { + img.Save(ms, ImageFormat.Png); + return XImage.FromStream(ms); + } + } } } \ No newline at end of file diff --git a/Source/Directory.Build.props b/Source/Directory.Build.props index fc2659ad8..759ddb8d5 100644 --- a/Source/Directory.Build.props +++ b/Source/Directory.Build.props @@ -5,9 +5,9 @@ Arthur Teplitzki Open source hosted on GitHub Copyright © 2008-2026 - 1.6.0 - 1.6.0.0 - 1.6.0.0 + 1.6.1-dev + 1.6.1.0 + 1.6.1.0 README.md BSD-3-Clause https://codeplexarchive.org/project/HtmlRenderer diff --git a/Source/HtmlRenderer.WPF/HtmlRenderer.WPF.csproj b/Source/HtmlRenderer.WPF/HtmlRenderer.WPF.csproj index 65d9f483f..a633cb9cf 100644 --- a/Source/HtmlRenderer.WPF/HtmlRenderer.WPF.csproj +++ b/Source/HtmlRenderer.WPF/HtmlRenderer.WPF.csproj @@ -1,6 +1,6 @@ - net8.0-windows + net8.0-windows;net462 Library TheArtOfDev.HtmlRenderer.WPF true diff --git a/Source/HtmlRenderer.WinForms/HtmlRenderer.WinForms.csproj b/Source/HtmlRenderer.WinForms/HtmlRenderer.WinForms.csproj index 51aec7512..a6ae780a8 100644 --- a/Source/HtmlRenderer.WinForms/HtmlRenderer.WinForms.csproj +++ b/Source/HtmlRenderer.WinForms/HtmlRenderer.WinForms.csproj @@ -1,6 +1,6 @@ - net8.0-windows + net8.0-windows;net462 Library TheArtOfDev.HtmlRenderer.WinForms true