PDF per Servlet übertragen, danach keinen Inhalt mehr

Status
Nicht offen für weitere Antworten.

ProfSamba

Mitglied
Hi Leute...

Also ich habe da ein Problem, bei dem Ihr mir hoffentlich helfen könnt...

Ich erzeuge mir per iText ein PDF und lege es in einen Pfad ausserhalb der WebRoot.

Eine Methode liest mir das File wieder als byte[] ein:

Code:
    public static byte[] getPdf(){

        File file = new File("c:/test.pdf");
        
        byte[] data = new byte[(int)file.length()];
        try {
            FileInputStream fis = new FileInputStream(file);
            
            BufferedInputStream buffer = new BufferedInputStream(fis);
            
            buffer.read(data); 
            
        } catch (FileNotFoundException ex) {
            ex.printStackTrace();
        } catch (IOException ex) {
            ex.printStackTrace();
        } 
        return data;
    }

Mein Servlet schickt das dann an den Client:
Code:
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        
        byte[] data = PdfReport.getPdf();
        
        response.setContentLength(data.length);
        response.setContentType("application/pdf");
        response.setHeader("Content-Disposition","attachment; filename=\"Report.pdf\"");
        response.setHeader("Content-Transfer-Encoding","binary");

        response.getOutputStream().write(data);

    }


Das funktioniert alles einwandfrei, nur jetzt kommt das erstaunliche...
Das heruntergeladene PDF kann ich mir zwar ansehen, es enthält jedoch keinen Text...
alle Header Informationen sind im PDF zwar enthalten (z.B. Anzahl der Seiten, Autor, etc) aber der Text wird nicht angezeigt.
die Größe der PDF-Dateien (auf dem Server und auf dem Client) sind absolut identisch...

Ich habe das heruntergeladene PDF auch schon auf mehreren Rechnerngetestet... es liegt also nicht an der Acrobat Version oder so...

Ich dachte erst, dass es am Character-Encoding liegt, aber ich denke, dass das so richtig ist...

Hat von Euch noch jemand eine Idee, woran es liegen könnte?

Danke schonmal und viele Grüße
Matze
 

Mersi

Neues Mitglied
Hi!

Ich weiß zwar nicht, ob ich Dir weiterhelfen kann, aber ich mache das direkt über den Request und nicht mit einer extra Übertragung. [Und ja, das klappt super ;-)]

Also so:
Code:
response.setContentType("application/pdf");
PdfWriter pdfWriter = PdfWriter.getInstance(document, response.getOutputStream());

Vielleicht kannst Du damit das Problem ja umgehen...
 

ProfSamba

Mitglied
Hi Mersi.

Danke für deine Antwort.
Den Umweg gehe ich nur deshalb, weil das Servlet keinen direkten Zugriff auf das Dokument hat. Ich werde mal versuchen, dass ich ein Objekt vom Typ PdfDocument übergebe, anstatt ein Byte-Array, hoffentlich tut das...

Ich werde es morgen mal versuchen und berichten...

Gruß
 

ProfSamba

Mitglied
Tja, also ich wollte das heute nochmal Testen, aber ich habe leider keine Möglichkeit aus einem bereits existierenden PDF ein (iText) Document zu erstellen, dass ich dann weiter geben könnte...

Hat denn jemand anders schonmal ein PDF-Download realisiert?

Ich habe jetzt zum Testen einen direkten Zugriff vom Servlet auf die Datei erstellt, aber auch das bringt keinen Unterschied.

Hier mein aktueller Code:
Code:
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {

        Properties config = ConfigLoader.getConfig();
        File file = new File(config.getProperty("workingdir")+"/Java Web Service.pdf");
        
        byte[] data = new byte[(int)file.length()];

        try {
            
            FileInputStream fis = new FileInputStream(file);
            BufferedInputStream buffy = new BufferedInputStream(fis);
            buffy.read(data); 
        } catch (FileNotFoundException ex) {
            ex.printStackTrace();
        } catch (IOException ex) {
            ex.printStackTrace();
        } 
        
        response.setContentLength(data.length);
        response.setContentType("application/pdf");
        response.setHeader("Content-Disposition","attachment; filename=\"Java Web Service.pdf\"");
        response.setHeader("Cache-Control","no-cache");
      
        response.getOutputStream().write(data);
    }

Noch jemand eine andere Idee, warum das PDF nicht so ankommt, wie ich es auf Serverseite habe?
Mache ich vielleicht schon beim einlesen etwas falsch?
 

ProfSamba

Mitglied
So, nachdem ich jetzt wieder ein bisschen weiter geforscht habe, habe ich festgestellt, dass sich das Datum der Datei beim Download ändert.

