Как использовать иврит в моем отчете DynamicJasper?

Мне нужно использовать шрифты иврита в моем отчете DynamicJasper, но все, что я получаю при экспорте отчета, это либо вопросительные знаки ("???????") при экспорте в html, либо просто пустое пространство при экспорте в pdf и иврит при экспорте в xlsx. Код для генерации отчета:

    private DynamicReport buildReport() throws Exception {
    FastReportBuilder drb = new FastReportBuilder();
    drb .setDefaultEncoding("UTF-8")
        .setSubtitle(/*"תאריך ושעת הנפקת הדו\"ח: " +*/ new Date().toString())
        .setPageSizeAndOrientation(Page.Page_A4_Landscape())
        .setPrintColumnNames(true)
        .setIgnorePagination(extension == FileExtensions.HTML || extension == FileExtensions.XLSX || extension == FileExtensions.XLS)
        .setUseFullPageWidth(true)
        .setWhenNoData("אין נתונים עבור דוח זה", null)
        .setDefaultStyles(Styles.defaultStyle, 
                          Styles.defaultStyle, 
                          Styles.defaultStyle, 
                          Styles.defaultStyle);

    final ConditionalStyle regularMeasureStyle = new ConditionalStyle(new StatusLightCondition(new Double(0), new Double(19.5)), Styles.measureStyle);
    final ConditionalStyle toHighMeasureStyle = new ConditionalStyle(new StatusLightCondition(new Double(19.6), new Double(1000000)), Styles.toHighMeasureStyle);
    DJCrosstabMeasure measure = new DJCrosstabMeasure(FlatChickenDeathSingleReport.propertyNames.DEAD_UNITS , Integer.class.getName(),  DJCalculation.SUM , "Dead units");
    List<ConditionalStyle> list = new LinkedList<>();
    list.add(regularMeasureStyle);
    list.add(toHighMeasureStyle);
    measure.setConditionalStyles(list);

    DJCrosstab djcross = new CrosstabBuilder()
            .setHeight(200)
            .setWidth(500)
            .setHeaderStyle(Styles.mainHeaderStyle)
            .setDatasource("sr",DJConstants.DATA_SOURCE_ORIGIN_PARAMETER, DJConstants.DATA_SOURCE_TYPE_COLLECTION)
            .setUseFullWidth(true)
            //.setColorScheme(DJConstants.COLOR_SCHEMA_LIGHT_GREEN)
            .setAutomaticTitle(true)
            .setCellBorder(Border.PEN_2_POINT())
            .addColumn("לול" , FlatChickenDeathSingleReport.propertyNames.COOP_NAME , String.class.getName() , true)
            .addColumn("חדר",FlatChickenDeathSingleReport.propertyNames.ROOM_NAME  ,String.class.getName(),true)
            .setMainHeaderTitle("")

            .addRow("תאריך" , FlatChickenDeathSingleReport.propertyNames.DATE_IN_DATE_OBJECT , Date.class.getName(), true , Styles.dateStyle , null , null)

            .setRowStyles(Styles.colAndRowHeaderStyle, Styles.totalStyle, Styles.totalHeaderStyle)
            .setColumnStyles(Styles.colAndRowHeaderStyle, Styles.totalStyle, Styles.totalHeaderStyle)
            .addMeasure(measure)
            .setCellDimension(17, 25)
            .setColumnHeaderHeight(30)
            .setRowHeaderWidth(80)
            .build();

    drb.addHeaderCrosstab(djcross);


    DynamicReport dr = drb.build();


    params.put("sr", GeneralReport.getChickenDeathSingleReportsFlatList(true));
    return dr;
}

private void produceReport() throws Exception {
    dr = buildReport();
    JRDataSource ds = GeneralReport.getChickenDeathSingleReportDataSource();

    jr = DynamicJasperHelper.generateJasperReport(dr, new ClassicLayoutManager(), params);

    if (ds!=null) {
        jp = JasperFillManager.fillReport(jr, params , ds);
    } else {
        jp = JasperFillManager.fillReport(jr, params);
    }
    if (extension == FileExtensions.XLSX) {
        // TODO turn excel sheet to RTL.
    } else {
        ReportUtils.mirrorLayout(jp);
    }
}

Все стили в классе Styles установлены следующим образом:

arial = новый шрифт (Font.MEDIUM, "Arial Unicode MS", false);

        for (Style style : styles) {
            if (style != null) {
                style.setFont(arial);
            }

        }

я имею Arial Unicode.jar а также DynamicJasper-core-fonts-1.0.jar включен в мой classpath.

Я генерирую отчет: в pdf: JasperExportManager.exportReportToPdfStream(JasperPrint jp, OutputStream os);

в xlsx:

JRXlsxExporter exporter = new JRXlsxExporter();
                    exporter.setExporterInput(new SimpleExporterInput(jasperPrint));
                    exporter.setExporterOutput(new SimpleOutputStreamExporterOutput(os));
                    SimpleXlsxReportConfiguration configuration = new SimpleXlsxReportConfiguration(); 
                    configuration.setDetectCellType(true);
                    configuration.setCollapseRowSpan(false);
                    exporter.setConfiguration(configuration);
                    exporter.exportReport();

в HTML:

HtmlExporter exporter = new HtmlExporter();

    exporter.setExporterInput(new SimpleExporterInput(jasperPrint));
    SimpleHtmlExporterOutput output = new SimpleHtmlExporterOutput(os);
    exporter.setExporterOutput(output);
    exporter.exportReport();

Еще одна проблема, с которой я нашел решение, которое меня не очень устраивает: единственный способ переключить отчет на RTL - это:

public static void mirrorLayout(JasperPrint print) {
    int pageWidth = print.getPageWidth();
    for (Object element : print.getPages()) {
        JRPrintPage page = (JRPrintPage) element;
        mirrorLayout(page.getElements(), pageWidth);
    }
}

метод в https://stackru.com/questions/21553540/how-to-make-a-report-page-direction-to-change-to-rtl, Разве нет встроенной опции DynamicJasper? Кроме того, этот метод стирает крайнюю левую границу столбца.

Может кто-нибудь помочь мне с этими вопросами? Спасибо!

0 ответов

Другие вопросы по тегам