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

时间:2008-10-08 20:24:10

标签: c# pdf

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

pdf.loadfile(@"http://somewhere.com/nowwhere.pdf")

由于我的pdf很大,应用程序似乎一直挂起,直到加载整个文件。

我想读取大文件,而用户不会认为应用程序已挂起。

6 个答案:

答案 0 :(得分:3)

我会做以下事情:

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

答案 1 :(得分:1)

抱歉,没有任何代码,但有关异步文件I / O的这篇文章可能对您有所帮助:

http://www.devsource.com/c/a/Using-VS/Making-Asynchronous-File-IO-Work-in-NET-A-Survival-Guide/

答案 2 :(得分:1)

三个建议。

第一个是打破它并像一些在线书籍那样加载页面。这有点烦人,但可以节省你的加载时间。我认为ItextSharp有一些功能可以做到这一点。

第二次尝试压缩。再次,itextsharp具有允许此

的工具

我的第三个建议是查看This thread。选择一些书呆子加载短语并使用动画gif分散您的客户从长时间加载的注意力。显然这是最后的手段,但可能有用。

答案 3 :(得分:1)

使用工作线程。 (例如BackgroundWorker)
MSDN Link to BackgroundWorker

答案 4 :(得分:1)

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

答案 5 :(得分:0)

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

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查看器)是PDF对象期望在UI线程上。在这种情况下,你最终会遇到问题。