Die Original datei z.B. wurde am 11.11.2006 erstellt, nach dem Download über das oben gezeigte Servlet steht das "Erzeugt am" Datum immer auf der Uhrzeit, an dem ich es herutergeladen habe...

Wie kann ich das Datum beibehalten?
 

little_b

Mitglied
im eile des Gefechts hab ich bei Dir nirgends ein close gesehen.
machst Du den stream irgendwo wieder zu?
koennte das problem mit dem inhalt loesen.

so weit ich weiss ist das Datum zB. lastModified nicht im file,
sondern im dazugehoerigen filesystem gespeichert.
demnach muesstest du das extra uebertragen.

viel glueck :)
 

ProfSamba

Mitglied
Code:
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
    
        response.reset();
        Properties config = ConfigLoader.getConfig();
        
        
        ServletOutputStream sos = response.getOutputStream();
        
      
        byte data[] = new byte[1024000];
        
        BufferedInputStream bis;
        try
        {
            bis = new BufferedInputStream(new \
                        FileInputStream(config.getProperty("workingdir")\
                        +"/test.pdf"));
            
            int count=0;
            while((count=bis.read(data)) != -1){
                sos.write(data,0,count);
            }
            
            bis.close();
        }
        catch(Exception exception) {
            exception.printStackTrace();
        }
        
        sos.close();
    }


Also jetzt mit close() für den ServletOutputStream (sos) und den BufferedInputStream (bis). Leider hat das am Verhalten des PDF nichts geändert...
Die Sache mit dem Datum ist auch egal, ich habe gemerkt, dass das Erstellungsdatum nichts mit diesem Verhalten zu tun hat.

Schreibe ich mein byte[] in ein File anstatt in den ServletOutputStream, wird das PDF 1:1 kopiert und ich kann es mir auch ansehen (mit Inhalt), schicke ich es durch den sos, klappt es nicht.

Ich habe es jetzt auch mit anderen PDFs getestet, die ich nicht erstellt habe. Eines der PDFs verlangt nach einem Passwort, nachdem es durch das Servlet verschickt wurde... (das Original verlangt nicht nach einem Passwort)...

Gibt es sonst noch Ideen, was ich falsch gemacht haben könnte? Kann diese Problem jemand nachvollziehen?

Gruß
Matze
 
H

HaBaLeS

Gast
Ich vermute mal, das du nciht alles schreibst, das fie filesize passt kann u.A. auch daran leigen, dass du die Filesize angegebenhast dun er es auffüllt.


Diesen Code habe ich Produktiv im einsatz, versuch´s mal damit

Code:
 private void sendFileToClient(HttpServletResponse res,
         String pOutputFilename, String pMimeType, String pFileName)
         throws Exception {

      ServletOutputStream stream = null;
      BufferedInputStream fif = null;

      FileInputStream zipInStream = new FileInputStream(pFileName);
      fif = new BufferedInputStream(zipInStream);

      res.setHeader("Content-Disposition", "attachment;filename="
            + pOutputFilename);
      res.setContentType(pMimeType);
      res.setContentLength((int) (new File(pFileName)).length());

      int data = 0;
      stream = res.getOutputStream();
      while ((data = fif.read()) != -1) {
         stream.write(data);
      }
      fif.close();
      stream.close();

   }
 

ProfSamba

Mitglied
Hi...

Danke für den Code HaBaLeS. Aber das problem ist genau das gleiche... Ich habe deinen Code 1:1 übernommen.
Wenn ich mir ein txt File schicke funktioniert das alles wunderbar. Nur bei einem PDF nicht.

Hast du mit deinem Code schonmal PDFs heruntergeladen?


Gruß
Matze
 
H

HaBaLeS

Gast
Ich hab damit schon zu ziemlich alles als Download gestreamt, da es ein Teil einer Downloadverwaltung ist.

