2012-03-10 107 views
4

我搜索了这个,搜索了这个,查看了SO和其他网站(我一直试图在这个问题上阅读几个小时),但我仍然无法找到令人满意的解决方案似乎是一个简单的,常见的编程问题。在Web应用程序中显示PDF

让我设置场景:

  • 我有一个网站/网页应用程序,允许用户搜索一个SQL Server库。
  • 大部分与搜索结果相关的文档都是PDF文件。
  • PDF文件存储在SQL Server数据库的一个BLOB内部。
  • 我希望能够动态地从数据库中拉出PDF并将其显示给用户。
  • 为了保留用户的搜索进度,我想我想在另一个浏览器窗口/选项卡中打开该文件
  • 我已经想出了如何将PDF保存到指定目录中的服务器。
  • I 请勿希望用户查看文件的路径。
  • 在合理范围内,我想,在所有主要的浏览器上运行的解决方案:
    1. 的Internet Explorer
    2. 火狐
    3. Safari浏览器(包括iPhone/iPad的移动版Safari)
  • 我我宁愿不购买第三方组件,但如果有必要,我愿意走这条路。
  • 我不认为我想发送该文件作为下载(我想我已经想出了该怎么做),因为这不会在iPhone/iPad上失败吗?

到目前为止,我想尽解决方案有一些基本的问题,不妥之处:

  • 使用的iFrame似乎在iPhone上惨败/ iPad的
  • 使用Server.Transfer的(我使用ASP.NET)显示乱码而不是PDF
  • 我尝试了几个演示第三方解决方案,但它们也太臭了!

我找不出来!我真的是桌面开发人员,这是EASY在Windows!为什么在网络上这么难?

我是不是很笨,这真的是一个简单的练习,还是这个基本任务真的很难?

请帮助指点我正确的方向!

谢谢!

+0

我不知道ASP.NET,但我认为你使用Server.Transfer时得到乱码的原因可能是你没有将响应的内容类型头设置为'application/pdf' - 或者您? :) – Daan 2012-03-10 15:30:40

+0

啊,你正在做一个Server.Transfer到.PDF文件?我以为你正在转移到另一个显示PDF内联的ASP.NET脚本,就像下面Rich Andrews的回答一样。在这种情况下,您需要在脚本中设置内容类型,如您在答案中所看到的那样:) – Daan 2012-03-10 21:31:45

回答

6

你是否尝试添加一个http头与内容处置内联?您也可以直接将结果写入输出响应而不是保存。这将确保文件的实际路径不会显示为直接写入响应。

Response.ContentType = "application/pdf"; 
Response.AddHeader("Content-disposition","inline"); 
Response.BinaryWrite(myfilestream.ToArray()); 

凡myfilestream是一个内存流,或者如果你已经从你的blob的字节数组,你可以直接写入响应无指定者

+0

这个答案接近于接受的答案,所以我投了票。谢谢! – mbm29414 2012-03-10 21:58:50

+0

这似乎在IE浏览器上工作,但在FF上,它要求在默认浏览器中打开它或保存它(意思是下载),但是它在文本上显示在同一个窗口上。 – Rob 2013-03-06 01:32:09

1

ASP.Net有ReportViewer可用于显示PDF文件的服务器控件。

有关此功能的大部分文档都是关于如何生成报告并将其导出到PDF。 MSDN确实不是很有帮助。我想每个人都依靠Adobe Reader而不是寻找替代品?

但是它也有可能导致导入并显示PDF。此代码似乎为this user工作:

public static void RenderToPdf(ReportViewer reportViewer, Boolean forceDownload) 
{ 
    string path = (string.IsNullOrEmpty(reportViewer.LocalReport.ReportPath)) ? reportViewer.ServerReport.ReportPath : reportViewer.LocalReport.ReportPath; 
    RenderToPdf(reportViewer, forceDownload, System.IO.Path.GetFileNameWithoutExtension(path)); 
} 

public static void RenderToPdf(ReportViewer reportViewer, Boolean forceDownload, string fileNameWithoutExtension) 
{ 
    HttpContext context = HttpContext.Current; 

    if (!context.Response.Buffer) 
    { 
     return; //can not clear the buffer, so exit 
    } 

    //define out properties 
    Warning[] warnings; 
    string mimeType, encoding, fileNameExtension; 
    string[] streams; 

    //get pdf content 
    Byte[] pdfContent = reportViewer.LocalReport.Render("PDF", null, out mimeType, out encoding, out fileNameExtension, out streams, out warnings); 

    //cancel and clear the existing output! 
    context.Response.Clear(); 
    context.Response.ContentType = "application/pdf"; 

    //add a header so that the user can save the target as a downloaded file 
    if (forceDownload) 
    { 
     context.Response.AddHeader("Content-disposition", string.Format("attachment; filename={0}.pdf", fileNameWithoutExtension)); 
    } 

    context.Response.BinaryWrite(pdfContent); 
    context.Response.End(); 
} 
+0

我无法得到这个工作。 'Byte [] pdfContent = reportViewer ...'行不断给我一个未处理的异常。所以我放弃了这种方法,并采用了可接受的解决方案。 – mbm29414 2012-03-10 21:58:16

+0

太糟糕了。我想有一个原因是为什么只有很少的文档...我留在这里作为一个谨慎的尝试,试图让ASP.Net的方法工作的人尝试了很多努力。 – DOK 2012-03-11 16:54:39

0

这是我要怎么做才能打开从ASP.NET(C++)网页浏览器中的PDF文档。 在页面的OnLoad:

 this.Response.Clear(); 
     this.Response.Buffer = true; 
     this.Response.ContentType = "application/pdf"; 
     this.Response.AddHeader("content-length", pdfReportStream.Length.ToString()); 
     this.Response.BinaryWrite(pdfReportStream.ToByteArray()); 

     this.Response.End(); 
0

如果你正在寻找客户端PDF客户端,你可以看看PDF.js可以显示与包括在默认浏览器的任何PDF(你必须改变观众如果在MVC中,.html转换为视图,但它很容易)。 它是开放源代码和alive.I不得不适应它有点能够显示在iPhone(数字签名)的pdf注释通过评论js中的一些行。

相关问题