如何在c#应用程序中显示大型pdf?

如何在c#应用程序中显示大型pdf?,c#,pdf,C#,Pdf,我有一个windows c#应用程序,我想在添加到表单中的acrobat com对象中显示一个位于Web服务器上的pdf文件 pdf.loadfile(@"http://somewhere.com/nowwhere.pdf") 由于我的pdf文件很大,应用程序似乎会一直挂起,直到加载整个文件 我想阅读大文件,而不让用户感觉应用程序已挂起。三条建议 第一种方法是像一些在线书籍那样,一次打开一个页面,然后加载一个页面。这有点烦人,但可以节省加载时间。我认为ItextSharp有一些功能可以做到这一

我有一个windows c#应用程序,我想在添加到表单中的acrobat com对象中显示一个位于Web服务器上的pdf文件

pdf.loadfile(@"http://somewhere.com/nowwhere.pdf")
由于我的pdf文件很大,应用程序似乎会一直挂起,直到加载整个文件

我想阅读大文件,而不让用户感觉应用程序已挂起。

三条建议

第一种方法是像一些在线书籍那样,一次打开一个页面,然后加载一个页面。这有点烦人,但可以节省加载时间。我认为ItextSharp有一些功能可以做到这一点

第二,尝试压缩。同样,itextsharp也有相应的工具

我的第三个建议是退房。选择一些无聊的加载短语,并使用动画gif来分散客户对长加载时间的注意力。显然,这是最后的办法,但可能有用。

三条建议

第一种方法是像一些在线书籍那样,一次打开一个页面,然后加载一个页面。这有点烦人,但可以节省加载时间。我认为ItextSharp有一些功能可以做到这一点

第二,尝试压缩。同样,itextsharp也有相应的工具

我的第三个建议是退房。选择一些无聊的加载短语,并使用动画gif来分散客户对长加载时间的注意力。显然,这是最后的手段,但可能很有用。

使用辅助线程。(例如后台工作人员)
使用辅助线程。(例如后台工作人员)

我会做以下事情:

  • 创建另一个线程以导入pdf
  • 向用户显示某种进度条。也许有一个取消按钮

  • 我会这样做:

  • 创建另一个线程以导入pdf
  • 向用户显示某种进度条。也许有一个取消按钮

  • 显然,如果您可以使用后台线程进行加载,那么您就可以:

    Pdf pdf;
    
    void ShowPdf() {
       if (this.InvokeRequired) {
         this.Invoke(() => this.ShowPdf());
       }
       // give pdf a window...
    }
    
    void LoadPdf() {
       System.Threading.ThreadPool.QueueUserWorkItem(() => {
          pdf.LoadFile("http://example.com/somelarge.pdf");
          this.ShowPdf();
       });
    }
    

    可能会出现的问题(我从未使用Acrobat的COM PDF viewer)是PDF对象希望位于UI线程上。在这种情况下,您最终会遇到问题。

    显然,如果您可以使用后台线程进行加载,您将可以:

    Pdf pdf;
    
    void ShowPdf() {
       if (this.InvokeRequired) {
         this.Invoke(() => this.ShowPdf());
       }
       // give pdf a window...
    }
    
    void LoadPdf() {
       System.Threading.ThreadPool.QueueUserWorkItem(() => {
          pdf.LoadFile("http://example.com/somelarge.pdf");
          this.ShowPdf();
       });
    }
    

    可能会出现的问题(我从未使用Acrobat的COM PDF viewer)是PDF对象希望位于UI线程上。在这种情况下,您将遇到问题。

    如果PDF.LoadFile必须从UI线程运行,您可以使用HttpWebRequest在BackgroundWorker中下载该文件,在本地保存,然后在调用(UI线程)函数中调用PDF.LoadFile()。

    如果PDF.LoadFile必须从UI线程运行,您可以使用HttpWebRequest在BackgroundWorker中下载该文件,将其保存在本地,然后在Invoke'd(UI线程)函数中调用pdf.loadfile()。

    COM对象可能需要在UI线程上运行,从而使#1不可能和#2阻塞。我从未遇到过COM对象需要UI线程的情况。在什么情况下会发生这种情况?COM对象可能需要在UI线程上运行,使得#1不可能,并且#2阻塞也不可能。我从来没有遇到过COM对象需要UI线程的情况。在什么情况下会发生这种情况?