Хостинг IE 8 в WinForms и открытие PDF - PullRequest
6 голосов
/ 01 мая 2009

У нас есть форма, которая содержит элемент управления WebBrowser. Это единственный элемент управления в форме.

Мы передаем форму пути к файлу временного файла PDF, и он делает:

WebBrowser1.Navigate(Me._PathToPdf)

Когда форма закрывается, она отклоняется от файла PDF:

WebBrowser1.Hide()
WebBrowser1.Navigate("about:blank")

Do Until WebBrowser1.ReadyState = WebBrowserReadyState.Complete
    Application.DoEvents()
    System.Threading.Thread.Sleep(50)
Loop

После закрытия формы вызывающий класс удаляет временный файл PDF.

Этот процесс прекрасно работал ... пока мы не установили Internet Explorer 8. По какой-то причине комбинация IE8 и Adobe Acrobat 8 ​​(или 9) приводит к тому, что дополнительный временный дескриптор блокировки файла помещается во временный файл PDF. Дополнительная ручка блокировки не исчезнет, ​​пока не закроется все приложение. Я должен также упомянуть, что нет никаких блокировок файла, пока файл не будет открыт Acrobat.

Мы можем воспроизвести это на нескольких машинах, и это всегда сочетание IE8 и Adobe Acrobat Reader. Мы можем установить Foxit Reader 3 вместо Adobe Acrobat, и все будет хорошо. Аналогично, мы можем запустить приложение на компьютере с IE7 и Adobe Acrobat, и все работает отлично. Но когда вы смешиваете волшебное зелье IE 8 и Acrobat, вы получаете беспорядок.

Может кто-нибудь сказать мне, почему я получаю дополнительную блокировку файла, которая сохраняется до конца приложения?

Спасибо.

Пример приложения, демонстрирующего мою проблему, можно найти здесь: PDFLockProblemDemo.zip

Ответы [ 4 ]

1 голос
/ 25 ноября 2011

У меня есть ответ, который не потребует никаких временных файлов.

Я был вынужден создать решение после того, как не собирался переписывать весь свой код для использования временных файлов.

Итак, вот что вы делаете.

  1. Создать список строк для хранения файлов для удаления
    Dim filesToDelete As List(Of String) = New List(Of String)

  2. Вам нужно настроить веб-браузер на другой файл PDF,
    (я создал пустой - черный или белый; все, что вам подходит).
    Так как webbrowser1.navigate("blank.pdf" )

  3. Добавить файл для удаления в список строк. итак filesToDelete.Add(filename)

  4. Теперь вот трюк. Ресурсы не будут выпущены, пока вы не выйдете из этого события.
    Так что вам нужно сосредоточиться на чем-то другом, что вызовет другое событие.
    В моем случае я использовал древовидное представление для просмотра pdf.
    Итак, после пометки файла для удаления с помощью описанного выше метода,
    я бы установил древовидное представление для другого файла.
    Итак, в методе TreeView1_BeforeSelect я сделал очевидное:

    If filesToDelete.Count > 0 Then
    For Each f As String In filesToDelete
    File.Delete(f)
    Next
    filesToDelete.Clear()
    End If


    Вы можете принять собственное событие, но я уверен, что после отметки для удаления вы сможете найти что-то, что может вызвать другое событие. Просто следите за потоком кода, что будет дальше.



Итак, вот оно. Надеюсь, это кому-то помогло.

1 голос
/ 26 мая 2009

Мне кажется, что настоящей проблемой является использование элемента управления WebBrowser для размещения плагина веб-браузера Adobe Reader для отображения PDF-файлов. Нет ли лучшего способа отображать PDF-файлы напрямую, не вводя зависимости от веб-браузера? Разве Adobe не предоставляет SDK или элемент управления ActiveX, который вы можете разместить непосредственно внутри формы?


ОБНОВЛЕНИЕ: я оглянулся и нашел это сообщение , где они получают доступ к элементу управления Adobe ActiveX (AxAcroPDFLib.AxAcroPDF) и просто звонят:

axAcroPDF1.LoadFile("mypdf.pdf");
axAcroPDF1.Show();
1 голос
/ 12 мая 2009

Решение пока не найдено, но больше информации: Ранее я тестировал XP Pro, Acrobat * .x и .NET 2.0 (созданный с VS 2005). С тех пор я также тестировал в различных сценариях, включая Vista, Acrobat 9.x и .NET 3.5 (построено с VS 2008).

Аналогичные результаты: пока браузер IE8, файл PDF не будет выпущен при вызове Dispose () в элементе управления WebBrowser. Оно выходит, когда приложение закрывается, но это не помогает нам ...

Надеюсь, это поможет.

0 голосов
/ 21 мая 2009

У нас была такая же проблема с IE8 и Acrobat. В нашем случае нам просто нужно было перезаписать временный PDF-файл и снова отобразить его. Мы обнаружили, что можем просто открыть PDF-файл, записать 0 байт, а затем закрыть. После этого мы открываем файл и записываем новую информацию в формате PDF, а затем снова отображаем временный файл.

Таким образом, мы не решили проблему блокировки файлов, вместо этого мы просто оставили дескриптор файла прикрепленным и использовали файл повторно, пока пользователь не закрыл приложение.

Надеюсь, это поможет.

...