Hospedagem IE 8 em WinForms e abrindo um PDF
-
03-07-2019 - |
Pergunta
Nós temos uma forma que hospeda o controle WebBrowser. Esse é o único controle no formulário.
Nós passamos a forma do caminho de um arquivo PDF temporário arquivo e ele faz:
WebBrowser1.Navigate(Me._PathToPdf)
Quando o formulário é de fechamento, ele navega longe do ficheiro PDF:
WebBrowser1.Hide()
WebBrowser1.Navigate("about:blank")
Do Until WebBrowser1.ReadyState = WebBrowserReadyState.Complete
Application.DoEvents()
System.Threading.Thread.Sleep(50)
Loop
Uma vez que o formulário é fechado, a classe chamando, em seguida, exclui o arquivo PDF temporário.
Este processo funciona muito bem ... até que instalou o Internet Explorer 8. Por alguma razão, a combinação de IE8 e Adobe Acrobat 8 ??(ou 9) provoca uma alça bloqueio de arquivo extra para ser colocado no arquivo PDF temporário. A alça de bloqueio adicional não vai embora até que todo o aplicativo é desligado. Gostaria também de mencionar que não há bloqueios no arquivo até que o arquivo é aberto pelo Acrobat.
Nós podemos reproduzir este em várias máquinas e é sempre a combinação de IE8 e Adobe Acrobat Reader. Podemos instalar Foxit Reader 3 em vez de Adobe Acrobat e as coisas funcionam bem. Da mesma forma, podemos executar o aplicativo em uma máquina com o IE7 e Adobe Acrobat, e as coisas funcionam bem. Mas, quando você mistura a poção mágica do IE 8 e Acrobat, você acaba com uma bagunça.
Alguém pode me dizer por que estou recebendo um bloqueio de arquivo extra que persiste até o final da aplicação?
Graças.
Um exemplo de aplicação que demonstra o meu problema pode ser encontrada aqui: PDFLockProblemDemo.zip
Solução
Parece-me que os problemas reais está usando um controle WebBrowser
para sediar o Adobe Reader navegador plugin para PDFs de exibição. Não há uma maneira melhor para exibir PDFs diretamente sem a introdução de uma dependência em um navegador da web? Não Adobe fornecer um SDK ou um controle ActiveX você pode hospedar diretamente dentro de sua forma?
UPDATE: Eu olhei em volta e encontrou este post onde eles acessar um ActiveX Adobe controle (AxAcroPDFLib.AxAcroPDF
) e simplesmente chamar:
axAcroPDF1.LoadFile("mypdf.pdf");
axAcroPDF1.Show();
Outras dicas
Eu tenho uma resposta que não vai exigir quaisquer arquivos temporários.
Eu fui forçado a criar uma solução, depois que eu não estava com vontade de reescrever todo o meu código para usar arquivos temporários.
Então, aqui está o que você faz.
-
Criar uma lista de strings em arquivos segure para apagar
Dim filesToDelete As List(Of String) = New List(Of String)
-
Você precisa definir o webbrowser para outro arquivo pdf,
(eu criei um em branco - preto ou branco; o que funciona para você).
Assim comowebbrowser1.navigate("blank.pdf" )
-
Adicione o arquivo a ser excluído de uma lista de strings. assim
filesToDelete.Add(filename)
-
Agora, aqui está o truque. Os recursos não serão liberados até que você sair deste evento.
Então, você precisa fazer um foco em outra coisa que fará com que um outro evento para ser disparado.
No meu caso, eu estava usando um treeview para ver o pdf.
Então, depois de marcar o arquivo para exclusão usando o método acima,
i iria definir o treeview para um arquivo diferente.
Assim, no métodoTreeView1_BeforeSelect
, eu fiz o óbvio:
If filesToDelete.Count > 0 Then
For Each f As String In filesToDelete
File.Delete(f)
Next
filesToDelete.Clear()
End If
Você pode adotar o seu próprio evento, mas eu tenho certeza que depois de fazer a marcação para a exclusão, você pode encontrar algo para fazer que fará com que um outro evento de fogo. Basta seguir o fluxo do seu código, o que acontece a seguir.
Então, você tem isso. Espero que este alguém ajudou.
Ainda não há solução encontrada, mas mais informação: Anteriormente eu tinha testado com XP Pro, Acrobat * .x e .NET 2.0 (construído com VS 2005). Desde então, eu também tenho testado em uma variedade de cenários que incluem Vista, Acrobat 9.x e .NET 3.5 (construído com VS 2008).
Os mesmos resultados embora: enquanto o navegador é IE8, o arquivo PDF não são liberados quando você chamar Dispose () no controle WebBrowser. Ele não se liberada quando o aplicativo está fechado, mas isso não nos ...
ajudarEspero que isso ajude.
Nós tivemos o mesmo problema com o IE8 e Acrobat. No nosso caso, simplesmente precisava ser capaz de substituir o PDF temporário e exibi-la novamente. Descobrimos que poderíamos simplesmente abrir o PDF, escrever 0 bytes em seguida, feche. Depois que iríamos abrir o arquivo e escrever a nova informação PDF e, em seguida, voltar a exibir o arquivo temporário.
Em resumo, nós não resolver o problema bloqueio de arquivos, em vez disso, só deixou o identificador de arquivo anexado e reutilizados o arquivo até que o usuário fechou o aplicativo.
Espero que isso ajude.