Как использовать иврит в моем отчете 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? Кроме того, этот метод стирает крайнюю левую границу столбца.
Может кто-нибудь помочь мне с этими вопросами? Спасибо!