如何从字节数组 c# MVC .NET Core 在 iframe 中显示 pdf

Posted

技术标签:

【中文标题】如何从字节数组 c# MVC .NET Core 在 iframe 中显示 pdf【英文标题】:How to display pdf in a iframe from a byte array c# MVC .NET Core 【发布时间】:2019-05-07 23:49:21 【问题描述】:

我在网上搜索了答案,但没有任何运气。我想知道如何以及是否能够使用 Razor 将 pdf 文件渲染到位于我视图中的 iFrame 中。 pdf 是一个字节数组,并加载到我的模型中。

这是我目前的代码:

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");

我的模特:

 public async Task<ActionResult> 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);

我的看法:

<div class="tab-pane active" id="dokument">
    <iframe src="@Url.Action("ByteConverter", "RegulationController")"></iframe>
</div>

【问题讨论】:

iframe 为空。正文或标题中没有内容。 我看到您正在将 byte[] 传递到您的操作中 - 该值在哪里填充? 字节 [] 填充在我们正在构建的单独 API 中,该 API 从数据库中获取值。 API 获取数据并将其发送到我们的 WebbApp。所以基本上我得到了我需要的所有数据,我只需要在视图中呈现数据。这个特定的参数(pdfData)从模型中获取数据。 在您的问题中,您的 iframe 似乎是从一个不包含 pdfData 值的 URL 加载的,所以我不希望它按原样工作。 ByteConverter 方法是您调用 from 动作的动作还是辅助函数?顺便说一句,您不需要调用Stream.Write,因为您正在使用的MemoryStream 构造函数已经设置了该数据(我认为在这种情况下您也不需要以下行)。跨度> 从模型中调用 ByteConverter 方法,我将编辑我的帖子并包含模型,以便您查看它的外观。 【参考方案1】:

好的,所以几天后,我设法通过将模型中的 Pdf 值更改为 Convert.ToBase64String(result.Pdf) 来使其工作,如下所示:

 public async Task<ActionResult> 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);
        

在我看来,我完全跳过了 @Url.Action("ByteConverter", "RegulationController") 并将其替换为:

<iframe src="data:application/pdf;base64,@Model.Pdf" type="application/pdf"></iframe>

在除 IE 之外的所有网络浏览器中都像 i charm 一样工作,这是因为 Internet Explorer 不支持使用 DATA URI 作为 iframe 的来源。

【讨论】:

我正在尝试相同的方法,但调试器显示 - “资源解释为文档,但使用 MIME 类型 application/pdf 传输:“data:application/pdf;base64,JVBERi0xLjcKCjQgMCB...” 这是我的数据 - viewModel.PdfDataString = Convert.ToBase64String(pdfData); AND 在视图中 - 【参考方案2】:

你可以像这样修改你的代码:

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");

在视图中:

<div class="tab-pane active" id="dokument">
    <iframe src="@Url.Action("ByteConverter", "RegulationController")"></iframe>
</div>

然后在您的索引视图中删除ByteConverter(viewModel.Pdf);。并确认您已设置正确的控制器名称,使用Home 而不是HomeController

【讨论】:

当我已经在我的模型中进行操作时,为什么还要在我的 ByteConverter 方法中创建一个新的 ApiClient 实例?感觉多余。此外,要使该代码不显示任何错误,您需要使 ByteConverter 方法异步,例如“public async Task ByteCONverter()”。 @K.Oleksiak 。问题是 ByteConverter 在 iframe 加载时没有获取字节值,您可以将 result.Pdf 保存在服务器端,这取决于您。

以上是关于如何从字节数组 c# MVC .NET Core 在 iframe 中显示 pdf的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中将数据发送到 ASP.NET Core MVC 控制器?

如何在 C# 页面 ASP.NET Core MVC 上使用 SignInManager 和 Usermanager

如何将两个数组作为 POST 请求参数从 AJAX 发送到 MVC 控制器(ASP .NET Core 3.1 剃须刀)?

如何确定在 C# ASP.NET CORE MVC 5.0 中选择了哪个单选按钮

如何使用 C# 在 ASP.NET Core 3.1 MVC 中使用会话变量

将结构数组从 C#(.NET Core) 传递到 C++(未管理)