I have a method SetImagePDF in my application that is supposed to render a Grid into a RenderTargetBitmap and convert it into an iText Image for PDF generation. However, I’m encountering an error at the line await renderTargetBitmap.RenderAsync(Page, (int)(scaledWidth), (int)(scaledHeight)); which throws an exception: ‘Value does not fall within the expected range.’
I suspect this error occurs because the Grid (Page) is never visually displayed, so RenderTargetBitmap cannot render it properly.
Here’s the part of my code:
private async Task<iText.Layout.Element.Image> SetImagePDF(Grid Page)
{
// Crée un flux en mémoire pour stocker les images
var stream = new InMemoryRandomAccessStream();
RenderTargetBitmap renderTargetBitmap = new RenderTargetBitmap();
try
{
int DPI = 600;
double scaledWhidth = (210 * DPI) / 25.4;
double scaledHeigh = (297 * DPI) / 25.4;
await renderTargetBitmap.RenderAsync(Page, (int)(scaledWhidth), (int)(scaledHeigh));
IBuffer pixelBuffer = await renderTargetBitmap.GetPixelsAsync();
byte[] pixels = pixelBuffer.ToArray();
var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.PngEncoderId, stream);
encoder.SetPixelData(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Premultiplied,
(uint)renderTargetBitmap.PixelWidth,
(uint)renderTargetBitmap.PixelHeight,
DPI, DPI, pixels);
await encoder.FlushAsync();
var bitmapImage = new BitmapImage();
stream.Seek(0);
var imageBytes = new byte[stream.Size];
await stream.AsStream().ReadAsync(imageBytes, 0, imageBytes.Length);
ImageData imageData = ImageDataFactory.Create(imageBytes);
return new iText.Layout.Element.Image(imageData);
}
catch (Exception e) { return null; }
}
Can someone help me understand how to properly render the Grid (Page) even if it’s not visually displayed? Or suggest how to ensure RenderTargetBitmap can render it correctly?
Wolsi Wolsi is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.