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 и вверх.
пошаговая процедура:
создать новый пакет
org.primefaces.component.export
внутри вашего проекта.из репозитория Primefaces git полностью скопируйте следующие классы ExporterOptions ,PDFOptions, Exportedfactory и PDFExporter во вновь созданный пакет.
на ExporterOptions добавлять
public float[] getColumnWidths();
на PDFOptions добавить
float[] columnWidths;
и добавьте геттера и сеттера.на ExporterFactory изменить линию
exporter = new PdfExporter();
toexporter = new CustomPdfExporter();
-
переименовать 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
удалить код из других экспорт методы, но сохранить объявления.
-
внутри 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); } //....
}
-
теперь вы готовы перейти управляемый Боб и добавить опцию 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); ...
-
наконец-то
p:dataExporter
компонент должен выглядеть так<p:dataExporter type="pdf" target="tbl" fileName="cars" options="#{customizedDocumentsView.pdfOpt}"/>
это решение используя PF showcase производит следующий результат
предложение для расширения этого решения:
экспортер Primefaces использует iText ver 2.1.7. со старым, но все еще мощным API. Например, в ExporterOptions в шаге 1. вы можете добавить
public int[] getColumnWidths();
установить абсолютное ширины столбцов или вы можете установить любой другой вариант, управляемый вашими требованиями проекта.