Domanda

Abbiamo un modulo che ospita il controllo WebBrowser. Questo è l'unico controllo sul modulo.

Passiamo il modulo al percorso del file di un file PDF temporaneo e lo fa:

WebBrowser1.Navigate(Me._PathToPdf)

Quando il modulo si chiude, si allontana dal file PDF:

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

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

Una volta chiuso il modulo, la classe chiamante elimina il file PDF temporaneo.

Questo processo funziona benissimo ... fino all'installazione di Internet Explorer 8. Per qualche motivo, la combinazione di IE8 e Adobe Acrobat 8 ??(o 9) fa sì che un handle di blocco file aggiuntivo venga inserito nel file PDF temporaneo. La maniglia di blocco aggiuntiva non scompare fino a quando l'intera applicazione non viene chiusa. Dovrei anche menzionare che non ci sono blocchi sul file fino a quando il file non viene aperto da Acrobat.

Possiamo riprodurlo su più macchine ed è sempre la combinazione di IE8 e Adobe Acrobat Reader. Possiamo installare Foxit Reader 3 invece di Adobe Acrobat e le cose funzionano bene. Allo stesso modo, possiamo eseguire l'app su un computer con IE7 e Adobe Acrobat e le cose funzionano bene. Ma, quando mescoli la pozione magica di IE 8 e Acrobat, finisci con un casino.

Qualcuno può dirmi perché sto ottenendo un blocco di file aggiuntivo che persiste fino alla fine dell'applicazione?

Grazie.

Un'applicazione di esempio che dimostra il mio problema è disponibile qui: PDFLockProblemDemo.zip

È stato utile?

Soluzione

Mi sembra che i problemi reali stiano usando un controllo WebBrowser per ospitare il plug-in del browser Web Adobe Reader per visualizzare i PDF. Non esiste un modo migliore per visualizzare direttamente i PDF senza introdurre una dipendenza da un browser Web? Adobe non fornisce un SDK o un controllo ActiveX che puoi ospitare direttamente nel tuo modulo?


AGGIORNAMENTO: mi sono guardato intorno e ho trovato questo post dove accedono ad Adobe ActiveX control ( AxAcroPDFLib.AxAcroPDF ) e chiama semplicemente:

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

Altri suggerimenti

Ho una risposta che non richiede file temporanei.

Sono stato costretto a creare una soluzione, dopo che non avevo voglia di riscrivere tutto il mio codice per utilizzare i file temporanei.

Quindi, ecco cosa fai.

  1. Crea un elenco di stringhe per contenere i file da eliminare
    Dim filesToDelete As List (Of String) = New List (Of String)

  2. Devi impostare il browser web su un altro file pdf,
    (ne ho creato uno vuoto - bianco o nero; qualunque cosa funzioni per te).
    Così come webbrowser1.navigate (" blank.pdf ")

  3. Aggiungi il file da eliminare a un elenco di stringhe. quindi filesToDelete.Add(nomefile)

  4. Ora, ecco il trucco. Le risorse non verranno rilasciate fino a quando non uscirai da questo evento.
    Quindi devi concentrarti su qualcos'altro che provocherà il lancio di un altro evento.
    Nel mio caso, stavo usando un treeview per visualizzare il pdf.
    Quindi, dopo aver contrassegnato il file per l'eliminazione usando il metodo sopra,
    avrei impostato il treeview su un altro file.
    Quindi nel metodo TreeView1_BeforeSelect ho fatto l'ovvio:

    Se filesToDelete.Count > 0 Quindi
          & Nbsp; & Nbsp; Per ogni f Come stringa in filesToDelete
              & Nbsp; & Nbsp; & Nbsp; & Nbsp; File.Delete (f)
          & Nbsp; & Nbsp; Avanti
        & Nbsp; & Nbsp; filesToDelete.Clear ()
       End If


    Puoi adottare il tuo evento, ma sono sicuro che dopo aver eseguito la marcatura per l'eliminazione, puoi trovare qualcosa da fare che farà scattare un altro evento. Segui semplicemente il flusso del tuo codice, cosa succede dopo.



Quindi il gioco è fatto. Spero che questo abbia aiutato qualcuno.

Ancora nessuna soluzione trovata, ma maggiori informazioni: In precedenza avevo provato con XP Pro, Acrobat * .x e .NET 2.0 (costruito con VS 2005). Da allora, ho anche testato in una varietà di scenari che includono Vista, Acrobat 9.xe .NET 3.5 (costruito con VS 2008).

Stessi risultati però: fintanto che il browser è IE8, il file PDF non viene rilasciato quando si chiama Dispose () sul controllo WebBrowser. Viene rilasciato quando l'app viene chiusa, ma ciò non ci aiuta ...

Spero che questo aiuti.

Abbiamo avuto lo stesso problema con IE8 e Acrobat. Nel nostro caso, dovevamo semplicemente essere in grado di sovrascrivere il PDF temporaneo e visualizzarlo di nuovo. Abbiamo scoperto che potevamo semplicemente aprire il PDF, scrivere 0 byte e chiudere. Dopodiché apriremmo il file e scrivere le nuove informazioni PDF e quindi visualizzare nuovamente il file temporaneo.

In sintesi, non abbiamo risolto il problema di blocco dei file, ma abbiamo semplicemente lasciato l'handle del file allegato e riutilizzato il file fino a quando l'utente non ha chiuso l'app.

Spero che questo aiuti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top