Primefaces DataExporter 设置 Table 列宽

Primefaces DataExporter Set Table Columns Width

我有一个使用 Primefaces DataExporter 导出的 Primefaces DataGrid,但我不知道如何调整列的大小。

我添加了一个预处理器

<p:dataExporter type="pdf" target="tbl" fileName="cars" preProcessor="#{customizedDocumentsView.preProcessPDF}" />

这是我的 bean 中的代码

public void preProcessPDF(Object document) {
        Document pdf = (Document) document;
        pdf.open();
        pdf.setPageSize(PageSize.A4);

        //I need to do something like that
        //PdfPTable table = new PdfPTable(4);
        //float[] columnWidths = new float[] {10f, 20f, 30f, 10f};
        //table.setWidths(columnWidths);
    } 

有什么办法吗?

最近我继承了许多已经存在的 exporters 的项目,并且已经设置了 options 标签,所以我需要找到一个解决方案来保留所有的他们完好无损。

我从这个接受的 answer 中得到了一个想法。

我的解决方案通过 p:dataExporteroptions 标签设置列宽,因此不需要 pre/post 处理。我使用 Primefaces 版本 4.x 及更高版本对其进行了测试。

步骤步骤:

  1. 创建新包 org.primefaces.component.export 在你的项目中。

  2. 来自 Primefaces git 存储库完全复制以下 classes ExporterOptions ,PDFOptions, Exportedfactory and PDFExporter 进入新创建的包。

  3. ExporterOptions中添加 public float[] getColumnWidths();

  4. PDFOptions中添加 float[] columnWidths; 并添加 getter 和 setter.

  5. ExporterFactory修改行 exporter = new PdfExporter();exporter = new CustomPdfExporter();

  6. PDFExporter class 重命名为 CustomPDFExporter 并继续关注 export 方法完全

    public void export(FacesContext context, DataTable table, String filename, boolean pageOnly, boolean selectionOnly, String encodingType,MethodExpression preProcessor, MethodExpression postProcessor, ExporterOptions options) throws IOException
    

从其他 export 方法中删除代码但保留声明。

  1. CustomPDFExporter里面添加2行在ExportPdfTable方法

    protected PdfPTable exportPDFTable(FacesContext context, DataTable table, boolean pageOnly, boolean selectionOnly, String encoding) throws DocumentException {
       int columnsCount = getColumnsCount(table);
       PdfPTable pdfTable = new PdfPTable(columnsCount);
       this.cellFont = FontFactory.getFont(FontFactory.TIMES, encoding);
       this.facetFont = FontFactory.getFont(FontFactory.TIMES, encoding, Font.DEFAULTSIZE, Font.BOLD);
    
        if (this.expOptions != null) {
            applyFacetOptions(this.expOptions);
            applyCellOptions(this.expOptions);
            //line 1
            //sets columns column relative widths to iText PdfTable object
            pdfTable.setWidths(this.expOptions.getColumnWidths());
            //line 2
            //decreases page margins comparing to original 'Primefaces' layout
            pdfTable.setWidthPercentage(100);
        }
    
        //....
    

    }

  2. 现在您已准备好使用托管 bean 并添加 pdf 选项。例如

    pdfOpt = new PDFOptions(); //add getter and setter too
    pdfOpt.setFacetBgColor("#F88017");
    ...
    //if, for example, your PDF table has 4 columns
    //1st column will occupy 10% of table's horizontal width,...3rd - 20%, 4th - 60% 
    float[] columnWidths = new float[]{0.1f, 0.1f, 0.2f, 0.6f};
    pdfOpt.setColumnWidths(columnWidths);
    ...
    
  3. 最后,您的 p:dataExporter 组件应该如下所示

    <p:dataExporter type="pdf" target="tbl" fileName="cars" options="#{customizedDocumentsView.pdfOpt}"/>
    

此解决方案使用 PF showcase 产生以下结果

扩展此解决方案的建议:

Primefaces 导出器使用 iText 版本 2.1.7。旧但仍然强大 API。 例如,在步骤 1 的 ExporterOptions 中,您可以添加

public int[] getColumnWidths();

设置绝对列宽 或者您可以根据项目要求设置任何其他选项。