web-dev-qa-db-fra.com

PDF les fichiers ne s’ouvrent pas dans Internet Explorer avec Adobe Reader 10.0 - les utilisateurs obtiennent un écran gris vide. Comment puis-je résoudre ce problème pour mes utilisateurs?

Il existe un problème connu lié à l’ouverture d’un PDF dans Internet Explorer (versions 6, 7, 8, 9) avec Adobe Reader X (version 10.0. *). La fenêtre du navigateur se charge avec un écran gris vide (et n'a même pas de barre d'outils Reader). Il fonctionne parfaitement avec Firefox, Chrome ou Adobe Reader 10.1. *.

J'ai découvert plusieurs solutions de contournement. Par exemple, appuyer sur "Actualiser" chargera le document correctement. La mise à niveau vers Adobe Reader 10.1. * Ou la mise à niveau vers la version 9. * corrige également le problème.
Cependant, toutes ces solutions requièrent l'utilisateur doit le comprendre . La plupart de mes utilisateurs sont très confus de voir cet écran gris et finissent par blâmer le fichier PDF et blâment le site Web. Honnêtement, jusqu’à ce que j’ai étudié la question, j’ai aussi blâmé le PDF!

J'essaie donc de trouver un moyen de résoudre ce problème pour mes utilisateurs.
J'ai envisagé de créer un lien "Télécharger le PDF" (qui définit l'en-tête Content-Disposition sur attachment au lieu de inline), mais ma société n'aime pas du tout cette solution, car nous souhaitons réellement que ces PDF fichiers à afficher dans le navigateur.

Est-ce que quelqu'un d'autre a rencontré ce problème?

Quelles sont certaines des solutions possibles ou des solutions de contournement?

J'espère vraiment une solution transparente pour l'utilisateur final} _, car je ne peux pas compter sur eux pour savoir comment modifier les paramètres d'Adobe Reader ou pour installer automatiquement les mises à jour.

Voici l'écran gris redouté:
Edit: la capture d'écran a été supprimée du serveur de fichiers! Pardon!
L’image était une fenêtre de navigateur, avec la barre d’outils standard, mais un arrière-plan gris uni, sans aucune interface utilisateur.

Informations de fond:
Bien que je ne pense pas que les informations suivantes soient liées à mon problème, je les inclurai pour référence:
Ceci est une application ASP.NET MVC, et jQuery est disponible.
Le lien vers le fichier PDF a target=_blank et s'ouvre dans une nouvelle fenêtre.
Le fichier PDF est généré à la volée et tous les en-têtes de contenu sont définis correctement. L'URL n'inclut PAS l'extension .pdf, mais nous définissons l'en-tête content-disposition avec un nom de fichier .pdf valide et le paramètre inline.

Edit: Voici le code source que j'utilise pour servir les fichiers PDF.

Tout d'abord, l'action du contrôleur:

public ActionResult ComplianceCertificate(int id){
    byte[] pdfBytes = ComplianceBusiness.GetCertificate(id);
    return new PdfResult(pdfBytes, false, "Compliance Certificate {0}.pdf", id);
}

Et voici le ActionResult (PdfResult, hérite de System.Web.Mvc.FileContentResult):

using System.Net.Mime;
using System.Web.Mvc;
/// <summary>
/// Returns the proper Response Headers and "Content-Disposition" for a PDF file,
/// and allows you to specify the filename and whether it will be downloaded by the browser.
/// </summary>
public class PdfResult : FileContentResult
{
    public ContentDisposition ContentDisposition { get; private set; }

    /// <summary>
    /// Returns a PDF FileResult.
    /// </summary>
    /// <param name="pdfFileContents">The data for the PDF file</param>
    /// <param name="download">Determines if the file should be shown in the browser or downloaded as a file</param>
    /// <param name="filename">The filename that will be shown if the file is downloaded or saved.</param>
    /// <param name="filenameArgs">A list of arguments to be formatted into the filename.</param>
    /// <returns></returns>
    [JetBrains.Annotations.StringFormatMethod("filename")]
    public PdfResult(byte[] pdfFileContents, bool download, string filename, params object[] filenameArgs) 
        : base(pdfFileContents, "application/pdf")
    {
        // Format the filename:
        if (filenameArgs != null && filenameArgs.Length > 0)
        {
            filename = string.Format(filename, filenameArgs);
        }

        // Add the filename to the Content-Disposition
        ContentDisposition = new ContentDisposition
                                 {
                                     Inline = !download,
                                     FileName = filename,
                                     Size = pdfFileContents.Length,
                                 };
    }

