在jsp中显示pdf

时间:2013-04-26 09:20:30

标签: 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 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>

3 个答案:

答案 0 :(得分:7)

JSP是提供文件下载工作的错误工具。 JSP被设计为一种视图技术,旨在使用taglib和EL轻松生成HTML输出。基本上,使用JSP方法,您的PDF文件会被<!DOCTYPE><html>等标记混乱,因此已损坏且无法识别为有效的PDF文件。这是using scriptlets is a bad practice的原因之一。它已经完全混淆了你应该如何工作。在这种特殊情况下,即使用普通的Java类进行文件下载作业。

您应该使用servlet代替。这是一个启动示例,假设Servlet 3.0和Java 7可用:

@WebServlet("/foo.pdf")
public class PdfServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        File file = new File("/absolute/path/to/foo.pdf");
        response.setHeader("Content-Type", getServletContext().getMimeType(file.getName()));
        response.setHeader("Content-Length", String.valueOf(file.length()));
        response.setHeader("Content-Disposition", "inline; filename=\"foo.pdf\"");
        Files.copy(file.toPath(), response.getOutputStream());
    }

}

(如果Servlet 3.0不可用,则将其映射到web.xml the usual way,如果Java 7不可用,则使用读/写循环the usual way)< / em>的

只需将此类完整地复制到您的项目中,然后按/contextpath/Saba_PhBill.pdf而不是/contextpath/youroriginal.jsp打开所需的PDF文件(在将其组织到一个包中并在类中自动完成必要的导入后,课程)。

E.g。如下所示,您希望以内联方式显示PDF:

<object data="${pageContext.request.contextPath}/Saba_PhBill.pdf" type="application/pdf" width="500" height="300">
    <a href="${pageContext.request.contextPath}/Saba_PhBill.pdf">Download file.pdf</a>
</object>

(当使用的浏览器不支持在HTML文档中内联<a>内容时,application/pdf链接意味着优雅降级,即当它没有Adobe Reader插件时安装)

另见:

答案 1 :(得分:1)

我可以看到多个问题:

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

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

答案 2 :(得分:1)

假设我们完全忽略了反对使用JSP的建议(正如BalusC所说的那样 - 有更好的方法),这里有一个丑陋可耻的小瑕疵,可以正常工作我。它甚至没有设置所有正确的标题,但是这里是:

<%@ 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标记之外没有新行(或其他空格)非常重要。

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