Java 在jsp中显示pdf

Java 在jsp中显示pdf,java,jsp,servlets,pdf,Java,Jsp,Servlets,Pdf,我已经编写了一个jsp页面来显示pdf的内容,但最终在jsp中使用ascii代码。我想在jsp中显示pdf的内容。我错过的部分是什么。当我尝试以pdf格式写入读取内容时,它只显示ascii值,而不是可读格式 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta ht

我已经编写了一个jsp页面来显示pdf的内容,但最终在jsp中使用ascii代码。我想在jsp中显示pdf的内容。我错过的部分是什么。当我尝试以pdf格式写入读取内容时,它只显示ascii值,而不是可读格式

<!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>

0) {
//系统输出打印项次(“尺寸:+c”);
输出。写入(buf,0,c);
out.write(out.toString());
}
}捕获(ioe异常ioe){
ioe.printStackTrace(系统输出);
}最后{
out.flush();
out.close();
in.close();
}
%>

我可以看到多个问题:

  • JSP的顶部和底部都有额外的html标记。您不希望它们出现在那里-您只希望在响应输出中包含pdf内容
  • 代码集内容类型为多次。这可能不是根本原因,但是请确保只执行一次(将其设置为
    application/pdf
  • 在while循环中,首先将数据写入响应输出流,然后将
    toString()
    写入输出(实际上是在响应输出流上打开的Writer实例,即
    outs
    中的一个)。仅在循环中使用响应流,如下所示

    while((c=in.read(buf,0,buf.length))>0){
    写出(buf,0,c);
    }


    • JSP对于提供文件下载服务来说是错误的工具。JSP被设计为一种视图技术,目的是使用taglibs和EL轻松生成HTML输出。基本上,使用JSP方法时,PDF文件中充斥着
      等标记,因此已损坏,无法识别为有效的PDF文件。顺便说一下,这是原因之一。它已经完全把你弄糊涂了,不知道这些东西应该如何工作。在这种特殊情况下,即使用普通Java类进行文件下载作业

      你应该改用一个。下面是一个启动示例,假设Servlet 3.0和Java 7可用:

      @WebServlet(“/foo.pdf”)
      公共类PdfServlet扩展了HttpServlet{
      受保护的void doGet(HttpServletRequest请求,HttpServletResponse响应)抛出ServletException,IOException{
      File File=新文件(“/absolute/path/to/foo.pdf”);
      setHeader(“内容类型”,getServletContext().getMimeType(file.getName());
      setHeader(“Content-Length”,String.valueOf(file.Length());
      setHeader(“内容处置”,“内联;文件名=\“foo.pdf\”);
      copy(file.toPath(),response.getOutputStream());
      }
      }
      
      (如果Servlet 3.0不可用,则将其映射到
      web.xml
      ,如果Java 7不可用,则使用读/写循环)

      只需将该类全部复制粘贴到项目中,并通过
      /contextpath/Saba_PhBill.PDF
      而不是
      /contextpath/youroriginal.jsp
      打开所需的PDF文件(当然,在将其组织到包中并在类中自动完成必要的导入之后)

      例如,在JSP中,您希望以内联方式显示PDF,如下所示:

      
      
      (该
      
      

    假设我们完全忽略了反对使用JSP的建议(正如巴卢斯克所说,有更好的方法),这里有一个丑陋的可耻的小家伙,对我来说效果不错。它甚至没有设置所有正确的标题,但下面是:

    <%@ page import="java.io.File" %><%@ page import="org.apache.commons.io.FileUtils" %><%
    File pdfFile = (File) request.getAttribute("pdf");
    byte[] pdfByteArray = FileUtils.readFileToByteArray(pdfFile);
    response.setContentType("application/pdf");
    response.getOutputStream().write(pdfByteArray);
    response.getOutputStream().flush();
    %>
    
    
    
    确保scriptlet标记外没有新行(或其他空格)非常重要


    他们让我这么做,好吗?!

    在您的JSP指令之前,您有一个完整的HTTP头。当您的JSP代码执行
    response.reset()时,
    此标题很可能已经发送。此外,在发送PDF后发送一个结束标记,这也会使结果成为无效的PDF。我的评论更一般:引入JSP技术是为了消除HTML污染Java代码的必要性。您使用JSP编写了一个servlet,并设法用HTML污染它。有趣的是,你用
    [servlet]标记了这个问题
    ,即使你根本没有在代码中使用servlet,但它是你具体问题的正确答案!基本上,你事先就知道答案,只是没有看到而已。遗憾的是,有时你不得不用丑陋的方式来做事情:)你也可以删除fileUtils创建,除非你使用的是“FileUtils.readFileToByteArray”。无论如何,谢谢你的强力scriplet:)太好了,谢谢@lbrutti-我删除了多余的代码。很高兴它有帮助!你能看看我的问题吗?我希望你能回答这个问题。一个善意的帮助!请看这个问题。