I'm trying to return a file to browser, unfortunately I get an error:
System.ObjectDisposedException: Cannot access a closed Stream. at System.IO.MemoryStream.Read(Byte[] buffer, Int32 offset, Int32 count) at System.IO.MemoryStream.ReadAsync(Memory`1 buffer, CancellationToken cancellationToken)
My controller action is:
public IActionResult DownloadBarcode(Guid barcodeId)
{
var currentUserId = User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.NameIdentifier).Value;
var barcode = _context.Barcodes.Find(barcodeId);
var myBarcode = QRCodeWriter.CreateBarcode(barcode.Value);
myBarcode.AddAnnotationTextBelowBarcode(barcode.Value);
var stream = myBarcode.ToPdfStream();
return File(stream, "application/pdf", $"etykieta{barcodeId}.pdf");
}
The underlying 3rd party ToPdfStream()
doesn't close the stream and sets Position
to 0.
public Stream ToPdfStream()
{
PdfDocument pdfDocument = new PdfDocument(generateUniqueDocumentIdentifiers: true);
Bitmap innerBitmap = InnerBitmap;
PdfPage pdfPage = pdfDocument.AddPage();
pdfPage.Width = innerBitmap.Width;
pdfPage.Height = innerBitmap.Height;
pdfPage.TrimMargins.All = 0;
DrawImage(XGraphics.FromPdfPage(pdfPage), innerBitmap, 0, 0);
using Stream stream = new MemoryStream();
pdfDocument.Save(stream, closeStream: false);
return stream;
}