我有一个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;
}
答案 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类那么繁琐。