Pregunta

Tenemos un formulario que aloja el control WebBrowser. Ese es el único control en el formulario.

Pasamos el formulario a la ruta del archivo de un archivo PDF temporal y lo hace:

WebBrowser1.Navigate(Me._PathToPdf)

Cuando se cierra el formulario, se aleja 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 se cierra el formulario, la clase que llama luego elimina el archivo PDF temporal.

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

Podemos reproducir esto en múltiples 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 las cosas funcionan 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 en un desastre.

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

Gracias.

Puede encontrar una aplicación de ejemplo que muestra mi problema aquí: PDFLockProblemDemo.zip

¿Fue útil?

Solución

Me parece que el problema real es usar un control WebBrowser para alojar el complemento del navegador web Adobe Reader para mostrar 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: miré a mi alrededor y encontré esta publicación donde acceden a un Adobe ActiveX control ( AxAcroPDFLib.AxAcroPDF ) y simplemente llame:

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

Otros consejos

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

Me vi obligado a crear una solución, después de no tener ganas de reescribir todo mi código para usar archivos temporales.

Entonces, esto es lo que haces.

  1. Cree una lista de cadenas para guardar archivos para eliminar
    Dim filesToDelete As List (Of String) = New List (Of String)

  2. Necesita configurar el navegador web en otro archivo pdf,
    (Creé uno en blanco - negro o blanco; lo que sea que funcione para usted).
    Entonces, como webbrowser1.navigate (" blank.pdf ")

  3. Agregue el archivo que se va a eliminar a una lista de cadenas. 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 hará que se active otro evento.
    En mi caso, estaba usando una vista de árbol para ver el pdf.
    Entonces, después de marcar el archivo para eliminarlo usando el método anterior,
    establecería la vista de árbol en un archivo diferente.
    Entonces, en el método TreeView1_BeforeSelect , hice lo obvio:

    If filesToDelete.Count > 0 Entonces
          & nbsp; & nbsp; Para cada f como cadena en filesToDelete
              & nbsp; & nbsp; & nbsp; & nbsp; File.Delete (f)
          & nbsp; & nbsp; Siguiente
        & nbsp; & nbsp; filesToDelete.Clear ()
       End If


    Puede adoptar su propio evento, pero estoy seguro de que después de marcar la eliminación, puede encontrar algo que haga que provoque otro evento. Simplemente siga el flujo de su código, lo que sucede a continuación.



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

Todavía no se encontró una solución, pero más información: Anteriormente había probado con XP Pro, Acrobat * .xy .NET 2.0 (construido con VS 2005). Desde entonces, también he probado en una variedad de escenarios que incluyen Vista, Acrobat 9.xy .NET 3.5 (construido 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 se cierra la aplicación, pero eso no nos ayuda ...

Espero que esto ayude.

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, abriríamos el archivo y escribiríamos la nueva información en PDF y luego volveríamos a mostrar el archivo temporal.

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

Espero que esto ayude.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top