java-forum.org - Java programmieren aus Leidenschaft
Java 6 Einstieg und professioneller Einsatz
Alter Preis: 34,90 EUR
Jetzt: 0,00 EUR

zzgl. Versandkosten

Zurück   java-forum.org - Java programmieren aus Leidenschaft > Enterprise Java > Web Tier

Web Tier JSP, Servlets, JSF, Struts, AJAX

Antwort    
Themen-Optionen Thema durchsuchen Ansicht
Alt 10.09.2012, 11:04   #1 (permalink)
Stammbenutzer
Halbes Megabyte
 
Benutzerbild von F.S.WhiTeY
 
Registriert seit: 28.11.2007
Fachbeiträge: 519
Blog-Einträge: 2
Abgegebene Danke: 17
Erhielt 62 Danke für 61 Beiträge
Standard 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 Code: Quelltext in neuem Fenster öffnen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
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
F.S.WhiTeY ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 10.09.2012, 13:09   #2 (permalink)
Benutzer
short
 
Registriert seit: 08.12.2010
Fachbeiträge: 26
Abgegebene Danke: 10
Erhielt 2 Danke für 2 Beiträge
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??

Geändert von moonermo (10.09.2012 um 13:16 Uhr)
moonermo ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Danke sagt:
F.S.WhiTeY (10.09.2012)
Alt 10.09.2012, 15:23   #3 (permalink)
Stammbenutzer
Halbes Megabyte
Themenstarter
 
Benutzerbild von F.S.WhiTeY
 
Registriert seit: 28.11.2007
Fachbeiträge: 519
Blog-Einträge: 2
Abgegebene Danke: 17
Erhielt 62 Danke für 61 Beiträge
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
F.S.WhiTeY ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 10.09.2012, 15:36   #4 (permalink)
Benutzer
double
 
Registriert seit: 06.06.2011
Fachbeiträge: 74
Abgegebene Danke: 2
Erhielt 6 Danke für 6 Beiträge
Hi,

schau Dir das hier mal an:
Apache FOP

Wäre das nichts für dich?
2AndAHalfBit ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Danke sagt:
F.S.WhiTeY (10.09.2012)
Alt 10.09.2012, 15:38   #5 (permalink)
Stammbenutzer
Halbes Megabyte
Themenstarter
 
Benutzerbild von F.S.WhiTeY
 
Registriert seit: 28.11.2007
Fachbeiträge: 519
Blog-Einträge: 2
Abgegebene Danke: 17
Erhielt 62 Danke für 61 Beiträge
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
F.S.WhiTeY ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 10.09.2012, 15:52   #6 (permalink)
Benutzer
double
 
Registriert seit: 06.06.2011
Fachbeiträge: 74
Abgegebene Danke: 2
Erhielt 6 Danke für 6 Beiträge
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.
2AndAHalfBit ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 10.09.2012, 15:53   #7 (permalink)
Stammbenutzer
Halbes Megabyte
Themenstarter
 
Benutzerbild von F.S.WhiTeY
 
Registriert seit: 28.11.2007
Fachbeiträge: 519
Blog-Einträge: 2
Abgegebene Danke: 17
Erhielt 62 Danke für 61 Beiträge
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
F.S.WhiTeY ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 10.09.2012, 16:20   #8 (permalink)
Stammbenutzer
Halbes Megabyte
Themenstarter
 
Benutzerbild von F.S.WhiTeY
 
Registriert seit: 28.11.2007
Fachbeiträge: 519
Blog-Einträge: 2
Abgegebene Danke: 17
Erhielt 62 Danke für 61 Beiträge
Ok ich hab eine Lösung!

Ich arbeite hier nur mit iText und Java-Boardmitteln:

Java Code: Quelltext in neuem Fenster öffnen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
36
37
38
39
40
41
 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-Code:
<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-Code:
<img src="http://localhost:8080/web/faces/images/test.jpg" align="left" />
und alles wird gut Damit hab ich eine laufende Lösung!

Geändert von F.S.WhiTeY (10.09.2012 um 16:54 Uhr)
F.S.WhiTeY ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 13.09.2012, 09:12   #9 (permalink)
Stammbenutzer
Floppy Disc
 
Registriert seit: 07.01.2005
Fachbeiträge: 875
Abgegebene Danke: 31
Erhielt 30 Danke für 29 Beiträge
Auch wenn du schon eine Lösung hast, aber:
kommst du nicht über einen Filter an die gerenderte Antwort (HTML Content)ran? URL
__________________
Gruss
Freez

... als mich dann die Arbeitswut überkam, setzte ich mich in die Ecke, und wartete ab, bis der Anfall vorbei war.
freez ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 13.09.2012, 09:43   #10 (permalink)
Stammbenutzer
Halbes Megabyte
Themenstarter
 
Benutzerbild von F.S.WhiTeY
 
Registriert seit: 28.11.2007
Fachbeiträge: 519
Blog-Einträge: 2
Abgegebene Danke: 17
Erhielt 62 Danke für 61 Beiträge
Moin,

da hab ich mir so noch garkeine Gedanken drum gemacht. Ich schaue mir das auf jeden Fall mal an.

LG
F.S.WhiTeY ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Antwort    

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Java und Pdf WinterDragon Java Basics - Anfänger-Themen 8 09.06.2012 09:38
PDFBox "Nicht genügend Speicher" witschi Allgemeine Java-Themen 2 14.05.2012 12:57
Servlet ausführen neela Web Tier 26 06.06.2011 07:32
iText - Layer aus PDF heraus löschen worona Java Basics - Anfänger-Themen 1 26.01.2010 14:15
Applet PDF erstellen und anzeigen ChBlond Allgemeine Java-Themen 3 08.05.2009 16:43


Lesezeichen

Forumregeln
Es ist Ihnen erlaubt, neue Themen zu verfassen.
Es ist Ihnen erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are aus
Pingbacks are aus
Refbacks are aus


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:41 Uhr.


Powered by vBulletin® Version 3.8.6 (Deutsch)
Copyright ©2000 - 2013, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.3.2
Thanks for Smilies by smilies.4-user.de