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>
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 –
@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 –