I've had received IFormFile from user and transform it to MemoryStream for save (see below codes), and than working with PdfSharp tools, it's working fine for other files but Images.

using (var fileStreamObj = new MemoryStream())
{
    await file.CopyToAsync(fileStreamObj);
    fileStreamObj.Seek(0, SeekOrigin.Begin);
}

When I try to convert this file-stream to XImage format of PdfShare via below codes, its crashes.

XImage img = XImage.FromStream(() => imageStreamObj)

And show this Error:

Image cannot be loaded. Available decoders:

  • GIF : GifDecoder

  • JPEG : JpegDecoder

  • PNG : PngDecoder

  • BMP : BmpDecoder

  • TGA : TgaDecoder

I had tried to Transform this file-stream into another MemoryStream but still doesn't work.

Also, I try to set "Stream.position = 0" make no difference. It still crashes.

I did check both part of File not corrupted and formats are Ok.

1

There are 1 best solutions below

0
On

Complete Solution of Merging both PDFs and Image Files via PDFsharp Package including solving "Convert Image Excepion (the Question).

private async Task <ActionResult> MergeMultipleFileIntoASinglePdfAsync(List <IFormFile> files) {
  PdfDocument pdfDocumentObj = new PdfDocument();

  foreach(var file in files) {
    var fileExtension = Path.GetExtension(file.FileName);

    using(var fileStreamObj = new MemoryStream()) {
      await file.CopyToAsync(fileStreamObj);
      fileStreamObj.Seek(0, SeekOrigin.Begin);

      if (fileExtension.ToLower() == ".pdf") {
        PdfDocument inputPdf = PdfReader.Open(fileStreamObj, PdfDocumentOpenMode.Import);
        pdfDocumentObj.Version = inputPdf.Version;

        foreach(PdfPage page in inputPdf.Pages) {
          pdfDocumentObj.AddPage(page);
        }
      } else if (fileExtension.ToLower() == ".bmp" || fileExtension.ToLower() == ".tga" ||
        fileExtension.ToLower() == ".jpg" || fileExtension.ToLower() == ".jpeg" ||
        fileExtension.ToLower() == ".png" || fileExtension.ToLower() == ".gif") {
        var pageWidthSize = 595;

        PdfPage page = pdfDocumentObj.AddPage();

        MemoryStream imageStreamObj = new MemoryStream();
        IImageFormat format;
        using(var image = Image.Load(fileStreamObj, out format)) {
          await image.SaveAsync(imageStreamObj, format);
          imageStreamObj.Position = 0;
        }

        using(XImage img = XImage.FromStream(() => imageStreamObj)) {
          var height = (int)(pageWidthSize / (double) img.PixelWidth * img.PixelHeight);

          page.Width = pageWidthSize;
          page.Height = height;

          XGraphics gfx = XGraphics.FromPdfPage(page);
          gfx.DrawImage(img, 0, 0, pageWidthSize, height);
        }
      } else {
        return StatusCode(StatusCodes.Status403Forbidden, "Format Unsupported!");
      }
    }
  }

  byte[] outputBytes;

  using(var outputStreamObj = new MemoryStream()) {
    pdfDocumentObj.Save(outputStreamObj);
    outputStreamObj.Seek(0, SeekOrigin.Begin);

    outputBytes = outputStreamObj.ToArray();
  }

  //pdfDocumentObj.Save("D:\\download\\merged_file.pdf");

  return File(outputBytes, "application/pdf", "merged_file.pdf");
}