2014-12-29 8 views
0

У меня есть задача отобразить PDF, извлеченный из базы данных, как всплывающее окно в приложении JSF, щелкнув ссылку. Однако моя модальная панель не передает PDF. Вместо этого в верхнем левом углу панели появляется маленькая темно-серая коробка.a4j: mediaOutput not rendering PDF

Вот мой XHTML код:

<rich:column styleClass="viewUserTable"> 
<f:facet name="header"> 
    <h:outputText value="Pdf" /> 
</f:facet> 
<h:outputLink value="#" id="link" style="color:blue;margin: 0 auto;"> 
    Proof 
    <rich:componentControl for="panel" attachTo="link" 
     operation="show" event="onclick" /> 
</h:outputLink> 
<rich:modalPanel id="panel" width="350" height="100"> 
    <f:facet name="header"> 
     <h:outputText value="PDF"></h:outputText> 
    </f:facet> 
    <a4j:mediaOutput element="object" mimeType="application/pdf" 
     id="media" session="false" createContent="#{getMyBean.showPdf}" 
     value="1" style="width:800px; height:600px;" cacheable="false" 
     standby="loading..."> 
    </a4j:mediaOutput> 
</rich:modalPanel> 

Вот метод, который я звоню в моем бобе для создания контента для <a4j:mediaOutput>.

public void showPdf(OutputStream stream, Object object) throws SQLException, IOException { 

    Blob proof= myObject.getPdf(someValue);//DB call to get the pdf 
    InputStream inStream = proof.getBinaryStream(); 
    int length = -1; 
    byte[] buffer = new byte[4096]; 

    while ((length = inStream.read(buffer)) != -1) { 
     stream.write(buffer, 0, length); 
    } 
} 

Я не уверен, о значении атрибута value в <a4j:mediaOutput>, но я нашел пример в Интернете, где аналогичный контент был выбирались с БД и и значение было установлено как 1. Я использую RichFaces 3.3 ,

ответ

0

Мой друг пришел ко мне с этой проблемой сегодня, и, как и вы, я изо всех сил пытался придумать решение. Через некоторое время, изучая сервлет, я смог решить проблему.

Ваш метод должен выглядеть следующим образом:

public void showPdf(OutputStream stream, Object object) throws SQLException, IOException { 

    Blob proof = myObject.getPdf(someValue);//DB call to get the pdf 

    FacesContext context = FacesContext.getCurrentInstance(); 
    HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse(); 
    ServletOutputStream sout = null; 

    response.setContentType("application/pdf"); 
    //set a constant for a name to avoid cache and duplicate files on server 
    response.setHeader("Content-Disposition","filename=fileName_" + (new Date()).getTime() + ".pdf"); 

    response.setHeader("Content-Transfer-Encoding", "binary;"); 
    response.setHeader("Pragma", " "); 
    response.setHeader("Cache-Control", " "); 
    response.setHeader("Pragma", "no-cache;"); 
    response.setDateHeader("Expires", new java.util.Date().getTime()); 
    //Here you will have to pass to total lengh of bytes 
    //as I used a file I called length method 
    response.setContentLength(Long.valueOf( proof.someByteLengthProperty() ).intValue()); 

    sout = response.getOutputStream(); 
    byte[] buf = new byte[4096]; 
    InputStream is = new FileInputStream(proof.getBinaryStream()); 
    int c = 0; 
    while ((c = is.read(buf, 0, buf.length)) > 0) { 
     sout.write(buf, 0, c); 
    } 
    sout.flush(); 
    is.close(); 

} 

Кажется, что только выписывая OutputStream не хватает, так что вы должны создать ServletOutputStream и отправить его throghout в «FacesContext», так что может сделать вывод как если он отправляет поток загрузки.

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

  • Нет связанных вопросов^_^