当前位置: 首页 > 知识库问答 >
问题:

在jsp中显示pdf

曾山
2023-03-14

我已经写了一个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个答案

边明煦
2023-03-14

我可以看到多个问题:

>

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

    while((c=in.read(buf,0,buf.length))

  • 鄂坚
    2023-03-14

    假设我们完全忽视了反对使用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();
    %>
    

    重要的是要确保criptlet标签之外没有新行(或其他空白)。

    他们逼我做的,好吗?!

    钦景胜
    2023-03-14

    JSP对于提供文件下载的工作来说是错误的工具。JSP被设计为一种视图技术,旨在通过taglibs和EL轻松生成超文本标记语言输出。基本上,使用JSP方法,您的PDF文件会被弄得乱七八糟。

    您应该使用servlet来代替它。这里有一个启动示例,假设Servlet 3.0和Java7可用:

    java prettyprint-override">@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中映射它,如果Java7不可用,则以通常的方式使用读/写循环)

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

    例如,在JSP中,您希望以内联方式显示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>
    

    (<代码>

    • 在Javaweb应用程序中,从应用程序服务器外部提供静态数据的最简单方法
    • 支持ETags、缓存等的静态资源servlet的抽象模板

     类似资料:
    • 首先,我对Liferay非常陌生,即使在阅读了这些文档之后,我可能也不知道自己在做什么。 我正在尝试在Liferay portlet中设置一个自定义jsp页面。我的jsp结构如下: 这些都放在我的portlet视图中。然而,我在我的portlet中看不到任何显示。我的所有源代码和映射都是正确的,但似乎我只能在portlet中显示常规文本。 我正在使用Liferay插件SDK和Eclipse的最新版

    • 我创建了一个动态web项目,以便通过Servlet显示JSP(我不能使用任何类似Spring的框架…)。默认情况下,我构建的类放在Build/classes中,因此在我将输出文件夹更改为WebContent/WEB-INF/classes后,我的应用程序运行良好。之后,我将该项目转换为Maven项目。(我不记得我上次使用servlet/JSP时需要更改输出文件夹,那是3年前!)。 无论如何,现在我

    • 我已经尝试通过 和 这个问题是因为我放置图像的位置层次结构吗?

    • 我从另一个页面复制了以下JSP代码,但是当我从浏览器查看时,日期不显示。 我已将其保存为。

    • 在标记的src中传递的图像路径有一些问题。 在我的数据库中,我有用户图像的Linux绝对路径。我得到这个值并放入“src”属性中。 我有一个路径,例如: null 我需要知道的是我要做什么? 我必须改变Jetty的配置吗?我必须用Java运行一些代码吗? 通过谷歌搜索,我变得更加困惑。我想要个解释。 谢谢你,巴卢斯!豪豪乌豪阿

    • bean名称'user'的BindingResult和普通目标对象都不能作为请求属性使用 Apr 05 2019 9:18:13 AM org.apache.catalina.core.StandardWrapperValve调用严重:在路径[/DataVisualization]的上下文中servlet[SpringController]的servlet.service()引发异常[处理JSP