L'affichage des pdf en jsp
J'ai écrit une page jsp pour afficher le contenu de fichiers pdf, mais à la fin avec des codes ascii dans les jsp. Je veux afficher le contenu de fichiers pdf en jsp. Quelle est la partie que j'ai manqué. Quand j'essaye d'écrire la lecture de contenu en pdf il montre que les valeurs ascii et pas dans un format lisible par l'
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=${encoding}"></head>
<%@page import="java.io.File"%>
<%@page import="java.io.*"%>
<%@page import="javax.servlet.*"%>
<%@page import="com.itextpdf.text.Image"%>
<%@page import="com.itextpdf.text.Document"%>
<%@page import="com.itextpdf.text.DocumentException"%>
<%@page import="com.itextpdf.text.pdf.PdfReader"%>
<%@page import="com.itextpdf.text.pdf.PdfImportedPage"%>
<%@page import="com.itextpdf.text.pdf.PdfWriter"%>
<%@page import="com.itextpdf.text.pdf.PdfContentByte"%>
<%@ page language="java" contentType="application/pdf; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
response.reset();
response.setContentType("application/pdf");
File file = new File("D:\\TNWRD_Documents\\CHAPTER_II.pdf");
response.setHeader("Content-Type", "application/pdf");
response.setHeader("Content-Disposition",
"inline;filename=Saba_PhBill.pdf");
response.setContentLength((int) file.length());
response.setHeader("Content-Type",
getServletContext().getMimeType(file.getName()));
response.setHeader("Content-Length", String.valueOf(file.length()));
//OPen an input stream to the file and post the file contents thru the
//servlet output stream to the browser
FileInputStream in = new FileInputStream(file);
ServletOutputStream outs = response.getOutputStream();
response.setContentLength(in.available());
byte[] buf = new byte[8192];
int c = 0;
try {
while ((c = in.read(buf, 0, buf.length)) > 0) {
//System.out.println("size:"+c);
outs.write(buf, 0, c);
out.write(outs.toString());
}
} catch (IOException ioe) {
ioe.printStackTrace(System.out);
} finally {
outs.flush();
outs.close();
in.close();
}
%>
</html>
- Avant votre JSP directives, vous avez un en-tête HTTP. Lorsque votre code JSP exécute
response.reset(),
cet en-tête peut très bien avoir déjà été envoyé. En outre, vous envoyer une clôture</html>
tag après l'envoi du PDF, ce qui rend également le résultat d'une défaillance de PDF. - Mon commentaire est d'une nature plus générale: JSP technologie a été introduite pour éliminer la nécessité de polluants Java code avec HTML. Vous avez écrit une servlet dans JSP, et en quelque sorte réussi à le polluer avec du code HTML.
- Il est intéressant que vous tagged cette question avec
[servlets]
, même si vous ne sont nulle part à l'aide d'une servlet dans votre code à tout, mais il est le droit de réponse à votre problème concret! En fait, tu connaissais déjà la réponse à l'avance, vous venez de ne pas le voir.
Vous devez vous connecter pour publier un commentaire.
JSP est le bon outil pour le travail de la portion du téléchargement d'un fichier. JSP est conçu comme un point de vue de la technologie avec l'intention de produire facilement de la sortie HTML avec taglibs et EL. En fait, avec votre JSP approche, votre fichier PDF est encombré avec
<!DOCTYPE>
,<html>
les étiquettes, etc et donc corrompu et ne reconnaissent pas la validité du fichier PDF. C'est d'ailleurs l'une des raisons pour lesquelles à l'aide de les scriptlets est une mauvaise pratique. Il a, à savoir complètement confus de vous comment les choses est censé fonctionner. Dans ce cas particulier, c'est à l'aide d'un normal de la classe Java pour le téléchargement de fichier de travail.Vous devriez être en utilisant un servlet à la place. Voici un coup d'envoi exemple, en supposant que le Servlet 3.0 et Java 7 est disponible:
(si Servlet 3.0 n'est pas disponible, puis la carte dans
web.xml
la manière habituelle, si Java 7 n'est pas disponible, utilisez une boucle de lecture/écriture la manière habituelle)Juste copypaste cette classe dans son intégralité dans votre projet et ouvrez le fichier PDF souhaité par
/contextpath/Saba_PhBill.pdf
au lieu de/contextpath/youroriginal.jsp
(après avoir organisé dans un paquet et complété automatiquement le nécessaire importations dans la classe, bien sûr).E. g. comme suit dans une JSP où vous souhaitez afficher le fichier PDF en ligne:
(le
<a>
lien est destinée à la dégradation gracieuse lorsque le navigateur utilisé ne prend pas en charge l'in-liningapplication/pdf
contenu dans un document HTML, c'est à dire quand il n'est pas d'avoir Adobe Reader installé le plugin)Voir aussi:
J'ai pu voir plusieurs problèmes:
application/pdf
)Dans la boucle while, les données sont d'abord écrites pour la réponse flux de sortie, puis un
toString()
est écrit sur la sortie (qui est en fait un Écrivain de l'instance ouverte sur la réponse des flux de sortie, dansouts
). Utilisez uniquement le flux de réponse dans la boucle, commewhile ((c = in.read(buf, 0, buf.length)) > 0) {
outs.write(buf, 0, c);
}
En supposant que nous avons complètement ignorer les conseils contre l'utilisation d'un JSP (et comme BalusC dit - il existe de MEILLEURES FAÇONS), voici un laid et honteux peu bodge qui a bien fonctionné pour moi. Il n'a même pas les en-têtes, mais va ici:
Il est important de s'assurer il n'y a pas de nouvelles lignes (ou d'autres espaces) à l'extérieur de la scriptlet balises.
Ils m'ont fait faire, d'accord?!