2010-07-11 5 views
2

J'ai un service RPC et l'un de ces procédés génère un rapport à l'aide de Pentaho Reporting Engine. Le rapport est un fichier PDF. Ce que je voudrais faire, c'est lorsque l'utilisateur demande un rapport, le rapport lui est renvoyé et la boîte de dialogue de sauvegarde ou sth apparaît. J'ai essayé ceci dans ma méthode de service:GWT: Envoi d'un document PDF du serveur au client

Resource res = manager.createDirectly(new URL(reportUrl), MasterReport.class); 
      MasterReport report = (MasterReport) res.getResource(); 
      report.getParameterValues().put("journalName", "FooBar"); 
      this.getThreadLocalResponse().setContentType("application/pdf"); 
      PdfReportUtil.createPDF(report, this.getThreadLocalResponse().getOutputStream()); 

Mais cela ne fonctionne pas. Comment cela peut-il être fait?

Répondre

6

Je le fais un peu différemment. J'ai une servlet séparée que j'utilise pour générer le PDF. Sur le client, faire quelque chose comme:

Cookies.setCookie(set what ever stuff PDF needs...); 
Window.open(GWT.getModuleBaseURL() + "DownloadPDF", "", ""); 

Le servlet, DownloadPDF ressemble à quelque chose comme ceci:

public class DownloadPDF extends HttpServlet { 

public void doGet(HttpServletRequest request, HttpServletResponse response) { 
    Cookie[] cookies = request.getCookies(); 
    try { 
     // get cookies, generate PDF. 
     // If PDF is generated to to temp file, read it 
     byte[] bytes = getFile(name); 
    sendPDF(response, bytes, name); 
    } catch (Exception ex) { 
     // do something here 
    } 
} 

byte[] getFile(String filename) { 

    byte[] bytes = null; 

    try { 
     java.io.File file = new java.io.File(filename); 
     FileInputStream fis = new FileInputStream(file); 
     bytes = new byte[(int) file.length()]; 
     fis.read(bytes); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    return bytes; 
} 

void sendPDF(HttpServletResponse response, byte[] bytes, String name) throws IOException { 
    ServletOutputStream stream = null; 

    stream = response.getOutputStream(); 
    response.setContentType("application/pdf"); 
    response.addHeader("Content-Type", "application/pdf"); 
    response.addHeader("Content-Disposition", "inline; filename=" + name); 
    response.setContentLength((int) bytes.length); 
    stream.write(bytes); 
    stream.close(); 
} 
} 
+0

Fonctionne parfaitement :) – jjczopek

+0

@BJB ici obtenir octets client GWT comment écrire octets de fichier, gwt ne supporte pas ça, non? – Parvathy

Questions connexes