java - 在jsp中显示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 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>

最佳答案

JSP 不适合提供文件下载服务。 JSP 被设计为一种 View 技术,旨在使用标签库和 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 )

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

例如在您想要内联显示 PDF 的 JSP 中如下所示:

<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> 内容时,即没有安装 Adob​​e Reader 插件时,application/pdf 链接意味着优雅降级)

另请参阅:

关于java - 在jsp中显示pdf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16232916/

相关文章:

java - 找不到合适的 native 库。 native.libpath.* 与 java.library.path

javascript - Canvas 未显示

java - 在 JTabbedPane 中,我有两个面板,在写入时不会显示相同的文本字段和标签

java - 在基于 JSF 的 Web 应用程序中显示图像

java - 正则表达式,如何在第一次失败时中止?

java - Eclipse:选择不包含任何可能在服务器上运行的资源

java - 如何在多线程环境下使用Servlet

javascript - 重新加载网页 - 浏览器 "back"按钮 (HTML/JSP)

java - 更改 servlet 映射会引发 "HTTP Status 405 - Request method ' GET' 不支持”

java - 将请求解释为 JSP 而不是通过 servlet