2014-10-16 64 views
-3

如何使用iText在內存中創建一個PDF文件,然後將對象顯示在對話框的primefaces中,用戶可以根據需要下載報告。 這是我的代碼:在內存中創建一個PDF文件

private StreamedContent file; 

public StreamedContent getFile() { 
    return file; 
} 

public void setFile(StreamedContent file) { 
    this.file = file; 
} 



public void memoryReport() throws DocumentException { 
    try { 
     Document document = new Document(PageSize.LETTER); 
     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     PdfWriter writer; 
     writer = PdfWriter.getInstance(document, baos); 
     document.addTitle("This is a title."); 
     document.open(); 
     document.add(new Paragraph("This document was created successful")); 
     document.close(); 
     writer.close(); 
     //String fileName = "Andy"; 
     InputStream stream = new ByteArrayInputStream(baos.toByteArray()); 
     //file = new DefaultStreamedContent(stream, "application/pdf", fileName); 
     file=new DefaultStreamedContent(stream, "application/pdf"); 
    } catch (Exception ex) { 
     ex.getMessage(); 
    } 
} 

XHTML:

<f:facet name="footer"> 
    <p:commandButton value="valor" icon="ui-icon-check" oncomplete="reportModal.show()" action="#{reportMemory.memoryReport}" update="reportViewer"/> 
</f:facet> 
</h:panelGrid> 
</div> 
<p:dialog resizable="false" closeOnEscape="true" appendTo="@(body)" modal="true" id="reportViewer" widgetVar="reportModal" width="1000px" height="630px"> 
<p:media cache="false" value="#{reportMemory.file}" width="100%" height="600px" player="pdf"/> 
</p:dialog> 
+4

這個問題似乎是脫離主題,因爲它是一個「show me teh codez」問題。 – 2014-10-17 08:08:19

回答

0

這個解決方案,利用iText,primefaces媒體。

<p:dataTable widgetVar="tb1" id="tablaFact" var="item" selection="#{listadoFacturasMB.selectedFactura}" selectionMode="single" paginator="true" 
    rows="20" rowKey="#{item.idFactura}" value="#{listadoFacturasMB.facturaUtilList}"> 

     <p:ajax event="rowSelect" update=":frm1:growl :frm1:dialog" oncomplete="PF('servDialog').show()" listener="#{listadoFacturasMB.createPDF}"/>       

     <f:facet name="header"> 
      <h:outputText value="Listado de facturas (Cantidad: #{listadoFacturasMB.cantFact})"/> 
     </f:facet> 

     <p:column style="width:10%" headerText="Nro" sortBy="noFactura" filterFunction="#{utilMB.filterByName}" filterBy="noFactura" filterMatchMode="contains">       
         <h:outputText value="#{item.noFactura}"/> 
     </p:column>                      
     </p:dataTable> 

      <p:dialog resizable="false" closeOnEscape="true" appendTo="@(body)" modal="true" id="dialog" header="Detalles de la factura" widgetVar="servDialog" width="1000px" height="630px"> 
       <p:media cache="false" value="#{listadoFacturasMB.fileDownload}" width="100%" height="600px" player="pdf"> 
        <f:param name="id" value="#{listadoFacturasMB.idFile}" /> 
       </p:media>     
      </p:dialog> 

支持bean:

private StreamedContent fileDownload; 

    public void createPDF() { 
    try {  
     Document pdf = new Document(PageSize.LETTER); 
     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     PdfWriter writer; 
     writer = PdfWriter.getInstance(pdf, baos); 
     if (!pdf.isOpen()) { 
      pdf.open(); 
     } 

     //Adding content to pdf 

     pdf.close(); 
     String fileName = "factura No " + this.selectedFactura.getNoFactura(); 

     InputStream stream = new ByteArrayInputStream(baos.toByteArray()); 
     fileDownload = new DefaultStreamedContent(stream, "application/pdf", fileName); 

    } catch (Exception e) { 
     JsfUtil.addErrorMessage(e, "Error: createPDF() " + e.getMessage()); 
    } 
} 
0

謝謝大家,我實現了工作,問題是範圍,我有RequestScoped,正確的是SessionScoped,這是唯一的一個錯誤。