Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将PDF文件从JavaBean返回到JSP_Java_Jsp_Pdf_Xsl Fo_Apache Fop - Fatal编程技术网

将PDF文件从JavaBean返回到JSP

将PDF文件从JavaBean返回到JSP,java,jsp,pdf,xsl-fo,apache-fop,Java,Jsp,Pdf,Xsl Fo,Apache Fop,编辑:请参见下面的答案 简而言之:我有一个JSP文件,它调用Javabean中的一个方法。该方法创建一个PDF文件,并在理论上将其返回给JSP,以便用户可以下载该文件。但是,加载PDF时,Adobe Reader会给出错误:文件不是以“%PDF-”开头的 详细说明:到目前为止,JSP成功地调用了该方法,创建了PDF,然后JSP显示为用户提供了完成的PDF文件。但是,当Adobe Reader尝试打开PDF文件时,它会给出一个错误:文件不是以“%PDF-”开头的。只是为了更好的衡量,我有办法在我的

编辑:请参见下面的答案

简而言之:我有一个JSP文件,它调用Javabean中的一个方法。该方法创建一个PDF文件,并在理论上将其返回给JSP,以便用户可以下载该文件。但是,加载PDF时,Adobe Reader会给出错误:文件不是以“%PDF-”开头的

详细说明:到目前为止,JSP成功地调用了该方法,创建了PDF,然后JSP显示为用户提供了完成的PDF文件。但是,当Adobe Reader尝试打开PDF文件时,它会给出一个错误:文件不是以“%PDF-”开头的。只是为了更好的衡量,我有办法在我的桌面上创建PDF,以便我可以检查它;当我在窗口内正常打开它时,它看起来很好。那么,为什么JSP的输出不同呢

要创建PDF,我正在使用。下面是他们最基本的例子之一,除了将生成的PDF传递给JSP,而不是简单地将其保存到本地机器。我一直在关注他们的想法

这是我的JSP文件:

<%@ taglib uri="utilTLD" prefix="util" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/xml" prefix="x" %>
<%@ page language="java" session="false" %>
<%@ page contentType="application/pdf" %>

<%-- Construct and initialise the PrintReportsBean --%>
<jsp:useBean id="printReportsBean" scope="request" class="some.package.printreports.PrintReportsBean" />
<jsp:setProperty name="printReportsBean" property="*"/>

<c:set scope="page" var="xml" value="${printReportsBean.download}"/>

我意识到这是一个非常具体的问题,但任何帮助都将不胜感激

只是猜测,但是您是否检查了JSP页面返回的MIME类型

编辑:如果我真的读了你发布的代码,我会看到你设置了它,所以别担心:


edit2:JSP代码中JSP标记之间的换行符不会在输出流中结束吗?这会使服务器返回的响应失效吗?我对PDF格式一无所知,但它是否取决于文件中某些位置的某些标记字符?返回的错误消息听起来像是这样。

只是猜测,但是您是否检查了JSP页面返回的MIME类型

编辑:如果我真的读了你发布的代码,我会看到你设置了它,所以别担心:


edit2:JSP代码中JSP标记之间的换行符不会在输出流中结束吗?这会使服务器返回的响应失效吗?我对PDF格式一无所知,但它是否取决于文件中某些位置的某些标记字符?返回的错误消息听起来像是这样。

我过去实现这类功能的方法是让servlet将PDF文件的内容作为流写入响应。我不再随身携带源代码,我做任何servlet/jsp工作至少已经一年了,但以下是您可能想要尝试的:


在servlet中,获取响应输出流的句柄。将响应的mime类型更改为application/pdf,并让servlet执行示例中的文件处理。只有servlet将文件写入输出流,而不是返回File对象。请参阅文件i/o示例,只需替换任何输出文件。写入。。。带responseStream的行。写入。。。你应该准备好离开。一旦刷新并关闭输出流并执行返回操作,如果我没记错的话,浏览器应该能够从响应中提取pdf。

我过去实现这类功能的方法是让servlet将pdf文件的内容作为流写入响应。我不再随身携带源代码,我做任何servlet/jsp工作至少已经一年了,但以下是您可能想要尝试的:

在servlet中,获取响应输出流的句柄。将响应的mime类型更改为application/pdf,并让servlet执行示例中的文件处理。只有servlet将文件写入输出流,而不是返回File对象。请参阅文件i/o示例,只需替换任何输出文件。写入。。。带responseStream的行。写入。。。你应该准备好离开。一旦刷新并关闭输出流并返回,如果我没记错的话,浏览器应该能够从响应中提取pdf。

我同意,可能是JSP标记之间的空格。试着把指令

<%@ page trimDirectiveWhitespaces="true" %>
我同意,也许是JSP标记之间的空格。试着把指令

<%@ page trimDirectiveWhitespaces="true" %>

好的,我让它工作了。我是这样做的:

JSP:


感谢大家的投入

好的,我把它弄好了。我是这样做的:

JSP:


感谢大家的投入

trimDirectiveWhitespaces听起来非常有用,尽管一些谷歌搜索显示它只是从JSP 2.1开始的,所以它非常新。trimDirectiveWhitespaces听起来非常有用,尽管一些谷歌搜索显示它只是从JSP 2.1开始的,所以它非常新。
<%@ taglib uri="utilTLD" prefix="util" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/xml" prefix="x" %>
<%@ page language="java" session="false" %>
<%@ page contentType="application/pdf" %>

<%-- Construct and initialise the PrintReportsBean --%>
<jsp:useBean id="printReportsBean" scope="request" class="some.package.PrintReportsBean" />
<jsp:setProperty name="printReportsBean" property="*"/>

<%
    // get report format as input parameter     
    ServletOutputStream servletOutputStream = response.getOutputStream();

    // reset buffer to remove any initial spaces
    response.resetBuffer(); 

    response.setHeader("Content-disposition", "attachment; filename=HelloWorld.pdf");

    // check that user is authorised to download product
    printReportsBean.getDownload(servletOutputStream);
%>
//earlier in the class...
private static FopFactory fopFactory = FopFactory.newInstance();

public void getDownload(ServletOutputStream servletOutputStream) throws UtilException {

    OutputStream outputStream = null;

    File fo  = new File("C:\\some\\path", "HelloWorld.fo");

    try {

        FOUserAgent foUserAgent = fopFactory.newFOUserAgent();

        outputStream = new BufferedOutputStream(servletOutputStream);

        Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, outputStream);

        TransformerFactory factory = TransformerFactory.newInstance();
        Transformer transformer = factory.newTransformer(); //identity transformer

        Source src = new StreamSource(fo);

        Result res = new SAXResult(fop.getDefaultHandler());

        transformer.transform(src, res);

    } catch (Exception e) {

        throw new UtilException("Could not get download. Msg = "+e.getMessage());

    } finally {

        try {
            outputStream.close();
        } catch (IOException io) {
            throw new UtilException("Could not close OutputStream. Msg = "+io.getMessage());
        }
     }
 }