如何动态更改字体名称?

6
我正在使用Jasper jar在我的J2EE项目中生成报告。我能够成功地生成PDF而没有任何问题。然而,我希望所有PDF的字体名称都可以根据我们在一个地方配置的设置来动态更改。
我知道有一种叫做条件样式的方法可以实现这一点。但是,由于我有数百个字体,不可能在每个地方都进行条件样式设计。这将使报告更糟糕。
我正在寻找一个适合的解决方案,可以帮助我在jasper PDF上动态更改字体。

条件样式对于这种情况是特殊的。您无需重新编译模板即可使用新更改的样式。 - Alex K
2个回答

6
我能想到的最简单的方法是在报表中使用默认样式,并在填充报表之前通过Java更改其字体名称。
示例:
在jrxml中设置一个样式(我将使用默认样式),因为这样我不需要将其分配给textField,而且从JasperReport对象获取更快。
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="reputation" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="a88bd694-4f90-41fc-84d0-002b90b2d73e">
    .....
   <style name="myStyle" isDefault="true" fontName="DejaVu Sans"/>
    ....
</jasperReport>

在Java中加载您的报告(jrxml),更改默认样式字体名称,然后填充报告。
JasperReport report = JasperCompileManager.compileReport("jmyReport.jrxml");
report.getDefaultStyle().setFontName("NewFontName");
JasperPrint jasperPrint = JasperFillManager.fillReport(report, paramMap,datasource);

请注意,在客户端的pdf导出中正确呈现所有字体,您需要在Font Extensions!中添加所有字体。您还可以使用非默认样式,此时您需要将其分配给textField并通过比较JRStyle#getName()JRStyle[] styles = report.getStyles();中找到它。

感谢您的输入。 report.getDefaultStyle().setFontName("NewFontName"); 我可以在这里分配哪些字体名称,您能给一些例子吗? - Srinath Mahe
@SrinathMahe 字体的名称,例如“SansSerif”,“DejaVu Sans”,“Arial”等。但是请注意,如果您想在PDF中正确呈现它,您需要字体扩展。在开始使用用户可能未安装在计算机上的字体生成PDF之前,您需要仔细研究这意味着什么。 - Petter Friberg

0
report.getDefaultStyle().setFontName("NewFontName");

如果使用 jasperreports-fonts-6.10.0.jar"NewFontName" 是字体族名称(例如:sans-serif),它在 jasperreports_extension.properties 中声明,是吗?
例如:
net.sf.jasperreports.extension.simple.font.families.sans-serif=fonts/sans-serif.xml

我找到了正确的方法: "NewFontName" 是在 fonts.xml 内字体扩展(jar)中设置的字体名称。 例如:report.getDefaultStyle().setFontName("Helvetica"); 而 fonts.xml 中有 Helvetica: <fontFamily name="Helvetica"> <normal><![CDATA[fonts/Helvetica/Helvetica.ttf]]></normal> <pdfEncoding><![CDATA[Identity-H]]></pdfEncoding> <pdfEmbedded><![CDATA[true]]></pdfEmbedded> <exportFonts /> </fontFamily> - hungncv

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