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

Foi útil?

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.

  1. Criar uma lista de strings em arquivos segure para apagar
    Dim filesToDelete As List(Of String) = New List(Of String)

  2. Você precisa definir o webbrowser para outro arquivo pdf,
    (eu criei um em branco - preto ou branco; o que funciona para você).
    Assim como webbrowser1.navigate("blank.pdf" )

  3. Adicione o arquivo a ser excluído de uma lista de strings. assim filesToDelete.Add(filename)

  4. 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étodo TreeView1_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 ...

ajudar

Espero 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top