diff --git a/OpenXmlPowerTools/WmlToHtmlConverter.cs b/OpenXmlPowerTools/WmlToHtmlConverter.cs
index 3d1cb496..3246d2cf 100644
--- a/OpenXmlPowerTools/WmlToHtmlConverter.cs
+++ b/OpenXmlPowerTools/WmlToHtmlConverter.cs
@@ -6,6 +6,7 @@
using System.Diagnostics.CodeAnalysis;
using System.Drawing;
using System.Globalization;
+using System.IO;
using System.Linq;
using System.Text;
using System.Xml.Linq;
@@ -118,9 +119,18 @@ public static XElement ConvertToHtml(WordprocessingDocument wDoc, HtmlConverterS
[SuppressMessage("ReSharper", "NotAccessedField.Global")]
[SuppressMessage("ReSharper", "UnusedMember.Global")]
- public class ImageInfo
+ public class ImageInfo : IDisposable
{
- public Bitmap Bitmap;
+ public ImageInfo()
+ {
+ m_bitmap = new Lazy(() => new Bitmap(new MemoryStream(ImageBytes)));
+ }
+
+ private readonly Lazy m_bitmap;
+ public Bitmap Bitmap => m_bitmap.Value;
+
+ public byte[] ImageBytes;
+
public XAttribute ImgStyleAttribute;
public string ContentType;
public XElement DrawingElement;
@@ -128,6 +138,14 @@ public class ImageInfo
public const int EmusPerInch = 914400;
public const int EmusPerCm = 360000;
+
+ public void Dispose()
+ {
+ if (m_bitmap.IsValueCreated)
+ {
+ m_bitmap.Value.Dispose();
+ }
+ }
}
public static class WmlToHtmlConverter
@@ -3078,48 +3096,54 @@ private static XElement ProcessDrawing(WordprocessingDocument wordDoc,
if (!ImageContentTypes.Contains(contentType))
return null;
+
+ var memoryStream = new MemoryStream();
using (var partStream = imagePart.GetStream())
- using (var bitmap = new Bitmap(partStream))
{
+ partStream.CopyTo(memoryStream);
+ var imageBytes = memoryStream.ToArray();
+
if (extentCx != null && extentCy != null)
{
- var imageInfo = new ImageInfo()
- {
- Bitmap = bitmap,
- ImgStyleAttribute = new XAttribute("style",
- string.Format(NumberFormatInfo.InvariantInfo,
- "width: {0}in; height: {1}in",
- (float)extentCx / (float)ImageInfo.EmusPerInch,
- (float)extentCy / (float)ImageInfo.EmusPerInch)),
- ContentType = contentType,
- DrawingElement = element,
- AltText = altText,
- };
- var imgElement2 = imageHandler(imageInfo);
- if (hyperlinkUri != null)
- {
- return new XElement(XhtmlNoNamespace.a,
- new XAttribute(XhtmlNoNamespace.href, hyperlinkUri),
- imgElement2);
+ using (var imageInfo = new ImageInfo
+ {
+ ImageBytes = imageBytes,
+ ImgStyleAttribute = new XAttribute("style",
+ string.Format(NumberFormatInfo.InvariantInfo,
+ "width: {0}in; height: {1}in",
+ (float)extentCx / (float)ImageInfo.EmusPerInch,
+ (float)extentCy / (float)ImageInfo.EmusPerInch)),
+ ContentType = contentType,
+ DrawingElement = element,
+ AltText = altText,
+ })
+ {
+ var imgElement2 = imageHandler(imageInfo);
+ if (hyperlinkUri != null)
+ {
+ return new XElement(XhtmlNoNamespace.a, new XAttribute(XhtmlNoNamespace.href, hyperlinkUri), imgElement2);
+ }
+ return imgElement2;
}
- return imgElement2;
}
- var imageInfo2 = new ImageInfo()
+ using (var imageInfo2 = new ImageInfo()
{
- Bitmap = bitmap,
+ ImageBytes = imageBytes,
ContentType = contentType,
DrawingElement = element,
AltText = altText,
- };
- var imgElement = imageHandler(imageInfo2);
- if (hyperlinkUri != null)
+ })
{
- return new XElement(XhtmlNoNamespace.a,
- new XAttribute(XhtmlNoNamespace.href, hyperlinkUri),
- imgElement);
+ var imgElement = imageHandler(imageInfo2);
+ if (hyperlinkUri != null)
+ {
+ return new XElement(XhtmlNoNamespace.a,
+ new XAttribute(XhtmlNoNamespace.href, hyperlinkUri),
+ imgElement);
+ }
+ return imgElement;
}
- return imgElement;
}
}
@@ -3145,18 +3169,18 @@ private static XElement ProcessPictureOrObject(WordprocessingDocument wordDoc,
{
try
{
- using (var bitmap = new Bitmap(partStream))
+ var memoryStream = new MemoryStream();
+ partStream.CopyTo(memoryStream);
+ using (var imageInfo = new ImageInfo()
+ {
+ ImageBytes = memoryStream.ToArray(),
+ ContentType = contentType,
+ DrawingElement = element
+ })
{
- var imageInfo = new ImageInfo()
- {
- Bitmap = bitmap,
- ContentType = contentType,
- DrawingElement = element
- };
-
var style = (string)element.Elements(VML.shape).Attributes("style").FirstOrDefault();
if (style == null) return imageHandler(imageInfo);
-
+
var tokens = style.Split(';');
var widthInPoints = WidthInPoints(tokens);
var heightInPoints = HeightInPoints(tokens);