Sorry aber dann bin ich mit meinem ferndiagnose Latein am Ende :-(
 

ProfSamba

Mitglied
So, ich werde jetzt mal auf einem anderen AppServer testen, mal sehen, ob es was bringt...
Muss ja nicht immer ICH sein, der die Fehler macht ???:L
 

ProfSamba

Mitglied
Hallo...

Naja, wie immer lag das Problem wohl doch an mir. :(

Ich habe das Servlet nicht direkt aufgerufen, sondern über JSF.

List.jsp
Code:
<h:commandLink action="showpdf" value="Download"/>

faces-config.xml
Code:
<navigation-case>
            <from-outcome>showpdf</from-outcome>
            <to-view-id>/pdfServlet</to-view-id>
</navigation-case>


Wenn ich das so gemacht habe, hat er mir das Pdf "zerschossen", warum weiß ich allerdings nicht...

Jetzt habe ich das ganze so gelöst, dass ich aus der List.jsp nicht mehr den Umweg über die faces-config.xml gehe:

List.jsp
Code:
<h:outputLink value="../../PdfServlet?id=#{pdf.id}">Anzeigen</h:outputLink>

Seitdem funktioniert das Anzeigen des PDF.


Trotzdem habe ich noch eine kleine Frage.
Ist es vielleicht möglich ein Pdf dann über eine ManagedBean zu versenden? Und das Servlet ganz weg zu lassen?

Gruß
Matze
 
G

Gast

Gast
Hi! Also ich nutze Struts, und musste das auch realisieren, und dort geht es, auch wenn ich es in eine Action packe und mit viewPdf.do anspreche...

Mein Code:

Code:
public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request,
	HttpServletResponse response) throws Exception {
	String fileName = "test.pdf";
	String fullPath = "C:\\Programme\\JBoss\\server\\default";
	FileInputStream fis = null;
	BufferedOutputStream bos = null;

	try {
		ServletOutputStream out = response.getOutputStream();
		response.setContentType("application/pdf");
		String fileWithFullPath = fullPath + "\\" + fileName;
		System.out.println(fileWithFullPath);
		fis = new FileInputStream(fileWithFullPath);
		bos = new BufferedOutputStream(out);
		byte[] buff = new byte[2048];
		int bytesRead;
		while (-1 != (bytesRead = fis.read(buff, 0, buff.length))) {
			bos.write(buff, 0, bytesRead);
		}
	} catch (IOException e) {
		System.out.println("IO Exception für File: " + fileName);
		e.printStackTrace();
	} finally {
		try {
			if (fis != null)
				fis.close();
			if (bos != null)
				bos.close();
		} catch (IOException e) {
			System.out.println("Error while closing Stream.");
			e.printStackTrace();
		}
	}
	return null;
}
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Bean übertragen von Servlet zu Servlet Allgemeines EE 9
G Jakarta Servlet API 5.0 Allgemeines EE 1
pkm Frage wegen AJAX-Zugriff auf ein Servlet Allgemeines EE 1
Dimax Servlet Servlet Kommunikation Allgemeines EE 18
K Unterschied zwischen JSP & Servlet gegenüber REST mittels JAX-RS Allgemeines EE 1
Dimax Servlet läuft in Eclipse, aber nicht im Browser Allgemeines EE 74
M URL Servlet Request getParameter Allgemeines EE 2
M Servlet Methoden Aufruf im Servlet Allgemeines EE 10
J 404 Not found (Servlet) Allgemeines EE 1
J Asynchrones Servlet löst NullPointerException aus Allgemeines EE 5
E Servlet Servlet das richtige? Allgemeines EE 11
B HTTP-Header-Inspektor-Servlet Allgemeines EE 1
N JSP Servlet mit JSP ansprechen Allgemeines EE 2
F Mehrere Bilder aus MySQL DB via Servlet darstellen. Allgemeines EE 1
J FTP und Servlet Allgemeines EE 11
H Post an Servlet Allgemeines EE 2
A Binärdatei vom Servlet erzeugen lassen Allgemeines EE 3
S Servlet Authentication Filter Allgemeines EE 0
S LDAP JAAS oder Servlet Allgemeines EE 0
G Problem: Servlet in JSP einbinden mit <jsp:include> Allgemeines EE 3
F eigene Anwendung per Servlet Container starten Allgemeines EE 9
F Servlet Daten im Speicher ablegen Allgemeines EE 3
L Servlet ClassNotFoundException Servlet Allgemeines EE 3
G Allgemeine Frage zu Authentifizierung mittels Servlet API Allgemeines EE 2
J Servlet "package does not exist" Allgemeines EE 5
K Servlet-Mapping Allgemeines EE 9
0 Servlet mit ArrayList Allgemeines EE 3
E Servlet unter mehreren Adressen Allgemeines EE 16
S Pfad-Zugriff über Servlet-init() Allgemeines EE 2
E Servlet Wie kann ich ohne Hilfe von Eclipse in JBoss mein servlet aufrufen Allgemeines EE 2
S Servlet.service() threw exception Allgemeines EE 4
A Servlet erkennt request Objekt nicht Allgemeines EE 8
G Direkter Zugriff auf Servlet- doPost Allgemeines EE 15
G Servlet doGet, doPost Allgemeines EE 3
A Kodierungsproblem bei Parameterübergabe von Browser an Servlet (GET) Allgemeines EE 2
Antoras servlet-mapping auf dynamische URLs Allgemeines EE 17
0 Problem mit librarys javax.servlet.http.HttpServletRequest cannot be resolved Allgemeines EE 1
MQue Ajax - Servlet Allgemeines EE 2
MQue Servlet Allgemeines EE 9
S [Design] Dynamischer EJB Aufruf von Servlet Allgemeines EE 3
S Servlet auf JBoss 5? Allgemeines EE 11
B HttpSession bekommen wenn nicht in Servlet Allgemeines EE 8
MQue Servlet / Button Allgemeines EE 5
S In Eclipse werden die "Servlet-Klassen" nicht gefu Allgemeines EE 2
U javax.faces und javax.servlet cannot be resolved Allgemeines EE 2
W Potentielles Memory Leak bei Servlet Allgemeines EE 6
B unterschied servlet und bean Allgemeines EE 2
Escorter Servlet .sar und jede Menge .jar Archive Allgemeines EE 2
N Servlet und JSF (URL-Rewriting)? Allgemeines EE 3
A jsf: Servlet aufrufen, wie geht das? web.xml Fehler? Allgemeines EE 13
N Servlet zyklisch aktualisieren Allgemeines EE 2
zilti Verbindung Applet <-> Servlet Allgemeines EE 5
ARadauer Servlet Bild Rückgabe Allgemeines EE 2
I Über Formular Daten zu Servlet Allgemeines EE 36
H Servlet - Zwischenmeldung anzeigen bei längerer Berechnung Allgemeines EE 2
G Ordner mit Umlauten einlesen - Servlet Allgemeines EE 3
A web.xml für Servlet in Tomcat 5.5 erstellen Allgemeines EE 2
M Zwei Buttons in einem Servlet Allgemeines EE 2
M Servlet lässt sich nicht aufrufen Allgemeines EE 6
A web.xml für Servlet in Tomcat erstellen Allgemeines EE 6
B Servlet Allgemeines EE 3
G EJB - EJB wird nicht ins Servlet geladen Allgemeines EE 3
K load-on-startup -> in der Servlet Klasse Allgemeines EE 6
G Objekt an Servlet übergeben - oder Objekt global definieren? Allgemeines EE 4
W Was bei Servlet-Entwicklung alles beachten? Allgemeines EE 8
R Zugriff auf Filter Servlet Allgemeines EE 10
I JBOSS Jsp Files Pfad im Servlet? Allgemeines EE 4
N Servlet-Request abbrechen? Allgemeines EE 3
D Java Servlet mit Radio Buttons Allgemeines EE 2
G Servlet debugging Allgemeines EE 8
N Thread von Servlet aus starten Allgemeines EE 16
N JSP: Collection im Servlet überwachen (mit AJAX)? Allgemeines EE 5
J Socket daten darstellen per jsp,servlet Allgemeines EE 2
W servlet über https Allgemeines EE 2
L Servlet kann Funktion nicht aufrufen Allgemeines EE 3
B Parameterübergane von Servlet an JSP funktioniert nicht ? Allgemeines EE 2
M Aus einem Servlet auf ein anderes zugreifen ? Allgemeines EE 2
G Servlet Serializable Allgemeines EE 2
B Servlet-Api.jar auf JBoss? (Migration von Tomcat zu JBoss) Allgemeines EE 4
H Servlet - Importieren von Code Allgemeines EE 2
P Java Servlet - Umgang mit Verlinkungen Allgemeines EE 7
M Wert aus Servlet an normale Klasse übergeben Allgemeines EE 2
E Servlet soll JFRame öffnen. Jframe.setvisible schlägtfehl Allgemeines EE 2
M servlet --> jsp - problem beim umstrukturieren Allgemeines EE 5
D Servlet Problem über Server Allgemeines EE 26
K Servlet per Formular aufrufen Allgemeines EE 8
L sessions mit servlet oder jsp ? Allgemeines EE 9
B JSF - Servlet mit Parametern über einen Link öffnen Allgemeines EE 3
D Binärdaten im Servlet entgegen nehmen, aber wie? Allgemeines EE 5
T Servlet-Instanzen und ServletContext Allgemeines EE 2
L speichern von daten mittels servlet in xml Allgemeines EE 8
N Collection überwachen (Servlet + AJAX) Allgemeines EE 3
N Liste mit Checkboxen an Servlet übergeben? Allgemeines EE 3
T Wie Datenbank und Servlet koppeln? Allgemeines EE 3
G Ladeseite anzeigen lassen während das Servlet noch arbeitet? Allgemeines EE 6
P Tomcat Servlet POST Daten als Array Allgemeines EE 2
N JSP kann Servlet nicht aufrufen! :-( Allgemeines EE 2
J Servlet Parameter aus web.xml übergeben, wie zugreifen? Allgemeines EE 2
L servlet.jar ? Allgemeines EE 2
K Servlet: Respone.redirect mit POST-Parametern Allgemeines EE 5

Ähnliche Java Themen

Neue Themen


Oben