public void convertToPdf() throws Exception FacesContext facesContext = FacesContext.getCurrentInstance(); // Get current JSF view HTML as String String htmlContent = captureCurrentViewAsHtml(facesContext); // Convert HTML to PDF ByteArrayOutputStream pdfStream = new ByteArrayOutputStream(); ITextRenderer renderer = new ITextRenderer(); renderer.setDocumentFromString(htmlContent); renderer.layout(); renderer.createPDF(pdfStream); // Send PDF response sendPdfResponse(pdfStream.toByteArray());
document.add(table); document.close();
// Navigate to your JSF page URL session.getPage().enable(); session.getPage().navigate("http://localhost:8080/app/page.xhtml"); session.getPage().waitForLoadEvent();
// Save or stream response sendPdfResponse(pdf); If you just need a PDF from your data , skip HTML:
// Generate PDF byte[] pdf = session.getPage().printToPDF();
private String captureCurrentViewAsHtml(FacesContext context) throws IOException // Alternative: Use a custom PhaseListener or render via URL // Simpler: Re-render the component tree to a buffer UIViewRoot viewRoot = context.getViewRoot(); ResponseWriter originalWriter = context.getResponseWriter(); StringWriter stringWriter = new StringWriter(); context.setResponseWriter(context.getRenderKit().createResponseWriter( stringWriter, "text/html", "UTF-8")); viewRoot.encodeAll(context); context.responseComplete(); String html = stringWriter.toString(); context.setResponseWriter(originalWriter); return html;
import com.lowagie.text.*; import com.lowagie.text.pdf.PdfPTable; public void generatePdfFromData(List<MyData> data) Document document = new Document(); ByteArrayOutputStream out = new ByteArrayOutputStream(); PdfWriter.getInstance(document, out); document.open();
for (MyData item : data) table.addCell(item.getName()); table.addCell(String.valueOf(item.getValue())); table.addCell(item.getDate().toString());