2016-05-24 5 views
0

Ich habe ein Problem mit iTextPdf in einer WEB-Kontext-Anwendung.Warum ist die mit iTextPDF bearbeitete PDF in einem Web-Servlet-Kontext beschädigt?

Ich habe ein Web-Servlet, das ein PDF herunterlädt, nachdem ich es in Runtime bearbeitet habe.

Wenn ich meine Methode aufrufen, die das PDF in einem NON-WEB Kontext Anwendung, die PDF Vorbereitung ist perfekt erstellt und es öffnet sich ohne Probleme.

Aber in einer WEB-Kontext Anwendung, wird die Datei erstellt, aber wenn ich den Download von meiner Testseite machen ist es beschädigt: Wenn ich die heruntergeladene Datei öffnen, ohne Bilder ist und erscheint eine Fehlermeldung über eine Schriftart, die nicht gefunden wird.

Wenn ich die „clean“ Datei öffnen und die „beschädigt“ Datei mit einem Texteditor, haben sie die gleiche Anzahl von Zeilen, aber in Wirklichkeit der Inhalt erscheint anders.

Also vermute ich, dass das Problem das Rendering des Content-Typ in der Web-Antwort oder etwas ähnliches ist.

ich diese Dokumentation verfolgt haben: http://developers.itextpdf.com/examples/itext-action-second-edition/chapter-9

Dies ist der Spring MVC Controller-Implementierung:

@RequestMapping(path = "/downloadPDF", method = RequestMethod.GET) 
public void downloadPDF(HttpServletResponse response){ 
    try{ 
     response.setContentType("application/pdf;charset=UTF-8");  
     ByteArrayOutputStream baos = myPDFHandler.getPdf('filetest.pdf'); 
     OutputStream outputStream = response.getOutputStream(); 
     baos.writeTo(outputStream); 
     outputStream.flush(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

Dies sind die Antwort-Header:

Response Headers 

view source 
Cache-Control:no-store 
Cache-Control:no-cache 
Content-Type:application/pdf;charset=UTF-8 
Date:Tue, 24 May 2016 10:20:56 GMT 
Expires:Thu, 01 Jan 1970 00:00:00 GMT 
Pragma:no-cache 
Server:Apache-Coyote/1.1 
Strict-Transport-Security:max-age=31536000 ; includeSubDomains 
Transfer-Encoding:chunked 
X-Content-Type-Options:nosniff 
X-Frame-Options:DENY 
X-XSS-Protection:1; mode=block 

Das Problem ist nicht in ist " myPDFHandler.getPdf "Methode, weil es in einem NON-WEB Kontext perfekt funktioniert.

Irgendeine Idee? Danke.

+1

ist es sicher, dass die Datei 'UTF-8' codiert? –

+0

habe ich mit charset = UTF-8 und ohne es versucht, aber das Ergebnis ist das gleiche. Wenn ich es im NON-WEB-Kontext versuche, muss ich es nicht spezifizieren ... –

+0

'charset = UTF-8' ist trotzdem falsch. Haben Sie gesagt, können Sie das PDF teilen, sobald der Browser es empfängt und einmal auf dem Server gespeichert? – mkl

Antwort

0

Ich habe die Lösung gefunden.

Das Problem war der Rückgabetyp der @Controller, void@ResponseBody byte[] geändert zu arbeiten.

Ich habe auch "charset = UTF-8" entfernt und ich habe den Header "Content-Disposition" hinzugefügt.

@RequestMapping(path = "/downloadPDF", method = RequestMethod.GET) 
public @ResponseBody byte[] downloadPDF(HttpServletResponse response){ 
    try{ 
     response.setContentType("application/pdf"); 
     response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "inline; filename=somefile.pdf");  
     ByteArrayOutputStream baos = myPDFHandler.getPdf('filetest.pdf'); 
     return baos.toByteArray(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
}