图表和自定义字体

3
我有一些使用自定义字体(Dejavu Serif)的JasperReports报表,在开发和生产环境中都可以正常工作。今天我向该报表添加了一些图表,并将所有字体设置配置为Dejavu Serif。图表本身可以正常工作,但我看不到任何标签,所以我认为问题出在自定义字体上。我找到了一个post,但无法理解他们如何解决这个问题。
更新#1: 因此,我实现了Customizer类,该类配置标签的字体:
public class CustomFontCategoryChartCustomizer implements JRChartCustomizer  {

    /**
     * 
     */
    @Override
    public void customize(JFreeChart chart, JRChart jasperChart) {
        CategoryPlot plot = chart.getCategoryPlot();
        Font customFont = new Font("DejaVu Serif", Font.BOLD, 12);

        // Works fine
        plot.getDomainAxis().setTickLabelFont(customFont);
        plot.getRangeAxis().setTickLabelFont(customFont);
        plot.getRangeAxis().setUpperMargin(0.5);
        // Doesn't work
        LegendItemCollection legends = plot.getLegendItems();
        for (int i = 0; i < legends.getItemCount(); i++) {
            legends.get(i).setLabelFont(customFont);
        }
        plot.getLegendItems().addAll(legends);
        // Doesn't work
        LegendItemCollection legends = plot.getLegendItems();
        for (int i = 0; i < legends.getItemCount(); i++) {
            plot.getLegendItems().get(i).setLabelFont(customFont);
        }
    }
}

除了图例标签之外,一切都很好。无法使用自定义字体使其正常工作。需要帮助吗?


通过此链接查看:http://stackoverflow.com/questions/23179664/how-to-remove-unnecessary-wrapping-in-pdf-generated-using-jasperreports-jrxml - Vishal Zanzrukia
@VishalZanzrukia不明白它如何有帮助?我的问题是某些图表无法看到自定义字体,在其他报告中字体完美工作。 - nKognito
您可以使用自定义类添加字体。它在图表中可以完美地工作。 - user1791574
@user1791574 在标签方面运行良好,但无法更改图例的标签... - nKognito
2个回答

0
没人回答,那我就自己来吧... 为了在JasperReports的图表中使用自定义字体,您应该按照以下步骤操作:
  1. 重载JRChartCustomizer的customize方法,如下所示:

    public class CustomFontCategoryChartCustomizer implements JRChartCustomizer  {
        @Override
        public void customize(JFreeChart chart, JRChart jasperChart) {
            Font customFont = new Font("DejaVu Serif", Font.PLAIN, 9);
            CategoryPlot plot = chart.getCategoryPlot();
    
            // 设置图例字体        
            chart.getLegend().setItemFont(customFont);
            // 设置分类标签字体
            plot.getDomainAxis().setTickLabelFont(customFont);
            // 设置数值标签字体 
            plot.getRangeAxis().setTickLabelFont(customFont);
        }
    }
    
  2. 将iReport引用添加到您的JRChartCustomizer实现或jar文件中

  3. 在iReport的图表对象中配置Customizer Class选项,使用适当的类名。 在我的情况下是CustomFontCategoryChartCustomizer

就是这样。


0
public class CustomFontCategoryChartCustomizer implements JRChartCustomizer  {
@Override
public void customize(JFreeChart chart, JRChart jasperChart) {
    Font customFont = getOpenSansFont("OpenSans-Regular.ttf")
    CategoryPlot plot = chart.getCategoryPlot();

    // Set legend's font        
    chart.getLegend().setItemFont(customFont);
    // Set categories label's font
    plot.getDomainAxis().setTickLabelFont(customFont);
    // Set amounts label's font 
    plot.getRangeAxis().setTickLabelFont(customFont);
  }

 private Font getOpenSansFont(String ttfFont) {
    try {
        String openSansAbsolutePath = "absolute/path/to/font"
        Font font = Font.createFont(Font.TRUETYPE_FONT, new File(openSansAbsolutePath));
        return font.deriveFont(10f);
    } catch (IOException | FontFormatException e) {
        println "Exception occur during create font." + e
    }
  }
}

你需要将ttf字体放在应用程序类路径中。这对我来说完美地运作了。我在我的一个项目中使用过它。

编程愉快。


谢谢您的回复。我会尝试一下。我找到了很多文章,可以直接从资源中获取字体。在本地环境下一切正常,但是在生产环境中文本却不可见。没有任何异常情况。真奇怪! - nKognito
@nKognito 你试过这个吗? - user1791574

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接