【问题标题】:RazorPDF save pdf file to server directory in MVC4RazorPDF 将 pdf 文件保存到 MVC4 中的服务器目录
【发布时间】:2013-08-09 18:31:28
【问题描述】:

我目前正在 MVC4 中使用 RazorPDF 组装和显示 PDF,并希望在返回视图的同时将 PDF 文件保存到文件系统。

控制器动作中的以下代码行正在调用视图:

return new PdfResult(claims, "PDF");

【问题讨论】:

  • 你解决了吗?我也有同样的问题。
  • 我仍然遇到同样的问题。还没有解决方案。
  • 你看过这个帖子stackoverflow.com/questions/5826649/… 吗?应该可以在调用PdfResult() 之前添加Content-Disposition 标头——它是否有效还有待观察。
  • 考虑到 pdf 仅在调用 return new PDFResult 后在视图中创建,您将如何在同一控制器 ActionResult 中使用 ContentDisposition 来调用创建 pdf 视图?

标签: asp.net-mvc asp.net-mvc-4 razorpdf


【解决方案1】:

通过更改 RazorPDF 渲染方法的代码库,我终于能够将 pdf 写入目录系统。 Rendor 方法创建一个与响应流相关联的 PdfWriter 对象:

        // Associate output with response stream
        var pdfWriter = PdfWriter.GetInstance(document, viewContext.HttpContext.Response.OutputStream);
        pdfWriter.CloseStream = false;

解决方案是创建另一个与 FileStream 对象关联的 PdfWriter 对象,如下所示:

        // Create the pdf file in the directory system
        var fileStream = new FileStream(myPdfFilePath, FileMode.Create);
        var pdfWriter2 = PdfWriter.GetInstance(document, fileStream);

然后我关闭了对象:

        fileStream.Close();

        pdfWriter.Close();
        pdfWriter2.Close();

我必须将 RazorPDF 的 PdfResult 和 PdfView 类合并到我自己的项目中,并显着更改代码。原因是我还必须合并对将 pdf 发送给用户的电子邮件类的调用。

完整的Render方法如下所示:

    public void Render(ViewContext viewContext, TextWriter writer)
    {
        // generate view into string
        var sb = new System.Text.StringBuilder();
        TextWriter tw = new System.IO.StringWriter(sb);
        myResult.View.Render(viewContext, tw);
        var resultCache = sb.ToString();

        // detect itext (or html) format of response
        XmlParser parser;
        using (var reader = GetXmlReader(resultCache))
        {
            while (reader.Read() && reader.NodeType != XmlNodeType.Element)
            {
                // no-op
            }

            if (reader.NodeType == XmlNodeType.Element && reader.Name == "itext")
                parser = new XmlParser();
            else
                parser = new HtmlParser();
        }

        // Create a document processing context
        var document = new Document();
        document.Open();

        // Associate output with response stream
        var pdfWriter = PdfWriter.GetInstance(document, viewContext.HttpContext.Response.OutputStream);
        pdfWriter.CloseStream = false;

        // Create the pdf file in the directory system
        var fileStream = new FileStream(myPdfFilePath, FileMode.Create);
        var pdfWriter2 = PdfWriter.GetInstance(document, fileStream);

        // this is as close as we can get to being "success" before writing output
        // so set the content type now
        viewContext.HttpContext.Response.ContentType = "application/pdf";

        // parse memory through document into output
        using (var reader = GetXmlReader(resultCache))
        {
            parser.Go(document, reader);
        }

        fileStream.Close();

        // Send an email to the claimant
        Thread.Sleep(100);
        if (File.Exists(myPdfFilePath))
        {
            var subject = "PDF Documents";

            var body = Config.GetContent(ContentParams.CLAIM_DOCUMENT_EMAIL_BODY_TEXT);

            bool success;
            string errorMessage;

            Email.Send(myEmailAddress, subject, body, out success, out errorMessage, myPdfFilePath);
        }

        pdfWriter.Close();
        pdfWriter2.Close();

    }

如果能以某种方式将此功能整合到当前的 RazorPDF 项目中,那就太好了。

【讨论】:

  • 您也可以接受自己的回复作为答案。似乎回答了我。
【解决方案2】:

为什么不直接通过对 url 的网络请求获取流?

string razorPdfUrl="http://...";
var req = HttpWebRequest.Create(RazorPDFURL);
using (Stream pdfStream = req.GetResponse().GetResponseStream())
{
    ...
}

【讨论】:

  • 这并没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方发表评论 - 您可以随时对自己的帖子发表评论,一旦您拥有足够的声誉,您就可以对任何帖子发表评论。
猜你喜欢
  • 1970-01-01
  • 2016-01-22
  • 2011-09-14
  • 1970-01-01
  • 2018-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多