2009-04-30 10 views
6

Tenemos un formulario que aloja el control WebBrowser. Ese es el único control en el formulario.Alojamiento de IE 8 en WinForms y apertura de PDF

Pasamos la forma de la ruta de archivo de un archivo PDF temporal y que hace:

WebBrowser1.Navigate(Me._PathToPdf) 

Cuando el formulario se está cerrando, se desplaza fuera del archivo PDF:

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

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

Una vez que el el formulario está cerrado, la clase llamante luego borra el archivo PDF temporal.

Este proceso funciona de maravilla ... hasta que instalamos Internet Explorer 8. Por alguna razón, la combinación de IE8 y Adobe Acrobat 8 ​​(o 9) hace que un asa adicional de bloqueo de archivo se coloque en el archivo PDF temporal. El asa de bloqueo adicional no desaparece hasta que toda la aplicación se apaga. También debo mencionar que no hay bloqueos en el archivo hasta que Acrobat abra el archivo.

Podemos reproducir esto en varias máquinas y siempre es la combinación de IE8 y Adobe Acrobat Reader. Podemos instalar Foxit Reader 3 en lugar de Adobe Acrobat y todo funciona bien. Del mismo modo, podemos ejecutar la aplicación en una máquina con IE7 y Adobe Acrobat, y las cosas funcionan bien. Pero, cuando mezclas la poción mágica de IE 8 y Acrobat, terminas con un desastre.

¿Alguien puede decirme por qué me sale un bloqueo de archivo adicional que persiste hasta el final de la aplicación?

Gracias.

Un ejemplo de aplicación que demuestra mi problema se puede encontrar aquí: PDFLockProblemDemo.zip

+0

Muy bien, no pudimos encontrar ninguna buena solución a este problema, por lo que hemos recurrido al uso del control ActiveX Acrobat Reader en un formulario. Desafortunadamente, esto nos ha vinculado a una versión de Acrobat Reader, pero era necesario sacar la versión por la puerta. Estoy cerrando la pregunta. –

Respuesta

1

Me parece que el problema real es utilizar un control WebBrowser para alojar el complemento del navegador web Adobe Reader para visualizar archivos PDF. ¿No hay una mejor manera de mostrar archivos PDF directamente sin introducir una dependencia en un navegador web? ¿Adobe no proporciona un SDK o un control ActiveX que puede alojar directamente dentro de su formulario?


ACTUALIZACIÓN: Me miró a su alrededor y se encontró this post donde acceder a un control ActiveX de Adobe (AxAcroPDFLib.AxAcroPDF) y simplemente llamar:

axAcroPDF1.LoadFile("mypdf.pdf"); 
axAcroPDF1.Show(); 
+1

Sí, en realidad hemos recurrido al uso del objeto COM proporcionado por Adobe Acrobat. Sin embargo, esto es menos que ideal porque ahora están directamente vinculados a Adobe Acrobat y deben poner ese programa como un requisito previo para nuestra aplicación.Antes, simplemente solicitábamos una aplicación de visualización de PDF (Acrobat o Foxit la mayor parte del tiempo). –

1

Todavía no hay solución encontrada, pero más información: Anteriormente ya había probado con XP Pro, Acrobat * .x y .NET 2.0 (construido con VS 2005). Desde entonces, también he probado en una variedad de escenarios que incluyen Vista, Acrobat 9.x y .NET 3.5 (desarrollado con VS 2008).

Sin embargo, los mismos resultados: siempre que el navegador sea IE8, el archivo PDF no se libera cuando llama a Dispose() en el control WebBrowser. Se libera cuando la aplicación se cierra, pero eso no nos ayuda ...

Espero que esto ayude.

+0

Sí, eso describe con precisión con qué nos estamos topando. Gracias por la actualización. –

0

Tuvimos el mismo problema con IE8 y Acrobat. En nuestro caso, simplemente necesitábamos poder sobrescribir el PDF temporal y volver a mostrarlo. Descubrimos que simplemente podíamos abrir el PDF, escribir 0 bytes y luego cerrar. Después de eso, abrimos el archivo y escribimos la nueva información en PDF y luego volvemos a mostrar el archivo temporal.

En resumen, no resolvimos el problema de bloqueo de archivos, en su lugar dejamos el archivo adjunto y reutilizamos el archivo hasta que el usuario cerró la aplicación.

Espero que esto ayude.

1

tengo una respuesta que no requerirá ningún archivo temporal.

Me vi obligado a crear una solución, después de que no estaba de humor para volver a escribir todo mi código para usar archivos temporales.

Entonces, esto es lo que debes hacer.

  1. Crear una lista de cadenas para contener archivos que desea eliminar
    Dim filesToDelete As List(Of String) = New List(Of String)

  2. Es necesario configurar el navegador web a otro archivo PDF,
    (I crea un espacio en uno - negro o blanco; lo que funcione para tú).
    Así como webbrowser1.navigate("blank.pdf")

  3. Agregue el archivo que se va a eliminar a una lista de cadenas. tan filesToDelete.Add(filename)

  4. Ahora, aquí está el truco. Los recursos no se liberarán hasta que salga de este evento.
    Por lo tanto, debe centrarse en otra cosa que provoque el lanzamiento de otro evento.
    En mi caso, estaba usando una vista en árbol para ver el pdf.
    Por lo tanto, después de marcar el archivo para su eliminación utilizando el método anterior,
    establecería la vista de árbol en un archivo diferente.
    Así que en el método TreeView1_BeforeSelect, hice lo obvio:

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


    Puede adoptar su propio evento, pero estoy seguro de que después de marcar el borrado, puede encontrar algo que hacer que provocará que se desencadene otro evento. Solo sigue el flujo de tu código, que pasa después.



Así que ahí lo tienen. Espero que esto haya ayudado a alguien.

+0

En lugar de disparar un evento, simplemente puede llamar a '' 'Application.DoEvents()' '' y luego hacer las eliminaciones. –

Cuestiones relacionadas