在Primefaces中更改默认格式dataExporter

mey*_*uel 1 itext primefaces jsf-2

我想用来生成pdf dataexporter,使用方法预处理器来插入一些内容.通过给出类型字母大小页面可以很好地同化文本格式.然后进行分页以将图表放在新页面上,正确的问题是生成具有其他大小的第二页,并且还找到一种方法来更改导出表的文本的字体大小.

<h:commandLink>  
      <p:graphicImage value="/images/pdf.png"/> 
             <p:dataExporter type="pdf" target="dataTableAddDetalles" fileName="pdf" preProcessor="#{serviciosMB.preProcessPDF}"/>  
</h:commandLink>
Run Code Online (Sandbox Code Playgroud)

支持豆

 public void preProcessPDF(Object document) throws Exception {
    try {
        Document pdf = (Document) document;
        pdf.open();
        pdf.setPageSize(PageSize.LETTER);

        ServletContext servletContext = (ServletContext) FacesContext.getCurrentInstance().getExternalContext().getContext();
        String logo = servletContext.getRealPath("") + File.separator + "images" + File.separator + "header.gif";

       // pdf.add(Image.getInstance(logo));
        pdf.add(new Paragraph("EMNI", FontFactory.getFont(FontFactory.HELVETICA, 22, Font.BOLD, new Color(0, 0, 0))));
        SimpleDateFormat formato = new SimpleDateFormat("dd/MM/yyyy");

        pdf.add(new Phrase("Fecha: " + formato.format(new Date())));
        pdf.newPage();
    } catch (Exception e) {
        //JsfUtil.addErrorMessage(e, e.getMessage());
    }
}
Run Code Online (Sandbox Code Playgroud)

小智 6

您无法使用dataexporter执行所需操作,您需要将代码更改为:

<h:commandLink actionListener="#{serviciosMB.createPDF}">
    <p:graphicImage value="/images/pdf.png" />
</h:commandLink>
Run Code Online (Sandbox Code Playgroud)

而你的托管bean:

public void createPDF() {
    try { //catch better your exceptions, this is just an example
        FacesContext context = FacesContext.getCurrentInstance();
        Document document = new Document();
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        PdfWriter.getInstance(document, baos);

        if (!document.isOpen()) {
            document.open();
        }

        PdfPTable pdfTable = exportPDFTable();
        document.add(pdfTable);

        //Keep modifying your pdf file (add pages and more)

        document.close();
        String fileName = "PDFFile";

        writePDFToResponse(context.getExternalContext(), baos, fileName);

        context.responseComplete();

    } catch (Exception e) {
        //e.printStackTrace();          
    }
}
Run Code Online (Sandbox Code Playgroud)

exportPDFTable方法:

private PdfPTable exportPDFTable() {
    int numberOfColumns = 1;
    itemOfList item = null;
    PdfPTable pdfTable = new PdfPTable(numberOfColumns);
    pdfTable.setWidthPercentage(100);
    BaseFont helvetica = null;
    try {
        helvetica = BaseFont.createFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.EMBEDDED);
    } catch (Exception e) {
        //font exception
    }
    Font font = new Font(helvetica, 8, Font.NORMAL);
    pdfTable.addCell(new Paragraph("columnName", font));        

    for (int i = 0; i < lstPdfTable.size(); i++) { //lstPdfTable is the list from your datatable. A List of "itemOfList" type
        item = new itemOfList();
        item = lstPdfTable.get(i);
        //pdfTable.addCell(new Paragraph('any_string_field', font));
        pdfTable.addCell(new Paragraph(item.getStringField(), font));           
    }
    return pdfTable;
}
Run Code Online (Sandbox Code Playgroud)

和writePDFToResponse方法是:

private void writePDFToResponse(ExternalContext externalContext, ByteArrayOutputStream baos, String fileName) {
    try {
        externalContext.responseReset();
        externalContext.setResponseContentType("application/pdf");
        externalContext.setResponseHeader("Expires", "0");
        externalContext.setResponseHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0");
        externalContext.setResponseHeader("Pragma", "public");
        externalContext.setResponseHeader("Content-disposition", "attachment;filename=" + fileName + ".pdf");
        externalContext.setResponseContentLength(baos.size());
        OutputStream out = externalContext.getResponseOutputStream();
        baos.writeTo(out);
        externalContext.responseFlushBuffer();
    } catch (Exception e) {
        //e.printStackTrace();
    }
}
Run Code Online (Sandbox Code Playgroud)