2010-09-17 8 views
3

EDIT 2PDF en iframe modal rend vide dans IE

Il semble que déplacer la balise d'objet dans le Dom est la cause du problème. J'ai ajouté un iframe directement à la page et cela fonctionne très bien sans aucun problème.

Cependant, lorsque je déplace cet iFrame dans une boîte de dialogue modale (http://www.ericmmartin.com/projects/simplemodal/), le PDF disparaît (le repère d'objet ne s'affiche plus correctement). Il semble donc que ce n'est plus une question à propos de mon gestionnaire, mais plutôt une question de savoir pourquoi le déplacement de la balise "object" (ou embed) dans le DOM (qui vit dans un iFrame) l'amène à "masquer" "

De même, lorsque le pdf est déplacé du dialogue modal vers sa position d'origine, il apparaît correctement. Donc, peut-être que je devrais me concentrer davantage sur le dialogue modal lui-même.

Pensées? Merci pour vos suggestions jusqu'à présent.


EDIT 1

J'ai fait quelques modifications pour les tests.

J'ai le iframe pour sortir une étiquette d'objet pour des demandes de pdf avec l'heure de serveur.

Response.AddHeader("content-type", "text/html"); 
WebClient client = new WebClient(); 
Response.Write("<html><head></head><body><h1>"+ DateTime.Now.ToString() + "</h1><object height='100%' width='100%' name='plugin' data='" + Request.Url.ToString() + "&embed=true' type='application/pdf' /></body></html>"); 
Response.Flush(); 
Response.Close(); 
Response.End(); 

Maintenant je une page avec l'heure actuelle correctement, mais l'objet affiche seulement le PDF la première fois après que je publierai la page ASPX. Donc, il semble être une sorte de problème de mise en cache? Sauf que l'objet ne charge rien (pas même le PDF précédemment chargé).

Si vous cliquez avec le bouton droit sur l'iframe et actualisez la page, l'objet se charge correctement. (La même chose est vraie si j'utilise une balise embed).


Original Question

Je sais qu'il ya beaucoup de questions sur ce ...

Mais ils n'ont pas été répondus, ou la réponse n'a pas fonctionné.

Environnement

  • .Net 4
  • Adobe 9.3.4
  • IIS 5.1
  • XP sp3
  • VS 2010
  • IE 8.0.6001.18702

Contexte

Années pdf Je suis le streaming Venues d'une référentiel de stockage où les fichiers ne comportent pas d'extensions (ce qui est fait pour la sécurité). Je regarde le fichier dans la base de données et le diffuser au client via le code suivant:

Response.Clear(); 
WebClient client = new WebClient(); 
Byte[] buffer = client.DownloadData(sPath); 
Response.AddHeader("content-length", buffer.Length.ToString()); 
Response.AddHeader("content-disposition", "inline;filename=" + fileName); 
Response.AddHeader("expires", "0"); 
Response.AddHeader("Content-Type", "application/pdf"); //this is usually dynamic to support other types (doc, xls, txt, etc.) 
Response.OutputStream.Write(buffer, 0, buffer.Length); 
Response.Flush(); 
Response.Close(); 
Response.End(); 

Cela fonctionne pour tous les types de fichiers (doc, txt, xls, html) lorsqu'il est directement utilisé dans le navigateur ou l'iframe (affiché comme une fenêtre contextuelle modale) avec l'exception de fichiers pdf. Ils ne fonctionnent pas de manière fiable lorsqu'ils sont accessibles via l'iframe, mais fonctionnent correctement lorsqu'ils sont accédés directement dans le navigateur.

La première fois que cela fonctionne, c'est la première fois que je demande un document après avoir publié la page ASPX qui sert ces fichiers. Toutes les occurrences suivantes renvoient une page vierge (même à partir de nouveaux onglets ou fenêtres de navigateur). Firefox affiche de manière fiable le pdf à chaque fois indépendamment.

Tentatives Solutions

J'ai essayé différentes façons I de diffusion du fichier:

Response.TransmitFile(sPath); 
Response.WriteFile(sPath); 
//As well as some others 

J'ai essayé d'ajouter .pdf à un paramètre à la fin de la demande

http://www.myurl.aspx?File=test.pdf 

J'ai essayé de rendre l'URL unique en ajoutant un horodatage

http://www.myurl.aspx?File=test.pdf&Unique=Friday__September_17__2010_12_02_16_PM 

Un-Tentative

J'ai lu des problèmes provoquant une compression IIS, mais il était une version plus récente d'IIS.

N'a pas essayé d'utiliser la balise embed puisque je voudrais m'en tenir au iFrame si possible (l'infrastructure existante l'utilise).

Toute aide serait grandement appréciée !!!

Merci.

Répondre

1

J'ai donc abandonné et j'ai décidé d'utiliser une fenêtre contextuelle IE standard à la place.

window.open(URL, 'Window', 'height=' + pageHeight + ',width=' + pageWidth + ',top=0,left=0,resizable'); 

je dû rendre les pdfs dans une balise d'objet et tout le reste à l'intérieur d'un iframe dans le pop-up pour que cela fonctionne, mais il fonctionne ...

if (sDocType == "pdf") 
{ 
    Response.AddHeader("content-type", "text/html"); 
    WebClient client = new WebClient(); 
    Response.Write("<html style='margin:0px;padding:0px;'><head></head><body style='margin:0px;padding:0px;'><object height='100%' width='100%' name='plugin' data='" + Request.Url.ToString() + "&embed=true' type='" + zGetContentType(HttpContext.Current.Request.QueryString["docType"]) + "'><param name='src' value='" + Request.Url.ToString() + "&embed=true' />alt : <a href='" + Request.Url.ToString() + "&embed=true'>View</a></object></body></html>"); 
    Response.Flush(); 
    Response.Close(); 
    Response.End(); 
} 
else 
{ 
    Response.AddHeader("content-type", "text/html"); 
    WebClient client = new WebClient(); 
    Response.Write("<html style='margin:0px;padding:0px;'><head></head><body style='margin:0px;padding:0px;'><iframe frameborder='0' scrolling='no' height='100%' width='100%' src='" + Request.Url.ToString() + "&embed=true' /></body></html>"); 
    Response.Flush(); 
    Response.Close(); 
    Response.End(); 
} 
1

J'ai eu un problème similaire qui a surgi lorsque les fichiers PDF sont en streaming via le protocole SSL (IE uniquement, FF ne présentait pas la question) qui n'a été résolu en procédant comme suit:

Response.ClearHeaders(); 
Response.ClearContent(); 
Response.Buffer = true; 

Response.AppendHeader("Content-Disposition", "inline; attachment; filename=Filename.pdf"); 
Response.ContentType = "application/pdf"; 

Response.WriteFile(path); 

Response.Flush(); 
Response.End(); 
+0

Merci, mais maintenant je reçois le même comportement à l'exception que le fichier est téléchargé et ouvert dans l'application native. Cela ne fonctionne toujours que la première fois après la publication de mon site. –

0

Je ne suis pas Assurez-vous que vous avez besoin de définir le nom de fichier, surtout s'il n'a pas l'extension .pdf. Lors de la diffusion des fichiers PDF au navigateur dans le passé, je l'ai toujours utilisé ce code:

Response.Clear(); 
Response.ContentType = "application/pdf"; 
Response.BinaryWrite(pdfBuffer); 
Response.Flush(); 

Sinon, il y a une possibilité que quelque chose a aspergés sur les paramètres de Registre pour le CLSID application/pdf sur l'ordinateur client.

+0

Merci @AJ, j'ai essayé mais je reçois le même résultat. Je pense que le problème est plus de problèmes de mise en cache (voir mon édition ci-dessus). –

0

j'ai pu résoudre un problème similaire (pdf à l'intérieur de la fenêtre modale Internet Explorer) en supprimant l'iframe. Au lieu de cela, chargez le pdf dans un élément d'objet html. voir le lien ci-dessous:

http://intranation.com/test-cases/object-vs-iframe/

Pour résumer: La configuration qui ne fonctionne pas:

jQuery floatbox, charge fragment html avec iframe, charge page ASPX en iframe, charge pdf en page ASPX

La configuration qui fonctionne maintenant:

jQuery floatbox, charge fragment html, append élément d'objet. avant d'ajouter l'élément objet, définir les données attribut de l'élément object à l'URL de la page aspx

Questions connexes