Frage

EDIT: Es mein Arbeits Code in den Antworten unten.


In Kürze: Ich habe eine JSP-Datei, die ein Verfahren in einer Java Bean aufruft. Diese Methode erstellt eine PDF-Datei und in der Theorie, gibt es an den JSP, so dass der Benutzer sie herunterladen kann. Doch bei der PDF-Laden, Adobe Reader gibt den Fehler:. Datei nicht mit beginnen '% PDF -'

Im Detail: Bisher ruft die JSP erfolgreich das Verfahren wird das PDF erstellt und dann erscheint die JSP dem Benutzer die fertige PDF-Datei zu geben. Doch sobald Adobe Reader versucht, die PDF-Datei zu öffnen, gibt es eine Fehlermeldung: Datei nicht mit beginnen ‚% PDF -‘ . Nur für eine gute Maßnahme, habe ich die Methode, um die PDF-Datei auf meinem Desktop einrichten, so dass ich es überprüfen kann; wenn ich es normalerweise öffnen in Windows erscheint in Ordnung. Warum ist die Ausgabe von der JSP anders?

das PDF erstellen, ich bin mit Apache FOP . Ich folge einer ihrer grundlegendsten Beispiele, mit Ausnahme der resultierenden PDF zu einer JSP geben, anstatt sie einfach auf den lokalen Computer zu speichern. Ich verfolge ihre Grundnutzungsmuster und In diesem Beispiel Code .

Hier ist meine JSP-Datei:

<%@ 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}"/>

Hier ist meine Java Bean-Methode:

//earlier in the class...
private static FopFactory fopFactory = FopFactory.newInstance();

public File getDownload() throws UtilException {

    OutputStream out = null;
    File pdf = new File("C:\\documents and settings\\me\\Desktop\\HelloWorld.pdf");
    File fo  = new File("C:\\somedirectory", "HelloWorld.fo");

    try {

        FOUserAgent foUserAgent = fopFactory.newFOUserAgent();

        out = new FileOutputStream(pdf);
        out = new BufferedOutputStream(out);

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

        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);

        return pdf;

    } catch (Exception e) {

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

    } finally {

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

Ich weiß, dass dies ein sehr spezifisches Problem ist, aber jede Hilfe wäre sehr geschätzt!

War es hilfreich?

Lösung

So wie ich diese Art von Funktion in der Vergangenheit durchgeführt haben, ist ein Servlet den Inhalt der PDF-Datei, um die Antwort als einen Stream zu schreiben zu machen. Ich habe nicht den Quellcode mit mir nicht mehr (und es ist zumindest ein Jahr her, dass ich jede Servlet / jsp Arbeit getan haben), aber hier ist das, was Sie vielleicht versuchen:

In einem Servlet, erhalten einen Griff auf den Ausgabestrom Antwort. Ändern Sie den MIME-Typ der Antwort auf „application / pdf“ und haben das Servlet tun, um die Datei Umgang mit Ihnen in Ihrem Beispiel haben. Nur, anstatt das File-Objekt zurückkehrt, hat die Servlet schreiben, die Datei in den Ausgabestream. Siehe Beispiele für Datei-I / O und ersetzen Sie einfach jede outfile.write (...) Linien mit responseStream.write (...) und Sie sollten gehen gesetzt werden. Sobald Sie den Ausgangsstrom spülen und schließen, und führen Sie die Rückkehr, wenn ich mich richtig erinnere, sollte der Browser der Lage sein, das pdf aus der Antwort zu holen.

Andere Tipps

Ok, habe ich diese Arbeit. Hier ist, wie ich es getan hätte:

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.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);
%>

Java Bean-Methode:

//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());
        }
     }
 }

Danke an alle für ihre Eingabe!

Nur eine Vermutung, aber haben Sie überprüften den MIME-Typen, die Ihre JSP-Seite zurückkehrt?

edit: wenn ich den Code tatsächlich lesen Sie auf dem Laufenden Ich würde sehen, dass es festgelegt haben, so macht nichts:)

edit2: Sind nicht die Zeilenumbrüche zwischen JSP-Tags in Ihrem JSP-Code geht in den Ausgabestrom enden? Könnte sein, dass die Antwort zurückgegeben vom Server abzuwerfen? Ich weiß nichts über das Format einer PDF, sondern hängt es auf bestimmtem „Marker“ Zeichen an bestimmten Stellen in der Datei sein? (Die Fehlermeldung zurück, klingt wie es der Fall ist).

Ich stimme mit matt b , seine vielleicht die Räume zwischen JSP-Tags. Versuchen Sie setzen die Richtlinie

<%@ page trimDirectiveWhitespaces="true" %>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top