2010-07-11 5 views
2

У меня есть служба RPC, и один из методов генерирует отчет с использованием процессора отчетов Pentaho. Отчет представляет собой файл PDF. То, что я хотел бы сделать, - это когда пользователь запрашивает отчет, отчет отправляется обратно и сохраняет диалог или всплывает. Я пробовал это в моем методе оказания услуг:GWT: отправка PDF-документа с сервера на клиент

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()); 

Но это не работает. Как это можно сделать?

ответ

6

Я делаю это несколько иначе. У меня есть отдельный сервлет, который я использую для создания PDF-файла. На клиенте, сделать что-то вроде:

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

сервлет, DownloadPDF выглядит примерно так:

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

отлично работает :) – jjczopek

+0

@BJB здесь получать байты в GWT клиента, как писать байт в файл, gwt не поддерживает это, верно? – Parvathy

Смежные вопросы