    protected override void WriteFile(System.Web.HttpResponseBase response)
    {
        // Add the filename to the Content-Disposition
        response.AddHeader("Content-Disposition", ContentDisposition.ToString());
        base.WriteFile(response);
    }
}
30
Scott Rippey

Quatre mois se sont écoulés depuis que j'ai posé cette question et je n'ai toujours pas trouvé de bonne solution.
Cependant, j’ai trouvé une solution de contournement décente que je partagerai au cas où d’autres auraient le même problème.
Je vais essayer de mettre à jour cette réponse aussi, si je fais des progrès supplémentaires.

Tout d'abord, mes recherches ont montré qu'il existe plusieurs combinaisons possibles de paramètres utilisateur et de paramètres de site qui entraînent divers problèmes d'affichage PDF. Ceux-ci inclus:

  • Version endommagée d'Adobe Reader (10.0. *)
  • Site HTTPS avec Internet Explorer et le paramètre par défaut "Ne pas enregistrer les fichiers cryptés sur le disque"
  • Paramètre Adobe Reader - Désactiver "Afficher les fichiers PDF dans mon navigateur"
  • Matériel lent (merci @ahochhaus)

J'ai passé un peu de temps à rechercher les options d'affichage PDF sur pdfobject.com , qui est une EXCELLENTE ressource et j'ai beaucoup appris. 

La solution que j'ai proposée consiste à incorporer le fichier PDF dans une page HTML vide. C'est très simple: Voir des exemples similaires sur pdfobject.com .

<html>
    <head>...</head>
    <body>
        <object data="/pdf/sample.pdf" type="application/pdf" height="100%" width="100%"></object>
    </body>
</html>

Cependant, voici une liste de mises en garde:

  • Cela ignore toutes les préférences des utilisateurs pour les fichiers PDF - par exemple, j'aime bien que les fichiers PDF s'ouvrent dans un Adobe Reader autonome, mais cela est ignoré.
  • Cela ne fonctionne pas si le plugin Adobe Reader n'est pas installé/activé, alors j'ai ajouté une section "Get Adobe Reader" au code HTML, ainsi qu'un lien pour télécharger le fichier, qui est généralement complètement masqué par la balise <object />. , ... mais ...
  • Dans Internet Explorer, si le plug-in ne parvient pas à charger, l'objet vide masquera toujours la section "Get Adobe Reader". J'ai donc dû définir le z-index pour l'afficher ... mais ...
  • Le visualiseur PDF intégré à Google Chrome affiche également la section "Obtenir Adobe Reader" en plus de le fichier PDF. J'ai donc dû détecter le navigateur afin de déterminer s'il fallait afficher "Obtenir le lecteur".

C'est une liste énorme de mises en garde. Je crois que cela couvre toutes les bases, mais je ne suis certainement pas à l'aise d'appliquer ceci à CHAQUE utilisateur (dont la plupart n'ont pas de problème).
Par conséquent, nous avons décidé de faire UNIQUEMENT cette option embedded si l'utilisateur choisit cette option. Sur notre page PDF, nous avons une section intitulée "Vous ne parvenez pas à afficher les fichiers PDF?", Qui vous permet de définir votre paramètre sur "Embarqué", et nous enregistrons ce paramètre dans un cookie.
Dans notre action GetPDF, nous recherchons le cookie embed=true. Cela détermine si nous renverrons le fichier PDF ou si nous renverrons une vue HTML avec le PDF incorporé.

Pouah. C'était encore moins amusant que d'écrire du JavaScript compatible IE6.
J'espère que les autres avec le même problème pourront trouver du réconfort en sachant qu'ils ne sont pas seuls!

30
Scott Rippey

Je n'ai pas de solution exacte, mais je publierai mes expériences avec cela au cas où ils aideraient quelqu'un d'autre.

D'après mes tests, l'écran gris n'est déclenché que sur des machines plus lentes [1]. À ce jour, je n'ai pas été en mesure de le recréer sur du matériel plus récent [2]. Tous mes tests ont été réalisés dans IE8 avec Adobe Reader 10.1.2. Pour mes tests, j'ai désactivé SSL et supprimé tous les en-têtes qui auraient pu désactiver la mise en cache.

