将PDF流式传输到网页失败

时间:2009-01-27 15:30:55

标签: c# asp.net pdf

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

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

这是我的代码:

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;

    }

6 个答案:

答案 0 :(得分:3)

显然,我需要使用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;

    }

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

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

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

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

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

答案 4 :(得分:0)

前几天我在Perl中这样做(作为我们内部网的快速 hack ),脚本的关键是:

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

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

答案 5 :(得分:0)

您可以通过使用WebClient类

来简化代码

Here's the MSDN documentation.它不像较低级别的HttpWebRequest类那么繁琐。