2013-01-07 5 views
3

Je veux afficher un fichier PDF dans le navigateur. J'ai le chemin vers le pdf dans JS et je fais un appel pour récupérer le PDF en tant que servlet de java. Voici ce que j'ai jusqu'à présent:Afficher le PDF dans un navigateur avec un servlet

JavaScript:

RequestManager.getJSON(Config.server + "getPDF.json?pdfPath=" + this.pathToPdfFile, (function(data){ 
     $("#" + this.divId).append('<object id="' + this.pdfObjectId + '" data="' + data + '" type="application/pdf" width="600" height="800"></object>'); 
     ResizeManager.addResizeHandler(this.pdfObjectId, this.divId, -10, -10); 
    }).bind(this)); 

Java:

@RequestMapping("/getPDF") 
public void pdfPathToServlet(Model model, HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{ 
    String pdfPath = request.getParameter("pdfPath"); 
    if (pdfPath == null || pdfPath.equals("")) 
     throw new ServletException("Invalid or non-existent file parameter in UrlServlet servlet."); 

    if (pdfPath.indexOf(".pdf") == -1) 
     pdfPath += ".pdf"; 

    File pdf = new File(pdfPath); 
    String pdfName = pdfPath.substring(pdfPath.lastIndexOf("/") + 1, pdfPath.length()); 
    logger.debug(pdfName); 
    ServletOutputStream stream = null; 
    BufferedInputStream buf = null; 
    try 
    { 
     stream = response.getOutputStream(); 
     response.setContentType("application/pdf"); 
     response.setHeader("Content-Disposition", "inline; filename='" + pdfName + "'"); 
     FileInputStream input = new FileInputStream(pdf); 
     response.setContentLength((int) pdf.length()); 
     buf = new BufferedInputStream(input); 
     int readBytes = 0; 
     while ((readBytes = buf.read()) != -1) 
      stream.write(readBytes); 
    } 
    catch (IOException ioe) 
    { 
     throw new ServletException(ioe.getMessage()); 
    } 
    finally 
    { 
     if (stream != null) 
      stream.close(); 
     if (buf != null) 
      buf.close(); 
    } 
} 

Mon problème est que c'est montrant la sortie binaire dans mon navigateur sous forme de texte.

Je ne suis pas sûr de ce que je fais incorrectement. J'ai essayé de changer l'en-tête en pièce jointe au lieu de en ligne, mais cela a montré la même chose. Je crois que je veux en ligne cependant, comme je souhaite le montrer dans le navigateur et ne pas le télécharger.

+0

Pourquoi votre URL se termine par '.json' lorsque vous renvoyez' application/pdf'? –

+0

@ Michael-O Honnêtement, je l'avais mis par habitude. La façon dont l'application est écrite est une URL que l'application entière exécute sous. Cela ne change jamais réellement. Le fichier .json est normalement utilisé pour empêcher la redirection de la page vers une autre URL qui ne contient rien. – user856354

+1

Ce n'est pas une servlet du tout. C'est une action du contrôleur Spring MVC. – BalusC

Répondre

5

Votre partie JavaScript n'a pas de sens. Vous obtenez un fichier PDF en tant que réponse ajax, puis en essayant de le définir comme attribut data de l'élément <object>. L'attribut data doit pointer vers une URL réelle, pas vers le contenu du fichier. Fixez votre JS en conséquence:

$("#" + this.divId).append('<object id="' + this.pdfObjectId + '" data="' + Config.server + "getPDF.json?pdfPath=" + this.pathToPdfFile + '" type="application/pdf" width="600" height="800"></object>'); 

Le webbrowser prendra soin d'envoyer la requête HTTP appropriée sur l'URL donnée et l'initialisation/rendu de l'élément <object> à l'aide du plug-in Adobe Acrobat Reader — si tout disponible, je préfère Ci-joint un <a href="pdfURL">PDF</a> à l'intérieur du <object> afin qu'il y ait au moins une dégradation gracieuse à un lien de téléchargement.


à la Unrelated question concrète, que le code Java ne fait pas partie d'un servlet du tout, mais une action Spring MVC. Je recommande d'obtenir vos termes et lire au our Servlets wiki page pour apprendre ce qu'ils sont vraiment.

+0

Merci beaucoup. – user856354

+0

De rien. – BalusC

+1

Aussi, je m'excuse pour la mauvaise terminologie. Normalement, je ne travaille pas du tout de ce côté. Les changements récents dans l'emploi m'ont mis sur la sellette et je travaille dans un délai très serré.Essayer de ramasser les choses en courant à pleine vitesse vers un mur. – user856354

-1
response.setHeader("Content-Disposition", "inline; filename='" + pdfName + "'"); 

Vous ne pouvez pas afficher de PDF en ligne. Il doit être seul sur sa propre page (ou Iframe).

+3

Ce n'est pas vrai. Si vous ne pouvez pas indiquer l'URL initiale dans le navigateur avec une valeur d'en-tête en ligne, le plugin PDF s'ouvrira dans le navigateur, sinon il ouvrira une nouvelle fenêtre de visualisation PDF. –

+0

D'un appel AJAX? Je ne suis pas si sûr. –

+0

Même «attachement» n'aurait pas fonctionné du tout. JS a pour des raisons évidentes de sécurité aucune facilité pour forcer un dialogue * Enregistrer sous * avec du contenu arbitraire contenu dans une variable. La réponse entière ne s'applique tout simplement pas. Notez que 'inline' fonctionne définitivement sur une requête synchrone, à condition que le navigateur ait le plugin approprié (Adobe Reader). – BalusC

0
response.setHeader("Content-Disposition", "attachment;filename=" + pdfName); 
Questions connexes