From dde63dcc5160e1af84214b05a705cca0de530967 Mon Sep 17 00:00:00 2001 From: Jerome Date: Thu, 3 Dec 2015 22:35:45 +0100 Subject: [PATCH] ENABLED SAVING HTML AS EMF FILE (VECTORIAL IMAGE): Added HtmlRender.RenderToMetafile(...) and MetafileExtensions.SaveAsEmf(...) extension method --- Source/HtmlRenderer.WinForms/HtmlRender.cs | 23 ++++++++++++ .../HtmlRenderer.WinForms.csproj | 1 + .../MetafileExtensions.cs | 37 +++++++++++++++++++ 3 files changed, 61 insertions(+) create mode 100644 Source/HtmlRenderer.WinForms/MetafileExtensions.cs diff --git a/Source/HtmlRenderer.WinForms/HtmlRender.cs b/Source/HtmlRenderer.WinForms/HtmlRender.cs index 2d3f349ec..3c6ad3ca9 100644 --- a/Source/HtmlRenderer.WinForms/HtmlRender.cs +++ b/Source/HtmlRenderer.WinForms/HtmlRender.cs @@ -273,6 +273,29 @@ public static SizeF RenderGdiPlus(Graphics g, string html, PointF location, Size } #if !MONO + + public static Metafile RenderToMetafile(string html, float left = 0, float top = 0, float maxWidth = 0, CssData cssData = null, + EventHandler stylesheetLoad = null, EventHandler imageLoad = null) + { + Metafile image; + IntPtr dib; + var memoryHdc = Win32Utils.CreateMemoryHdc(IntPtr.Zero, 1, 1, out dib); + try + { + image = new Metafile(memoryHdc, EmfType.EmfPlusDual, ".."); + + using (var g = Graphics.FromImage(image)) + { + Render(g, html, left, top, maxWidth, cssData, stylesheetLoad, imageLoad); + } + } + finally + { + Win32Utils.ReleaseMemoryHdc(memoryHdc, dib); + } + return image; + } + /// /// Renders the specified HTML on top of the given image.
/// will contain the rendered html in it on top of original content.
diff --git a/Source/HtmlRenderer.WinForms/HtmlRenderer.WinForms.csproj b/Source/HtmlRenderer.WinForms/HtmlRenderer.WinForms.csproj index 79b059d84..ce1a98759 100644 --- a/Source/HtmlRenderer.WinForms/HtmlRenderer.WinForms.csproj +++ b/Source/HtmlRenderer.WinForms/HtmlRenderer.WinForms.csproj @@ -87,6 +87,7 @@ Component + diff --git a/Source/HtmlRenderer.WinForms/MetafileExtensions.cs b/Source/HtmlRenderer.WinForms/MetafileExtensions.cs new file mode 100644 index 000000000..4b13ba607 --- /dev/null +++ b/Source/HtmlRenderer.WinForms/MetafileExtensions.cs @@ -0,0 +1,37 @@ +using System; +using System.Drawing.Imaging; +using System.IO; +using System.Runtime.InteropServices; + +namespace TheArtOfDev.HtmlRenderer.WinForms +{ + public static class MetafileExtensions + { + public static void SaveAsEmf(Metafile me, string fileName) + { + /* http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/12a1c749-b320-4ce9-aff7-9de0d7fd30ea + How to save or serialize a Metafile: Solution found + by : SWAT Team member _1 + Date : Friday, February 01, 2008 1:38 PM + */ + int enfMetafileHandle = me.GetHenhmetafile().ToInt32(); + int bufferSize = GetEnhMetaFileBits(enfMetafileHandle, 0, null); // Get required buffer size. + byte[] buffer = new byte[bufferSize]; // Allocate sufficient buffer + if (GetEnhMetaFileBits(enfMetafileHandle, bufferSize, buffer) <= 0) // Get raw metafile data. + throw new SystemException("Fail"); + + FileStream ms = File.Open(fileName, FileMode.Create); + ms.Write(buffer, 0, bufferSize); + ms.Close(); + ms.Dispose(); + if (!DeleteEnhMetaFile(enfMetafileHandle)) //free handle + throw new SystemException("Fail Free"); + } + + [DllImport("gdi32")] + public static extern int GetEnhMetaFileBits(int hemf, int cbBuffer, byte[] lpbBuffer); + + [DllImport("gdi32")] + public static extern bool DeleteEnhMetaFile(int hemfbitHandle); + } +}