【问题标题】:webbrowsercontrol issue, clear cache not working?浏览器控制问题,清除缓存不起作用?
【发布时间】:2024-04-27 17:50:01
【问题描述】:

我正在使用 webbrowsercontrol 来显示本地存储的 .pdf。在按下按钮时,我希望网络浏览器显示一个空页面/什么都没有,并且我想将 .pdf 移动到另一个文件夹。首先,我在移动之前尝试导航到“”,但我的 .pdf 被另一个进程使用。谷歌告诉我,我可能需要清除浏览器的缓存才能移动它。我使用此处找到的代码:http://www.gutgames.com/post/Clearing-the-Cache-of-a-WebBrowser-Control.aspx,我什至尝试了评论 nr 2 中的替代代码行,但这些都没有让我移动我的 .pdf,它仍然被另一个进程使用。

我可以/应该做什么才能移动文件?我是不是忘记了什么?

在第二个 File.Move 是我得到错误的地方:

webBrowser1.Navigate("");
WebBrowserHelper.ClearCache();
if (calConv != "")
{
    File.Move(forsDir + calConv + ".cal", forsDir + calConv.Replace("ToDo\\", "") + ".cg4");
    File.Move(forsDir + calConv + ".pdf", forsDir + calConv.Replace("ToDo\\", "") + ".pdf");
}

【问题讨论】:

  • 如果您只显示 PDF,您可以使用 Adob​​e 的预览控件而不是 webbrowser 控件。
  • 你能指出我正确的方向吗?我在哪里可以找到这方面的阅读和代码示例?或者我应该谷歌什么?
  • @Vedran 知道了,感谢您的提示!
  • @Vedran 我似乎无法“卸载”pdf,你知道怎么做吗?移动它后,我希望控件不显示任何内容...

标签: c# pdf webbrowser-control clear-cache


【解决方案1】:

这是在不使用 web 控件的情况下显示 PDF 的方法,而是使用 Adob​​e Reader:

http://www.adobe.com/devnet/acrobat/downloads.html下载 Acrobat SDK

在您的项目中添加对来自 SDK 的两个 dll 的引用 - AxInterop.AcroPDFLib.dll 和 Interop.AcroPDFLib.dll

在表单的构造函数中添加 Adob​​e 预览器控件:

// Check if the user has Adobe Reader installed, if not you could show a link to Adobe Reader installer
if (Type.GetTypeFromProgID("AcroPDF.PDF") == null)
{
    pnlGetAdobe.Visible = pnlGetAdobe.Enabled = true;
}
else
{
    try
    {
        // Initialize the Adobe control
        axAcroPDF1 = new AxAcroPDF();
        axAcroPDF1.Dock = DockStyle.Fill;
        axAcroPDF1.Enabled = true;
        axAcroPDF1.Location = new Point(0, 25);
        axAcroPDF1.Name = "axAcroPDF1";
        axAcroPDF1.OcxState = (AxHost.State)new ComponentResourceManager(typeof(JasperPdfReport)).GetObject("axAcroPDF1.OcxState");
        axAcroPDF1.Size = new Size(634, 393);
        axAcroPDF1.TabIndex = 1;
        pnlCenter.Controls.Add(axAcroPDF1); // Add it to a container or instead directly to your form with this.Controls.Add(axAcroPDF1)
        axAcroPDF1.BringToFront();
    }
    catch (COMException cex)
    {
        axAcroPDF1.Dispose();
        axAcroPDF1 = null;
        MessageBox.Show(cex.ToString());
    }
    catch (Exception ex)
    {
        axAcroPDF1.Dispose();
        axAcroPDF1 = null;
        MessageBox.Show(ex.ToString());
    }
}

最后将您的 PDF 文件加载到控件中:

if (axAcroPDF1 != null && File.Exists(pdfFilename))
{
    axAcroPDF1.setShowToolbar(false);
    axAcroPDF1.setView("FitH");
    axAcroPDF1.setLayoutMode("SinglePage");
    // Load the PDF into the control
    axAcroPDF1.LoadFile(pdfFilename);
    axAcroPDF1.src = pdfFilename;

    // Show it
    axAcroPDF1.Show();
    axAcroPDF1.Refresh();
}

【讨论】:

  • 我刚刚引用了 Adob​​e 的一些东西类型库,将其添加到工具栏,将其添加到我的表单并使用:axAcroPDF1.LoadFile(file);用于将我的文件加载到查看器中。我似乎无法“卸载”文件。该怎么做?
  • 您总是可以执行 axAcroPDF1.Dispose() 然后在您想要加载新 PDF 时重新初始化它。
  • 我不喜欢它的外观。让控制消失并像那样出现。我通过简单地重新加载 pdf 文件 File.Move 之前的路径来解决它。这会生成一个空的 pdf 查看器窗口。
  • 当心未安装 Adob​​e 控件时会发生什么,您的应用程序可能会崩溃 - 这就是我引用 SDK dll-s 并手动加载控件的原因。如果这不是你的问题 - 你已经完成了:)