Skip to content

Commit 7fa783b

Browse files
committed
Enable PDF rendering in the WPF demo
1 parent 5e20724 commit 7fa783b

4 files changed

Lines changed: 61 additions & 3 deletions

File tree

Source/Demo/WPF/DemoWindow.xaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@
4343
<TextBlock Text="Generate Image" VerticalAlignment="Center"/>
4444
</StackPanel>
4545
</Button>
46-
<Button IsEnabled="False">
46+
<Button Click="OnGeneratePdf_Click">
4747
<StackPanel Orientation="Horizontal">
4848
<Image Source="{Binding ConverterParameter=pdf, Converter={StaticResource Converter}}" MaxHeight="18" Margin="0 0 5 0"/>
4949
<TextBlock Text="Generate PDF" VerticalAlignment="Center"/>

Source/Demo/WPF/DemoWindow.xaml.cs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@
1717
using System.Windows.Media;
1818
using System.Windows.Threading;
1919
using TheArtOfDev.HtmlRenderer.Demo.Common;
20+
using TheArtOfDev.HtmlRenderer.PdfSharp;
2021
using TheArtOfDev.HtmlRenderer.WPF;
22+
using PdfSharp;
2123

2224
namespace TheArtOfDev.HtmlRenderer.Demo.WPF
2325
{
@@ -111,6 +113,24 @@ private void OnGenerateImage_Click(object sender, RoutedEventArgs e)
111113
w.ShowDialog();
112114
}
113115

116+
/// <summary>
117+
/// Create PDF using PdfSharp project, save to file and open that file.
118+
/// </summary>
119+
private void OnGeneratePdf_Click(object sender, RoutedEventArgs e)
120+
{
121+
var config = new PdfGenerateConfig();
122+
config.PageSize = PageSize.A4;
123+
config.SetMargins(20);
124+
125+
var doc = PdfGenerator.GeneratePdf(_mainControl.GetHtml(), config, null, DemoUtils.OnStylesheetLoad, HtmlRenderingHelper.OnImageLoadPdfSharp);
126+
127+
var tmpFile = Path.GetTempFileName();
128+
var pdfFile = Path.ChangeExtension(tmpFile, ".pdf");
129+
doc.Save(pdfFile);
130+
131+
Process.Start(new ProcessStartInfo(pdfFile) { UseShellExecute = true });
132+
}
133+
114134
/// <summary>
115135
/// Execute performance test by setting all sample HTMLs in a loop.
116136
/// </summary>

Source/Demo/WPF/HtmlRenderer.Demo.WPF.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
<AppDesigner Include="Properties\" />
1616
</ItemGroup>
1717
<ItemGroup>
18+
<ProjectReference Include="..\..\HtmlRenderer.PdfSharp\HtmlRenderer.PdfSharp.csproj" />
1819
<ProjectReference Include="..\..\HtmlRenderer.WPF\HtmlRenderer.WPF.csproj" />
1920
<ProjectReference Include="..\..\HtmlRenderer\HtmlRenderer.csproj" />
2021
<ProjectReference Include="..\Common\HtmlRenderer.Demo.Common.csproj" />

Source/Demo/WPF/HtmlRenderingHelper.cs

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
using System.Threading;
1717
using System.Windows;
1818
using System.Windows.Media.Imaging;
19+
using PdfSharp.Drawing;
1920
using TheArtOfDev.HtmlRenderer.Core.Entities;
2021
using TheArtOfDev.HtmlRenderer.Demo.Common;
2122
using TheArtOfDev.HtmlRenderer.WPF;
@@ -60,6 +61,7 @@ public static BitmapEncoder GetBitmapEncoder(string ext)
6061
return new PngBitmapEncoder();
6162

6263
}
64+
6365
}
6466

6567
/// <summary>
@@ -118,12 +120,29 @@ public static void OnImageLoad(object sender, HtmlImageLoadEventArgs args)
118120
ImageLoad(args);
119121
}
120122

123+
/// <summary>
124+
/// On image load in renderer set the image by event async.
125+
/// </summary>
126+
public static void OnImageLoadPdfSharp(object sender, HtmlImageLoadEventArgs args)
127+
{
128+
ImageLoad(args, true);
129+
}
130+
121131
/// <summary>
122132
/// On image load in renderer set the image by event async.
123133
/// </summary>
124134
public static void ImageLoad(HtmlImageLoadEventArgs e)
135+
{
136+
ImageLoad(e, false);
137+
}
138+
139+
/// <summary>
140+
/// On image load in renderer set the image by event async.
141+
/// </summary>
142+
public static void ImageLoad(HtmlImageLoadEventArgs e, bool pdfSharp)
125143
{
126144
var img = TryLoadResourceImage(e.Src);
145+
var imgObj = pdfSharp ? (object)(img != null ? CreatePdfSharpImage(img) : null) : img;
127146

128147
if (!e.Handled && e.Attributes != null)
129148
{
@@ -150,13 +169,31 @@ public static void ImageLoad(HtmlImageLoadEventArgs e)
150169
{
151170
var split = e.Attributes["byrect"].Split(',');
152171
var rect = new Rect(Int32.Parse(split[0]), Int32.Parse(split[1]), Int32.Parse(split[2]), Int32.Parse(split[3]));
153-
e.Callback(img ?? TryLoadResourceImage("htmlicon"), rect.X, rect.Y, rect.Width, rect.Height);
172+
var defaultResourceImage = TryLoadResourceImage("htmlicon");
173+
var defaultImg = pdfSharp && defaultResourceImage != null ? (object)CreatePdfSharpImage(defaultResourceImage) : defaultResourceImage;
174+
e.Callback(imgObj ?? defaultImg, rect.X, rect.Y, rect.Width, rect.Height);
154175
return;
155176
}
156177
}
157178

158179
if (img != null)
159-
e.Callback(img);
180+
e.Callback(imgObj);
181+
}
182+
183+
/// <summary>
184+
/// Convert image to PNG before creating <see cref="XImage"/> because PdfSharp does not support GIF streams.
185+
/// </summary>
186+
private static XImage CreatePdfSharpImage(BitmapSource image)
187+
{
188+
var encoder = new PngBitmapEncoder();
189+
encoder.Frames.Add(BitmapFrame.Create(image));
190+
191+
using (var ms = new MemoryStream())
192+
{
193+
encoder.Save(ms);
194+
ms.Position = 0;
195+
return XImage.FromStream(ms);
196+
}
160197
}
161198
}
162199
}

0 commit comments

Comments
 (0)