2017-08-29 3 views
1

J'ai essayé des milliers d'alternatives qui tentent de représenterez un dans le navigateur Web, cela fait partie de mon fichier xhtml:Imposible à render StreamedContent dans les médias en utilisant primefaces

Et le contrôleur:

@ManagedBean 
@SessionScoped 
public class RegisterController implements Serializable { 

private static final long serialVersionUID = 1L; 
StreamedContent showFile; 

public StreamedContent getShowFile() { 

    Path pdfPath = Paths.get("path\\to\\image"); 
    byte[] pdf = null; 

    try { 
     pdf = Files.readAllBytes(pdfPath); 
    } catch (Exception e) {} 

    ByteArrayInputStream b = new ByteArrayInputStream(pdf); 
    DefaultStreamedContent d = new DefaultStreamedContent(b, "application/pdf"); 
    return d; 
} 

public void setPintaArchivo(StreamedContent showFile) { 
    this.showFile = showFile; 
    } 
} 

Dans le navigateur de la console, je reçois une erreur 404, voici quelques bons conseils que j'ai sans succès un vide sanitaire:

Répondre

-1

Si vous avez un chemin complet (à partir du dossier des ressources) à déjà généré fichier PDF, vous pouvez charger dans votre xhtml:

<object id="pdf_document" type="application/pdf" data="#{youBean.documentPath}?pfdrid_c=true" width="100%" height="500px">Your browser does not support this feature!</object> 

Eh bien, si vous souhaitez afficher un contenu pdf à partir d'un flux d'octets renvoyé par webservice, vous pouvez utiliser le composant documentViewer de Primefaces-extensions (qui utilise PDF.js)

Vous avez donc besoin, dans bean, charger un flux d'octets et générer un StreamedContent:

@ManagedBean 
@SessionScoped 
public class StreamBean implements Serializable { 

    private static final long serialVersionUID = 1L; 

    private StreamedContent pdfContent; 

    public void load() { 
     try { 
      // Simulate getting byte[] from external source, like webservice 
      ClassLoader classloader = Thread.currentThread().getContextClassLoader(); 
      InputStream inputStream = classloader.getResourceAsStream("file-sample.pdf"); 

      int byteReaded = 0; 
      ByteArrayOutputStream buffer = new ByteArrayOutputStream(); 
      byte[] data = new byte[1024]; 

      while ((byteReaded = inputStream.read(data, 0, data.length)) != -1) 
       buffer.write(data, 0, byteReaded); 
      buffer.flush(); 
      byte[] pdfBytes = buffer.toByteArray(); 

      // Create the StreamedContent with readed pdf file 
      pdfContent = new DefaultStreamedContent(new ByteArrayInputStream(pdfBytes), "application/pdf"); 

     } catch (IOException e) { 
      // Manage your exception here 
      e.printStackTrace(); 
     } 
    } 

    public StreamedContent getPdfContent() { 
     return pdfContent; 
    } 
} 

Important: ne mettent pas @PostConstruct cours méthode load(), elle sera appelée en cas prerender:

<ui:composition template="/your-template.xhtml" ... xmlns:pe="http://primefaces.org/ui/extensions"> 

    <ui:define name="pageBody"> 

     <f:metadata> 
      <f:event type="preRenderView" listener="#{streamBean.load()}" /> 
     </f:metadata>     

     <pe:documentViewer height="450" value="#{streamBean.pdfContent}" download="file-sample.pdf" /> 

    </ui:define> 

</ui:composition> 

note: être prudent avec les primefaces et versions primefaces-extensions, dans ce cas, j'ai utilisé:

<dependency> 
    <groupId>org.primefaces</groupId> 
    <artifactId>primefaces</artifactId> 
    <version>6.1</version> 
</dependency> 
<dependency> 
    <groupId>org.primefaces.extensions</groupId> 
    <artifactId>primefaces-extensions</artifactId> 
    <version>6.1.0</version> 
</dependency> 
+0

C'est vrai, j'ai toujours besoin de consommer un service web qui retourne un tableau d'octets dans lequel le document pdf est contenu –

+0

@OliverSoria OK, mais vous devez spécifier la source dans votre question (n'est pas un fichier). J'espère que la mise à jour de la réponse vous sera utile –