当前位置: 首页 > 知识库问答 >
问题:

ASP.NET核心:创建和打开PDF(在浏览器中)

戚祺
2023-03-14

在ASP.NET核心中工作,并使用iTextSharp,我正在构建一个PDF并将其保存到本地系统中。我现在想在浏览器中打开该文件,但似乎无法打开,因为我在一次尝试中得到了FileStream错误,而在另一次尝试中则一无所获。

我的逻辑在下面的控制器里。我已经用//region description替换了不必要的代码。重要的代码(我尝试的内容)在todo:Open The file区域中。

    [HttpPost]
    public (JsonResult, IActionResult) CreatePDF([FromBody] ReportViewModel model)
    {
        try
        {

            // region Logic code
            using (System.IO.MemoryStream memoryStream = new System.IO.MemoryStream())
            {
                // Create the document
                iTextSharp.text.Document document = new iTextSharp.text.Document();
                // Place the document in the PDFWriter
                iTextSharp.text.pdf.PdfWriter PDFWriter =
                    iTextSharp.text.pdf.PdfWriter.GetInstance(document, memoryStream);

                // region Initialize Fonts

                // Open the document
                document.Open();

                // region Add content to document

                // Close the document
                document.Close();

                #region Create and Write the file
                // Create the directory
                string directory = $"{_settings.Value.ReportDirectory}\\";
                System.IO.Directory.CreateDirectory(System.IO.Path.GetDirectoryName(directory));

                // region Create the fileName

                // Combine the directory and the fileName
                directory = System.IO.Path.Combine(directory, fileName);

                // Create the file
                byte[] content = memoryStream.ToArray();
                using (System.IO.FileStream fs = System.IO.File.Create(directory))
                {
                    fs.Write(content, 0, (int)content.Length);
                }
                #endregion

                #region TODO: Open the file
                // TRY: File(Stream, type) => Newtonsoft.Json.JsonSerializationException:
                // Error getting value from 'ReadTimeout' on 'System.IO.FileStream'.
                // ---> System.InvalidOperationException: Timeouts are supported for this stream.
                System.IO.FileStream fileStream = new System.IO.FileStream(directory, System.IO.FileMode.Open);
                var returnPDF = File(fileStream, contentType: "application/pdf");

                // TRY: File(path, type) => Newtonsoft.Json.JsonSerializationException:
                // Error getting value from 'ReadTimeout' on 'System.IO.FileStream'.
                // ---> System.InvalidOperationException: Timeouts are supported for this stream.
                returnPDF = File(System.IO.File.OpenRead(directory), contentType: "application/pdf" );

                // TRY: File(byte[], type) => Nothing happened
                returnPDF = File(content, contentType: "apllication/pdf");
                #endregion

                return ( Json(new { isError = false }), returnPDF );
            }
        }
        catch (System.Exception ex)
        {
            Serilog.Log.Error($"ReportController.CreatePDF() - {ex}");
            return ( Json(new { isError = true, errorMessage = ex.Message }), null );
        }
    }
  • 使用ASP.NET核心将PDF返回到浏览器
  • 在浏览器中的新选项卡中打开PDF
  • 序列化流对象时提供异常的Web api控制器方法
  • Stream.ReadTimeout引发System.InvalidOperationException类型的异常

共有1个答案

吴鸿禧
2023-03-14

您可以创建一个FileContentResult,并将您已经分配的byte[]传递给它,而不是从目录中再次加载文件。

return ( Json(new { isError = false }), new FileContentResult(content, "application/pdf"));

请记住,浏览器不会以这种方式下载文件。它将提取响应流,但不下载它,因为它在json响应中,因此响应内容类型将是application/json。

相反,您可以只返回一个IActionResult,然后像这样做:

return new FileContentResult(content, "application/pdf");
services.AddSingleton<IActionContextAccessor, ActionContextAccessor>();

当响应isError等于false时,可以在前端编程地“单击”该url。

 类似资料:
  • 问题内容: 我想执行XMLHttpRequest,然后通过POST方法发送文件名在浏览器中打开PDF。 这可能吗,或者XMLHttpRequest仅用于HTML? 问题答案: 如果您查询的URL实际上返回PDF数据,则无法通过XMLHttpRequest进行操作。 为什么?因为该响应是包含原始PDF数据的HTTP响应。即使您确实可以通过responseText`属性访问数据,JavaScript也

  • 我遇到了一个有用的PDF生成代码,用于在Spring MVC应用程序中向客户机显示文件(“使用Spring MVC返回生成的PDF”): 我添加了一个声明,该方法返回一个PDF文件(“Spring 3.0 Java REST return PDF Document”):。 我的问题是,当上面的代码执行时,它立即要求客户机保存PDF文件。我希望PDF文件首先在浏览器中查看,这样客户端就可以决定是否保

  • 全局基类 登录名 } 问题是,当运行此功能时,我得到了下面的错误,我不明白为什么会发生这种情况,因为它在错误的位置上没有给我任何帮助。 未定义步骤:给定I打开Chrome 未定义步骤:浏览网站时 未定义的步骤:然后我使用“user1”和“password1”登录网站

  • 问题内容: 我是angular js的新手,我希望在按下按钮后在浏览器的新窗口中打开PDF文档。 我在前端发出GET请求,在后端有一个Java Rest服务,该服务响应GET并生成PDF。我希望在浏览器中打开此PDF。 如果无法以这种方式打开PDF,那么至少要使用AngularJs打开任何PDF,我该怎么做? 这就是后端在其余服务中生成响应的内容。 问题答案: 如果您有这样的事情: 而是这样做:

  • 我很难让swashbuckle.aspnetcore(1.0.0)包生成任何输出。我读到swagger.json文件应该写到'~/swagger/docs/v1'。然而,我没有得到任何输出。 我从一个全新的ASP.NET核心API项目开始。我应该提到这是ASP.NET Core2。API可以工作,我可以从values控制器检索值。 我的启动类的配置与本文描述的完全相同(GitHub上的swashb

  • 本文向大家介绍在Nginx浏览器中打开目录浏览功能,包括了在Nginx浏览器中打开目录浏览功能的使用技巧和注意事项,需要的朋友参考一下 在nginx中不像apache默认是打开目录浏览功能的,在nignx中目录浏览功能默认是关闭了,下面我来介绍在nginx中实现目录浏览功能的配置方法。 打开nginx.conf文件,在location server 或 http段中加入 另外两个参数最好也加上去: