Question

Nous avons un formulaire qui héberge le contrôle WebBrowser. C’est le seul contrôle du formulaire.

Nous passons au formulaire le chemin d'accès au fichier PDF temporaire et le fait:

WebBrowser1.Navigate(Me._PathToPdf)

Lorsque le formulaire se ferme, il s'éloigne du fichier PDF:

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

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

Une fois le formulaire fermé, la classe appelante supprime le fichier PDF temporaire.

Ce processus fonctionne très bien ... jusqu'à l'installation d'Internet Explorer 8. Pour une raison quelconque, la combinaison de IE8 et d'Adobe Acrobat 8 ??(ou 9) a pour effet de placer un descripteur de verrou de fichier supplémentaire sur le fichier PDF temporaire. La poignée de verrouillage supplémentaire ne disparaît que lorsque l'application entière est arrêtée. Je devrais également mentionner qu'il n'y a pas de verrous sur le fichier jusqu'à ce que le fichier soit ouvert par Acrobat.

Nous pouvons reproduire cela sur plusieurs machines et il s’agit toujours de la combinaison de IE8 et Adobe Acrobat Reader. Nous pouvons installer Foxit Reader 3 au lieu d’Adobe Acrobat et tout se passe bien. De même, nous pouvons exécuter l'application sur une machine avec IE7 et Adobe Acrobat, et tout fonctionne bien. Mais, lorsque vous mélangez la potion magique d'IE 8 et d'Acrobat, vous vous retrouvez avec un désordre.

Quelqu'un peut-il me dire pourquoi j'obtiens un verrou de fichier supplémentaire qui persiste jusqu'à la fin de l'application?

Merci.

Vous trouverez un exemple d'application illustrant mon problème à l'adresse suivante: PDFLockProblemDemo.zip .

Était-ce utile?

La solution

Il me semble que le vrai problème est d’utiliser un contrôle WebBrowser pour héberger le plug-in du navigateur Web Adobe Reader afin d’afficher des fichiers PDF. N'existe-t-il pas un meilleur moyen d'afficher directement des fichiers PDF sans introduire de dépendance vis-à-vis d'un navigateur Web? Adobe ne fournit-il pas un SDK ou un contrôle ActiveX que vous pouvez héberger directement dans votre formulaire?

UPDATE: j'ai regardé autour de moi et trouvé ce message où ils ont accès à Adobe ActiveX contrôle ( AxAcroPDFLib.AxAcroPDF ) et appelez simplement:

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

Autres conseils

J'ai une réponse qui ne nécessitera aucun fichier temporaire.

J'ai été obligé de créer une solution car je ne souhaitais pas réécrire tout mon code pour utiliser des fichiers temporaires.

Alors, voici ce que vous faites.

  1. Créer une liste de chaînes pour contenir les fichiers à supprimer
    Dim filesToDelete As List (Of String) = Nouvelle liste (Of String)

  2. Vous devez définir le navigateur Web sur un autre fichier pdf,
    (j'ai créé un fichier vierge - noir ou blanc; tout ce qui vous convient).
    Donc, comme webbrowser1.navigate ("blank.pdf")

  3. Ajoutez le fichier à supprimer à une liste de chaînes. so filesToDelete.Add (nom du fichier)

  4. Maintenant, voici le truc. Les ressources ne seront pas libérées tant que vous ne sortirez pas de cet événement.
    Vous devez donc vous concentrer sur autre chose qui provoquera le déclenchement d'un autre événement.
    Dans mon cas, j'utilisais un arbre pour visualiser le pdf.
    Donc, après avoir marqué le fichier pour suppression en utilisant la méthode ci-dessus,
    je définirais l'arborescence sur un fichier différent.
    Donc, dans la méthode TreeView1_BeforeSelect , j'ai fait l'évidence:

    Si filesToDelete.Count > 0 Alors
          & nbsp; & nbsp; For Each f As String dans filesToDelete
              & nbsp; & nbsp; & nbsp; & nbsp; Fichier.Delete (f)
          & nbsp; & nbsp; Suivant
        & nbsp; & nbsp; filesToDelete.Clear ()
       Fin si


    Vous pouvez adopter votre propre événement, mais je suis sûr qu'après le marquage pour la suppression, vous pouvez trouver quelque chose à faire qui provoquera le déclenchement d'un autre événement. Suivez simplement le flux de votre code, ce qui se passe ensuite.



Alors voilà. J'espère que cela a aidé quelqu'un.

Toujours pas de solution trouvée, mais plus d'infos: Auparavant, j'avais testé avec XP Pro, Acrobat * .x et .NET 2.0 (construit avec VS 2005). Depuis lors, j'ai également testé différents scénarios, dont Vista, Acrobat 9.x et .NET 3.5 (construit avec VS 2008).

Même résultat: tant que le navigateur est IE8, le fichier PDF n'est pas publié lorsque vous appelez Dispose () sur le contrôle WebBrowser. Elle est publiée lorsque l'application est fermée, mais cela ne nous aide pas ...

J'espère que cela vous aidera.

Nous avons eu le même problème avec IE8 et Acrobat. Dans notre cas, nous devions simplement pouvoir écraser le PDF temporaire et le réafficher. Nous avons constaté que nous pouvions simplement ouvrir le fichier PDF, écrire 0 octet puis fermer. Après cela, nous ouvrions le fichier, écrivions les nouvelles informations PDF, puis réaffichais le fichier temporaire.

En résumé, nous n'avons pas résolu le problème de verrouillage de fichier. Nous avons simplement laissé le descripteur de fichier attaché et réutilisé le fichier jusqu'à ce que l'utilisateur ferme l'application.

J'espère que cela vous aidera.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top