Pour recréer l'écran gris, j'ai suivi les étapes suivantes:

1) Accédez à une page qui renvoie à un fichier PDF.
2) Ouvrez le PDF dans une nouvelle fenêtre ou un nouvel onglet (via le menu contextuel ou target = "_ blank")
3) Dans mes tests, ce PDF s'ouvrira sans erreur (toutefois, j'ai reçu des rapports d'utilisateurs indiquant un échec lors de la première PDF charge).
4) Fermez la fenêtre ou l'onglet qui vient d'être ouvert
5) Ouvrez le PDF (à nouveau) dans une nouvelle fenêtre ou un nouvel onglet
6) Ce PDF ne s'ouvre pas, mais affiche uniquement "l'écran gris" mentionné par le premier utilisateur (tous les PDF suivants chargés ne s'afficheront pas - jusqu'à ce que toutes les fenêtres du navigateur soient fermées) 

J'ai effectué le test ci-dessus avec plusieurs fichiers PDF différents (statiques et dynamiques) générés à partir de sources différentes. Le problème de l'écran gris se pose toujours lorsque vous suivez les étapes ci-dessus (sur l'ordinateur "lent").

Pour atténuer le problème dans mon application, j'ai "déchiré" la page qui renvoie au PDF (pièces supprimées pièce par pièce jusqu'à ce que l'écran gris ne soit plus visible). Dans mon application particulière (construite sur fermeture de bibliothèque), la suppression de toutes les références à goog.userAgent.adobeReader [3] semble avoir résolu le problème. Cette solution exacte ne fonctionnera pas avec jquery ou .net MVC, mais le processus peut peut-être vous aider à isoler la source du problème. Je n'ai pas encore pris le temps d'isoler quelle partie de goog.userAgent.adobeReader déclenche le bogue dans Adobe Reader, mais il est probable que jQuery possède un code de détection de plug-in similaire à celui utilisé dans la bibliothèque de fermeture.

[1] Machine rencontrant un écran gris:
Win Server '03 SP3
AMD Sempron 2400+ à 1,6 GHz
256 Mo de mémoire

[2] La machine ne rencontre pas d'écran gris:
Win XP x64 SP2
AMD Athlon II X4 620 à 2,6 GHz
4 Go de mémoire

[3] http://closure-library.googlecode.com/svn/docs/closure_goog_useragent_adobereader.js.source.html

3
ahochhaus

J'ai eu ce problème. Réinstaller la dernière version d'Adobe Reader n'a rien donné. Adobe Reader a fonctionné dans Chrome mais pas dans IE. Cela a fonctionné pour moi ... 

1) Allez dans le menu Outils -> Affichage de compatibilité de IE.
2) Entrez un site Web contenant le PDF que vous souhaitez voir. Cliquez sur OK.
3) Redémarrez IE 4) Accédez au site Web que vous avez saisi et sélectionnez le fichier PDF. Ça devrait arriver.
5) Revenez à l’Affichage de compatibilité et supprimez votre saisie.
6) Adobe Reader fonctionne correctement dans IE sur tous les sites Web. 

C'est une solution étrange, mais cela a fonctionné pour moi. Après la réinstallation, je devais passer par un écran d'acceptation Adobe qui n'était apparu qu'après avoir fait le tour de l'écran Compatibility View. Une fois accepté, il semblait fonctionner partout. Jolies choses feuilletées. J'espère que ça aide quelqu'un. 

1
Lisa

Pour Win7 Acrobat Pro X

Puisque j'ai fait tout cela sans vérifier si le problème existait encore par la suite, je ne sais pas lequel de ceux-ci a réellement résolu le problème, mais l'un d'entre eux l'a fait. En fait, après avoir fait le n ° 3 et redémarré, cela a parfaitement fonctionné. 

