【问题标题】:Stream a PDF to a web page failing将 PDF 流式传输到网页失败
【发布时间】:2009-01-27 15:30:55
【问题描述】:

我有一个 PDF 的 URL,我想将 PDF 提供给我的页面查看器。

我可以成功(我认为)检索 PDF 文件。然后,当我执行 Response.BinaryWrite() 时,我从 adobe 阅读器收到“文件已损坏且无法修复”错误。

这是我的代码:

protected void Page_Load(object sender, EventArgs e)
    {
        if (IsPostBack)
        {
            byte[] output = DoWork("Http://localhost/test.pdf");
            Response.Clear();
            Response.ContentType = "application/pdf";
            Response.AddHeader("content-disposition", "inline; filename=MyPDF.PDF");
            Response.AddHeader("content-length", output.Length.ToString());
            Response.BinaryWrite(output);
            Response.End();
        }
    }

    public byte[] DoWork(string requestUrl)
    {
        byte[] responseData;
        HttpWebRequest req = null;
        HttpWebResponse resp = null;
        StreamReader strmReader = null;

        try
        {
            req = (HttpWebRequest)WebRequest.Create(requestUrl);

            using (resp = (HttpWebResponse)req.GetResponse())
            {
                byte[] buffer = new byte[resp.ContentLength];
                BinaryReader reader = new BinaryReader(resp.GetResponseStream());
                reader.Read(buffer, 0, buffer.Length);
                responseData = buffer;
            }
        }
        finally
        {
            if (req != null)
            {
                req = null;
            }

            if (resp != null)
            {
                resp.Close();
                resp = null;
            }
        }

        return responseData;

    }

【问题讨论】:

  • 你能用这个下载吗,我的意思是让浏览器(或 wget)来完成工作?

标签: c# asp.net pdf


【解决方案1】:

显然,我需要使用 ReadBytes() 出于某种原因,当从 URL 读取 PDF 时,您没有得到您请求的所有字节。

    protected void Page_Load(object sender, EventArgs e)
    {
        if (IsPostBack)
        {
            byte[] output = DoWork("Http://localhost/test.pdf");
            Response.Clear();
            Response.ContentType = "application/pdf";
            Response.AddHeader("content-disposition", "attachment");
            Response.AddHeader("content-length", output.Length.ToString());
            Response.BinaryWrite(output);
            Response.End();
        }
    }

    public byte[] DoWork(string requestUrl)
    {
        byte[] responseData;
        HttpWebRequest req = null;
        HttpWebResponse resp = null;
        StreamReader strmReader = null;

        try
        {
            req = (HttpWebRequest)WebRequest.Create(requestUrl);

            using (resp = (HttpWebResponse)req.GetResponse())
            {
                byte[] buffer = new byte[resp.ContentLength];
                using (BinaryReader reader = new BinaryReader(resp.GetResponseStream()))
                {
                    buffer = reader.ReadBytes(buffer.Length);
                    reader.Close();
                }
                responseData = buffer;
            }
        }
        finally
        {
            if (req != null)
            {
                req = null;
            }

            if (resp != null)
            {
                resp.Close();
                resp = null;
            }
        }

        return responseData;

    }

【讨论】:

    【解决方案2】:

    尝试将生成的文件保存到您的磁盘。然后使用文本编辑器打开文件。也许您的脚本/源文件中有一些错误。

    【讨论】:

      【解决方案3】:

      你也可以尝试使用FileStream读取文件

       string strPath = Request.PhysicalApplicationPath 
                        + "\\document\\Test.pdf";
       FileStream fStream = new FileStream
                  (strPath, FileMode.Open, FileAccess.Read);
       StreamReader sReader = new StreamReader(fStream);
      

      【讨论】:

        【解决方案4】:

        尝试在二进制写入后刷新响应...

        Response.BinaryWrite(output);
        Response.Flush();
        Response.End();
        

        或者,尝试将 PDF 输出为附件,而不是内联:

        Response.AddHeader("Content-Disposition", "attachment;filename=MyPDF.PDF");
        

        【讨论】:

        • Flush 不是 BinaryReader 上的方法
        • 根据 MSDN 将其替换为 Close:除非您明确调用 Flush 或 Close,否则刷新流不会刷新其底层编码器。
        • 刷新阅读器??不知何故没有多大意义...... :) 你一直读到它是空的,不是吗?
        【解决方案5】:

        当我前几天在 Perl 中执行此操作时(作为我们内部网的快速hack),脚本的关键是:

        binmode(STDOUT);
        print "Content-type: application/pdf\n\n";
        binmode(FILE);
        print <FILE>;
        close(FILE);
        

        关键是要确保输入 输出流处于二进制模式,即如您所见,PDF 需要在整个链中被解释为二进制数据。

        【讨论】:

          【解决方案6】:

          您可以通过使用 WebClient 类来大大简化您的代码

          Here's the MSDN documentation.它不像底层的HttpWebRequest类那么繁琐。

          【讨论】:

            猜你喜欢
            • 2011-10-23
            • 2018-08-06
            • 1970-01-01
            • 1970-01-01
            • 2018-05-26
            • 1970-01-01
            • 2015-11-22
            • 1970-01-01
            • 2015-03-21
            相关资源
            最近更新 更多