首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RazorPDF将pdf文件保存到MVC4中的服务器目录

RazorPDF将pdf文件保存到MVC4中的服务器目录
EN

Stack Overflow用户
提问于 2013-08-10 02:31:28
回答 2查看 6.7K关注 0票数 5

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

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

代码语言:javascript
复制
return new PdfResult(claims, "PDF");
EN

回答 2

Stack Overflow用户

发布于 2013-08-31 01:45:58

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

代码语言:javascript
复制
        // Associate output with response stream
        var pdfWriter = PdfWriter.GetInstance(document, viewContext.HttpContext.Response.OutputStream);
        pdfWriter.CloseStream = false;

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

代码语言:javascript
复制
        // Create the pdf file in the directory system
        var fileStream = new FileStream(myPdfFilePath, FileMode.Create);
        var pdfWriter2 = PdfWriter.GetInstance(document, fileStream);

然后我关闭了对象:

代码语言:javascript
复制
        fileStream.Close();

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

我必须在本质上将RazorPDF的PdfResult和PdfView类合并到我自己的项目中,并对代码进行重大修改。原因是我还必须调用一个将pdf发送给用户的电子邮件类。

完整的渲染方法如下所示:

代码语言:javascript
复制
    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项目中,那就太好了。

票数 4
EN

Stack Overflow用户

发布于 2015-12-10 11:24:53

为什么不直接通过对url的web请求来获取流呢?

代码语言:javascript
复制
string razorPdfUrl="http://...";
var req = HttpWebRequest.Create(RazorPDFURL);
using (Stream pdfStream = req.GetResponse().GetResponseStream())
{
    ...
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18153340

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档