FYI: Vous trouverez ci-dessous l'ordre dans lequel j'ai effectué la réparation. 

  1. Allez à Control Panel> options de dossiers sous chacun des onglets General, View et Search____.cliquez sur le bouton Restore Defaults et sur le bouton Reset Folders

  2. Allez à Internet Explorer, Tools> Options> Advanced> Reset (je n'ai pas eu besoin de supprimer les paramètres personnels)

  3. Ouvrez Acrobat Pro X, sous Edit> Preferences> General.
    Au bas de la page, sélectionnez Default PDF Handler. J'ai choisi Adobe Pro X et cliquez sur Apply

Vous pouvez être invité à redémarrer (je l'ai fait). 

Meilleurs vœux

1
FCWatson

Dans mon cas, la solution était assez simple… .. J'ai ajouté cet en-tête et les navigateurs ont ouvert le fichier à chaque test .

1
David Alexandru

Je me suis heurté à ce problème au moment de la première publication de MVC1. Voir Génération de PDF, erreur avec IE et HTTPS concernant l'en-tête Cache-Control. 

1
Todd Smith

Je me rends compte qu’il s’agit d’un message plutôt tardif mais qui reste une solution possible pour le PO. J'utilise IE9 sur Win 7 et je rencontre des problèmes d'écran gris avec Adobe Reader depuis plusieurs mois lorsque j'essaie d'ouvrir des relevés de compte en banque et des cartes de crédit en ligne. Je pourrais tout ouvrir dans Firefox ou Opera mais pas dans IE. J'ai finalement essayé PDF-Viewer, réglez-le comme visualiseur pdf par défaut dans ses préférences et ne posez plus de problèmes. Je suis sûr qu'il existe d'autres lecteurs gratuits, tels que Foxit, PDF-Xchange, etc., qui donneront de meilleurs résultats que Reader avec moins de maux de tête. Adobe est comme certaines des autres grandes entreprises qui développent des logiciels à la volée ou au départ ... alors je les ai laissés.

0
puterfx

En expérimentant davantage, la cause sous-jacente de mon application (appelant goog.userAgent.adobeReader) était d'accéder à Adobe Reader via un ActiveXObject sur la page avec le lien vers le PDF. Ce cas de test minimal provoque l'écran gris pour moi (toutefois, le fait de supprimer ActiveXObject ne provoque aucun écran gris).

<!DOCTYPE html>
<html lang="en">
  <head>
    <title>hi</title>
    <meta charset="utf-8">
  </head>
  <body>
    <script>
      new ActiveXObject('AcroPDF.PDF.1');
    </script>
    <a target="_blank" href="http://partners.Adobe.com/public/developer/en/xml/AdobeXMLFormsSamples.pdf">link</a>
  </body>
</html>

Je suis très intéressé si d'autres personnes sont capables de reproduire le problème avec ce cas de test et en suivant les étapes de mon autre message ("Je n'ai pas de solution exacte ...") sur un ordinateur "lent".

Désolé de poster une nouvelle réponse, mais je ne savais pas comment ajouter un bloc de code dans un commentaire de mon précédent message.

Pour un exemple vidéo de ce cas de test minimal, voir: http://youtu.be/IgEcxzM6Kck

0
ahochhaus

Nous avions ce problème même après la mise à jour vers la dernière version d'Adobe Reader.

Deux méthodes différentes ont résolu ce problème pour nous:

  • Utilisation de la version gratuite de l'application Foxit Reader à la place d'Adobe Reader
  • Mais, comme la plupart de nos clients utilisent Adobe Reader, au lieu d’obliger les utilisateurs à utiliser Foxit Reader, nous avons commencé à utiliser window.open(url) pour ouvrir le fichier PDF au lieu de window.location.href = url. Adobe perdait le descripteur de fichier pour une raison quelconque dans différents iframes lors de l'ouverture du fichier PDF à l'aide de la méthode window.location.href.
0
thecoolmacdude

Hm, serait-il possible de faire simplement ceci:

La première fois que votre utilisateur ouvre un fichier PDF, vous créez avec le Javascript une fenêtre contextuelle indiquant "Si vous ne pouvez pas voir votre document, veuillez cliquer ICI". Faites de "ICI" un gros bouton qui expliquera à votre utilisateur quel est le problème. Faites aussi un autre bouton "tout va bien". Si l'utilisateur clique sur celui-ci, vous vous en souvenez, il ne sera donc plus affiché.

J'essaie d'être pratique. Essayer de résoudre ce type de problème "correctement" pour un petit sous-ensemble de versions d'Adobe Reader ne me semble pas très productif.

0
darioo