6 votes

Comment afficher un PDF dans un iframe à partir d'un tableau d'octets en c# MVC .NET Core

J'ai cherché sur le web une réponse mais sans succès. Je me demande comment et si je suis capable de rendre un fichier pdf en utilisant Razor dans un iFrame situé dans ma vue. Le pdf est un tableau de bytes et est chargé dans mon modèle.

Voici mon code jusqu'à présent:

public ActionResult ByteConverter(byte[] pdfData)
{
    MemoryStream Stream = new MemoryStream(pdfData);
    Stream.Write(pdfData, 0 , pdfData.Length);
    Stream.Position = 0;
    return new FileStreamResult(Stream,"application/pdf");
}

Mon Modèle:

 public async Task Index()
 {
     ApiClient api = new ApiClient("http://localhost:43674/ApiCore");
     var result = await api.GetAsync();

       RegulationViewModel viewModel = new RegulationViewModel
       {
         ConnectedToRoadMap = result.ConnectedToRoadMap,
         Decided = result.Decided,
         Enforced = result.Enforced,
         Id = result.Id,
         Paragraph = result.Paragraph,
         Pdf = result.Pdf,
         Published = result.Published,
         Region = result.Region,
         StructuredInfo = result.StructuredInfo,
         Title = result.Title,
         ValidThru = result.ValidThru  
        };

        ByteConverter(viewModel.Pdf);

        return View(viewModel);
}

Et ma vue:

5voto

K.Oleksiak Points 98

D'accord, donc après quelques jours, j'ai réussi à le faire fonctionner en changeant la valeur du Pdf dans mon modèle en Convert.ToBase64String(result.Pdf) comme ceci :

 public async Task Index()
        {
            ApiClient api = new ApiClient("http://localhost:43674/ApiCore");
            var result = await api.GetAsync();

            RegulationViewModel viewModel = new RegulationViewModel
            {
                ConnectedToRoadMap = result.ConnectedToRoadMap,
                Decided = result.Decided,
                Enforced = result.Enforced,
                Id = result.Id,
                Paragraph = result.Paragraph,
                Pdf = Convert.ToBase64String(result.Pdf),
                Published = result.Published,
                Region = result.Region,
                StructuredInfo = result.StructuredInfo,
                Title = result.Title,
                ValidThru = result.ValidThru
            };

            return View(viewModel);
        }

Et dans ma vue, j'ai complètement sauté la @Url.Action("ByteConverter", "RegulationController") et l'ai remplacée par :

Fonctionne comme un charme dans tous les navigateurs web sauf IE, et c'est parce qu'Internet Explorer ne prend pas en charge l'utilisation des URI DE DONNÉES comme source des iframes.

0voto

Nan Yu Points 5422

Vous pouvez modifier votre code comme suit :

public ActionResult ByteConverter()
{
    ApiClient api = new ApiClient("http://localhost:43674/ApiCore");
    var result = await api.GetAsync();
    var pdfData = result.Pdf;
    MemoryStream Stream = new MemoryStream(pdfData);
    Stream.Write(pdfData, 0 , pdfData.Length);
    Stream.Position = 0;
    return new FileStreamResult(Stream,"application/pdf");
}

En vue :

Ensuite, supprimez ByteConverter(viewModel.Pdf); dans votre vue index. Vérifiez également que vous avez correctement défini le nom du contrôleur, utilisez Home au lieu de HomeController.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X