Primefaces DataExporter Задать Ширину Столбцов Таблицы

у меня есть DataGrid Primefaces, который я экспортирую с помощью DataExporter Primefaces, но я не могу понять, как изменить размер столбцов.

я добавил preporcessor

<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);
    } 

есть ли способ сделать это ?

1 ответов


недавно я унаследовал проект со многими уже существующими экспортеры С уже установленным опции теги, поэтому мне нужно было найти решение, которое сохранит их все в целости.

я получил идею от этого принятого ответ.

мое решение устанавливает ширину столбцов через опции тег p: dataExporter таким образом, нет необходимости в предварительной/пост-обработке. Я протестировал его с помощью Primefaces ver 4.x и вверх.

пошаговая процедура:

  1. создать новый пакет org.primefaces.component.export внутри вашего проекта.

  2. из репозитория Primefaces git полностью скопируйте следующие классы ExporterOptions ,PDFOptions, Exportedfactory и PDFExporter во вновь созданный пакет.

  3. на ExporterOptions добавлять public float[] getColumnWidths();

  4. на PDFOptions добавить float[] columnWidths; и добавьте геттера и сеттера.

  5. на ExporterFactory изменить линию exporter = new PdfExporter(); to exporter = new CustomPdfExporter();

  6. переименовать PDFExporter класс CustomPDFExporter и оставить только следующее экспорт способ полностью

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

удалить код из других экспорт методы, но сохранить объявления.

  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. теперь вы готовы перейти управляемый Боб и добавить опцию 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 производит следующий результат enter image description here

предложение для расширения этого решения:

экспортер Primefaces использует iText ver 2.1.7. со старым, но все еще мощным API. Например, в ExporterOptions в шаге 1. вы можете добавить

public int[] getColumnWidths();

установить абсолютное ширины столбцов или вы можете установить любой другой вариант, управляемый вашими требованиями проекта.