【问题标题】:Display PDF in Web Application在 Web 应用程序中显示 PDF
【发布时间】:2012-03-27 16:48:38
【问题描述】:

我已经用谷歌搜索过这个,搜索过这个,浏览了 SO 和其他网站(我已经尝试阅读这个问题几个小时了),但我似乎仍然无法找到令人满意的解决方案。一个简单、常见的编程问题。

让我来设置场景:

  • 我有一个网站/Web 应用程序,允许用户搜索 SQL Server 库。
  • 与搜索结果相关的大部分文档都是PDF文件。
  • PDF 文件以 BLOB 形式存储在 SQL Server 数据库中。
  • 我希望能够从数据库中动态提取 PDF 并将其显示给用户。
  • 为了保留用户的搜索进度,我想我想在另一个浏览器窗口/选项卡中打开文件
  • 我已经弄清楚如何将 PDF 保存到服务器的指定目录中。
  • 希望用户看到文件的路径。
  • 在合理的范围内,我想要一个适用于所有主流浏览器的解决方案:
  1. Internet Explorer
  2. 火狐
  3. Safari(包括 iPhone/iPad Mobile Safari)
  • 我不想购买第 3 方组件,但如有必要,我愿意走这条路。
  • 我不认为我想将文件作为下载发送(我想我已经知道该怎么做了),因为这不会在 iPhone/iPad 上失败吗?
  • 到目前为止,我尝试过的每个解决方案都存在一些基本问题:

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

    我想不通!我真的是一名桌面开发人员,这在 Windows 中是 EASY!为什么网络这么难?

    我是傻了,这真的是一个简单的练习,还是这个基本任务真的那么难?

    请帮我指出正确的方向!

    谢谢!!!

    【问题讨论】:

    标签: asp.net pdf web


    【解决方案1】:

    您是否尝试过使用 content-disposition-inline 添加 http 标头?此外,您可能希望将结果直接写入输出响应而不是保存它。这将确保文件的实际路径不会在您直接写入响应时显示。

    例如

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

    myfilestream 是一个内存流,或者如果你的 blob 中已经有一个字节数组,你可以直接将它写入响应而不需要 toarray

    【讨论】:

    • 这个答案接近公认的答案,所以我投了赞成票。谢谢!
    • 这似乎在 IE 上工作,但在 FF 上,它要求在默认查看器上打开它或保存它(意思是下载),但在 chrome 上它文学显示在同一个窗口上。
    【解决方案2】:

    这个链接可能对你有用,

    http://nilangshah.wordpress.com/2007/05/28/successfully-stream-a-pdf-to-browser-through-https/

    您可以通过为链接指定 target="_blank" 在新选项卡中打开 pdf。博客中提到的 ByteArray 是您从数据库中获取的 BLOB。希望这会有所帮助。

    【讨论】:

      【解决方案3】:

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

      有关此功能的大部分文档都是关于如何生成报告并将其导出为 PDF。 MSDN 真的不是很有帮助。我想每个人都在依赖 Adob​​e 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();
      }
      

      【讨论】:

      • 我无法让它工作。 Byte[] pdfContent = reportViewer... 行不断给我一个未处理的异常。所以我放弃了这种方法并采用了公认的解决方案。
      • 太糟糕了。我想文档如此之少是有原因的...我将把它留在这里,以提醒那些试图花费大量精力尝试使 ASP.Net 方法发挥作用的人们。
      【解决方案4】:

      这就是我在浏览器中从 ASP.NET (aspx) 页面打开 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();
      

      【讨论】:

        【解决方案5】:

        如果您正在寻找客户端 pdf 客户端,您可以查看PDF.js,它可以显示包含默认查看器的任何 PDF(如果在 MVC 中,您必须将 viewer.html 转换为视图但这很容易)。 它是开源且活跃的。我必须通过在 js 中注释一些行来对其进行一些调整,以便能够在 iphone 上显示 pdf 注释(数字签名)。

        【讨论】:

          猜你喜欢
          • 2012-02-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-09-08
          相关资源
          最近更新 更多