Open MazurchakVova opened 4 years ago
For example code https://github.com/MazurchakVova/ConvertHtmlToPDF
Solved the problem by implementing custom event handler when loading images
`...
private void OnImageLoad(object sender, HtmlImageLoadEventArgs e)
{
ImageSource.ImageSourceImpl = new CustomImageSource
// Base64 encoded images needs to be converted manually
if (e.Src.StartsWith("data:image/", StringComparison.InvariantCultureIgnoreCase))
{
var base64Data = e.Src.Substring(e.Src.IndexOf(",", StringComparison.InvariantCulture) + 1);
var imageBytes = Convert.FromBase64String(base64Data);
var stream = new MemoryStream(imageBytes);
var imgStream = XImage.FromStream(() => stream);
e.Callback(imgStream);
}
// Images with a path source
else
{
var templateImages = Path.Combine(TemplateRoot, "Images");
var imageFile = Path.Combine(templateImages, e.Src);
if (File.Exists(imageFile))
{
var imageBytes = File.ReadAllBytes(imageFile);
var stream = new MemoryStream(imageBytes);
var imgStream = XImage.FromStream(() => stream);
e.Callback(imgStream);
}
}
}
....`
and implementation for CustomImageSource
` using MigraDocCore.DocumentObjectModel.MigraDoc.DocumentObjectModel.Shapes; using SixLabors.ImageSharp; using SixLabors.ImageSharp.Formats.Bmp; using SixLabors.ImageSharp.Formats.Jpeg; using SixLabors.ImageSharp.PixelFormats;
public class CustomImageSource
protected override IImageSource FromBinaryImpl(string name, Func<byte[]> imageSource, int? quality = 75)
{
return new CustomImageSourceImplementation
protected override IImageSource FromFileImpl(string path, int? quality = 75)
{
return new CustomImageSourceImplementation<TPixel>(path, () => Image.Load<TPixel>(path), Quality);
}
protected override IImageSource FromStreamImpl(string name, Func<Stream> imageStream, int? quality = 75)
{
return new CustomImageSourceImplementation<TPixel>(name, () =>
{
using (var stream = imageStream.Invoke())
{
return Image.Load<TPixel>(stream);
}
}, Quality);
}
private class CustomImageSourceImplementation<TPixel2> : IImageSource where TPixel2 : struct, IPixel<TPixel2>
{
private readonly Func<Image<TPixel2>> _getImage;
private readonly int _quality;
private Image<TPixel2> _image;
private Image<TPixel2> Image => _image ?? (_image = _getImage.Invoke());
public int Width => Image.Width;
public int Height => Image.Height;
public string Name { get; }
public bool Transparent => _image?.PixelType?.BitsPerPixel == 32;
public void SaveAsPdfBitmap(MemoryStream ms)
{
Enum.TryParse<BmpBitsPerPixel>($"{_image?.PixelType?.BitsPerPixel}", out var _bpp);
Image.SaveAsBmp(ms, new BmpEncoder { BitsPerPixel = _bpp});
}
public CustomImageSourceImplementation(string name, Func<Image<TPixel2>> getImage, int quality)
{
Name = name;
_getImage = getImage;
_quality = quality;
}
public void SaveAsJpeg(MemoryStream ms)
{
Image.SaveAsJpeg(ms, new JpegEncoder { Quality = _quality });
}
public void Dispose()
{
Image.Dispose();
}
}
}
}`
Hope it helps others who run into this problem
Interesting, obviously a PDF generated from a HTML source. Wondering now what purpose that image is, as I see only an empty page with the Adobe PDF-viewer.
Hi Stefan, for me it was a problem when adding images from a template. It had to do with transparency of those images.
Thank you for your reply!
Verstuurd vanaf mijn iPhone
Op 15 mei 2020 om 14:25 heeft Stefan Steiger notifications@github.com het volgende geschreven:
Interesting, obviously a PDF generated from a HTML source. Wondering now what purpose that image is, as I see only an empty page with the Adobe PDF-viewer.
— You are receiving this because you commented. Reply to this email directly, view it on GitHub, or unsubscribe.
I believe you, but please add additional details. Otherwise I can't do anything about it.