Servlet Wie am besten PDF generieren?

Moin ihrs,

ich brauche eine Möglichkeit PDF's aus einer XHTML-Datei zu generieren. Ich habe schon versucht mit Flying Saucer und iText zu arbeiten. Das sieht derzeit so aus:

Java:
package de.klientsoftware.statistik;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.lowagie.text.DocumentException;
import java.io.File;
import java.io.OutputStream;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.xhtmlrenderer.pdf.ITextRenderer;

/**
 *
 * @author david
 */
public class ExportToPDFServlet extends HttpServlet {

    /** 
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     * 
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException{

        OutputStream out = response.getOutputStream();
        String filename = request.getPathInfo().substring(1);
        String inputFile = request.getServletContext().getRealPath("/faces/user/"+filename);
        String url = new File(inputFile).toURI().toURL().toString();
        System.out.println(url);
                        
        try {
            
            response.setContentType("application/pdf");
            ITextRenderer renderer = new ITextRenderer();
            renderer.setDocument(url);
            renderer.layout();
            renderer.createPDF(out);
            
            
         
        }catch(DocumentException dexp){
            Logger.getLogger(ExportToPDFServlet.class.getName()).log(Level.SEVERE, null, dexp);
        }finally {            
            out.close();
        }
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /** 
     * Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /** 
     * Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /** 
     * Returns a short description of the servlet.
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>
}
Problem an der ganzen sache ist, dass ich dauernd eine Exception vom XMLParser bekomme mit der ich so garnichts anfangen kann.

Code:
 StandardWrapperValve[ExportToPDFServlet]: PWC1406: Servlet.service() for servlet ExportToPDFServlet threw exception
org.xhtmlrenderer.util.XRRuntimeException: Can't load the XML resource (using TRaX transformer). java.io.IOException: Stream closed
Der Pfad zur Datei ist richtig und einiges an Google-Anfragen brachte mich auch nicht weiter. Die Syntay innerhalb der Datei ist auch ok, ich bleib dort einfach hängen.

Hat dementsprechend jemand eine Ahnung was dort falsch läuft oder eine Alternative zu meinem Ansatz?

LG

David
 
Hi,

vlt. ein kleiner Tipp: JasperReports
Ich weiß aber nicht, ob JasperReports das unterstütz und hab auch grade keine Zeit, da mal nachzuforschen:) Aber du hast die Zeit bestimmt:)

Gruß

P.s.: Gerade noch gefunden:
java - PDF file generation from XML or HTML - Stack Overflow
EditEdit:
Es hat mir doch keine Ruhe gelassen.
Entferne doch mal das close() im finally-Block. Vlt. wird der Stream noch anderweitig gebraucht??
 
Zuletzt bearbeitet:
Moin,

Danke für deine Antwort. Ich denke das wird mit JasperReports nichts. Ich bin allerdings schon am überlegen das ausschließlich mit iText zu machen.

Dahingehend stellt sich mir derzeit noch eine frage: Wie bekomme ich den HTML-Output der xhtml-Datei als String?

Ich denke das ich da was mit nem Inputstream machen könnte, habe aber noch keinen Masterplan.

LG
 
Jaaaaaaaa hmmmmmm :)

Hab ich auch schon gesehen. Ist auch nicht falsch aber diese FOP-Files zu generieren scheint mir recht aufwendig zu sein. Kann auch sein das ich zu Apache FOP nicht das richtige gefunden habe aber wie gesagt das was ich gesehen hatte ging mit viel Aufwand einher.

Wenn ich allerdings nichts finde was mir hilft, dann werde ich darauf zurückgreifen. Du hast also völlig recht, das ist eigentlich genau das was ich brauche. Ich mag nur schauen ob es einfacher geht.

Danke für deine Antwort!

LG

David
 
Hi,

Du brauchst keine FOP-Files generieren.
Ich habe es für XHTML noch nich nicht verwendet.
Aber ich weiß, dass Du aus einem xml und einer xsl ein pdf erzeugen kannst.
Eigentlich sollte das mit xhtml auch möglich sein, da xhtml auch ein xml-dokument ist.

Da ich aber noch auf Arbeit bin kann ich Dir gerade kein Beispiel liefern.

Viele Grüße,
Sebastian.
 
Huhu,

ich hab das anders gelesen, man muss aus der xhtml / html datei halt erstmal ein FOP, XLS oder XML machen und kann dann mit Apache FOP die PDF generieren.

Wenn ich da allerdings falsch informiert bin, wäre das natürlich eine super alternative!!

Danke dir schon mal.

LG

David
 
Ok ich hab eine Lösung!

Ich arbeite hier nur mit iText und Java-Boardmitteln:

Java:
 protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

         
        //Der Servlet-Outputstream
        OutputStream out = response.getOutputStream();
        try {

            //Contentype zu PDF, wir wollen ja eine PDF zurückgeben
            response.setContentType("application/pdf");
            //Die XHTML-Datei als Inputstream 
            //Ich benutze hier eine URL damit ich "reines" HTML zurück bekomme
            InputStream in = new URL("http://localhost:8080/web/faces/test.xhtml").openStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(in));

            StringBuilder stringBuilder = new StringBuilder();

            String zeile;
            //Die Datei in einen String speichern
            while ((zeile = reader.readLine()) != null) {
                stringBuilder.append(zeile);
            }

            //Dokument erstellen
            //Mit iText HTMLWorker "parsen"
            //Dokument schließen und zurückwerfen
            Document document = new Document(PageSize.A4);
            PdfWriter writer = PdfWriter.getInstance(document, out);
            document.open();
            document.addCreationDate();
            HTMLWorker htmlWorker = new HTMLWorker(document);
            htmlWorker.parse(new StringReader(stringBuilder.toString()));
            document.close();


        } catch (DocumentException ex) {
            Logger.getLogger(ExportToPDFServlet.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            out.close();
        }
    }
Funktioniert gut soweit!!

Edit:

Ok nicht ganz -.-
Wenn Bilder in der Datei sind sucht er sie auf der platte und schmeißt eine java.io.FileNotFoundException.
Wenn ich z.B. ein bild mit dem Pfad \images\test.jpg habe, kommt :

Code:
 java.io.FileNotFoundException: C:\images\test.jpg (Das System kann den angegebenen Pfad nicht finden)
EditEdit:

Mit einem vollen http-Pfad geht es:
HTML:
<img src="http://localhost:8080/web/faces/images/test.jpg" />
nur die Positionierung lässt zu wünschen übrig :/

Und zum 3. Bearbeitet:

Die Positionierung lässt bei Bildern nur dann zu wünschen übrig wenn ken align angegeben wird:

HTML:
<img src="http://localhost:8080/web/faces/images/test.jpg" align="left" />
und alles wird gut :D Damit hab ich eine laufende Lösung!
 
Zuletzt bearbeitet:
Auch wenn du schon eine Lösung hast, aber:
kommst du nicht über einen Filter an die gerenderte Antwort (HTML Content)ran? URL
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben