gpt4 book ai didi

Primefaces DataExporter 设置表格列宽

转载 作者:行者123 更新时间:2023-12-04 15:42:29 29 4
gpt4 key购买 nike

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

我添加了一个预处理器

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

有没有办法做到这一点?

最佳答案

最近,我继承了许多已经存在的导出器的项目,这些导出器已经设置了选项标签,所以我需要找到使所有这些都保持完整的解决方案。

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

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

分步程序:

  • 创建新包org.primefaces.component.export在您的项目中。
  • 从 Primefaces git 存储库完全复制以下类
    ExporterOptions , PDFOptions , ExportedfactoryPDFExporter
    到新创建的包中。
  • 在 ExporterOptions 添加public float[] getColumnWidths();
  • 在 PDFOptions 添加float[] columnWidths;并添加 getter 和 setter。
  • 在 ExporterFactory 中修改行exporter = new PdfExporter();exporter = 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 中,在 ExportPdfTable 方法中添加 2 行
    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);
    }

    //....

    }
  • 现在您已准备好使用托管 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);
    ...
  • 最后你的 p:dataExporter组件应该是这样的
    <p:dataExporter type="pdf" target="tbl" fileName="cars" options="#{customizedDocumentsView.pdfOpt}"/>

  • 此解决方案使用 PF showcase产生以下结果
    enter image description here

    扩展此解决方案的建议:

    Primefaces 导出器使用 iText 版本 2.1.7。使用旧但仍然强大的 API。
    例如,在第 1 步的 ExporterOptions 中,您可以添加
    public int[] getColumnWidths();

    设置 绝对列宽
    或者您可以设置由您的项目要求驱动的任何其他选项。

    关于Primefaces DataExporter 设置表格列宽,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32743148/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com