当前位置: 首页 > 教程 > JasperReports >

JasperReports 报表字体Font

精华
小牛编辑
143浏览
2023-03-14

报表包含文本元素,每个元素都可以有自己的字体设置。可以使用<textElement> 标记中可用的 <font> 标记指定这些设置。一个报表可以定义多种字体。定义后,它们可以用作整个报表中其他字体定义的默认或基本字体设置。

1 JasperReports 报表字体

报表字体是在报表级别声明的字体设置的集合。设置文本元素的字体属性时,可以在整个报告模板中重复使用报告字体。

报表字体现已弃用。不要使用在文档本身中声明的 <reportFont/> 元素。请改用 <style/> 元素。

2 JasperReports 字体属性

下表总结了 <font> 元素的主要属性:

属性名 描述
fontName 字体名称,可以是物理字体的名称、逻辑字体的名称或已注册的 JasperReports 字体扩展中的字体系列的名称。
size 以磅为单位测量的字体大小。默认为 10。
isBold 指定是否需要粗体的标志。它默认为false。
isItalic 指定是否需要斜体的标志。它默认为false。
isUnderline 指定是否需要下划线文本修饰的标志。它默认为false。
isStrikeThrough 指定是否需要删除线文本修饰的标志。它默认为false。
pdfFontName 将文档导出为 PDF 格式时 iText 库所需的等效 PDF 字体的名称。
pdfEncoding iText 库也需要等效的 PDF 字符编码。
isPdfEmbedded 指定是否应将字体嵌入到文档本身的标志。它默认为false。如果设置为 true,则有助于毫无问题地查看 PDF 文档。

3 JasperReports 字体类型

在 JasperReports 中,字体可以归类为 :

  • 逻辑字体: 自 1.0 版以来 Java 平台已识别的五种字体类型称为逻辑字体。它们是 - Serif、SansSerif、Monospaced、Dialog 和 DialogInput。这些逻辑字体不是安装在系统任何地方的实际字体库。它们只是 Java 运行时识别的字体类型名称。这些必须映射到系统上安装的某些物理字体。

  • 物理字体: 这些字体是实际的字体库,例如由 TrueType 或 PostScript Type 1 字体组成。物理字体可以是 Arial、Time、Helvetica、Courier 或任意数量的其他字体,包括国际字体。

  • 字体扩展: JasperReports 库可以利用在运行时即时注册的字体,通过其内置的字体扩展支持。可以使用字体扩展名向 JasperReports 提供字体系列列表。它们由外观相似的字体组成并支持特定的语言环境。

如上表所述,我们需要在属性fontName 中指定物理字体的名称、逻辑字体的名称或已注册的 JasperReports 字体扩展中的字体系列的名称。

4 JasperReports PDF字体名称

JasperReports 库在将报表导出为 PDF(可移植文档格式)时使用 iText 库。PDF 文件可以在各种平台上查看,并且看起来总是一样的。这部分是因为在这种格式中,有一种特殊的字体处理方式。导出为 PDF 时,fontName属性没有用。属性pdfFontName存在我们需要指定字体设置的地方。

iText 库知道如何处理内置字体和 TTF 文件并识别以下内置字体名称 :

  • Courier
  • Courier-Bold
  • Courier-BoldOblique
  • Courier-Oblique
  • Helvetica
  • Helvetica-Bold
  • Helvetica-BoldOblique
  • Helvetica-Oblique
  • Symbol
  • Times-Roman
  • Times-Bold
  • Times-BoldItalic
  • Times-Italic
  • ZapfDingbats

根据 iText 库的先决条件,要使用字体,我们需要指定以下之一作为字体名称 :

  • 上面列表中的内置字体名称。

  • 可以在磁盘上找到的 TTF(True Type Font)文件的名称。

  • 字体的真实名称,前提是包含该字体的 TTF 文件先前已在 iText 中注册,或者在注册字体时定义了别名。

基于上述先决条件,pdfFontName属性可以包含以下值之一 :

  • 上面列表中内置 PDF 字体的名称。

  • 导出为 PDF 时可在运行时位于磁盘上的 TTF 文件的名称。

  • 注册字体的真实名称。

  • 使用 iText 注册为字体文件的字体的键后缀(net.sf.jasperreports.export.pdf.font之后的部分)。

5 JasperReports 默认字体和继承

每个文本元素从其父元素继承字体和样式属性,而父元素又从其父元素继承这些属性。如果没有为元素定义样式and/or字体,则将应用 <jasperReport/> 根元素中声明的默认样式(and/or字体 - 但现在已弃用)。

在 JasperReports 中定义默认样式或字体不是强制性的。如果没有为给定元素定义字体,引擎会查找继承的字体属性,或者,如果通过这种方式没有找到属性,它会在/ 中查找net.sf.jasperreports.default.font.name属性src/default.jasperreports.properties文件。当没有为文本元素明确定义字体属性或从其父元素继承字体属性时,它的值定义要使用的字体系列的名称。

/src/default.jasperreports.properties文件中定义的主要默认字体属性及其值如下表所示

属性 描述
net.sf.jasperreports.default.font.name=SansSerif 默认字体名称。
net.sf.jasperreports.default.font.size=10 默认字体大小。
net.sf.jasperreports.default.pdf.font.name=Helvetica 默认的 PDF 字体。
net.sf.jasperreports.default.pdf.encoding=Cp1252 默认的 PDF 字符编码。
net.sf.jasperreports.default.pdf.embedded=false 默认情况下不嵌入 PDF 字体。

6 JasperReports 字体的示例

为了演示使用字体和字体属性以获得特定文本外观,让我们编写新的报表模板 (jasper_report_template.jrxml)。JRXML 的内容如下。

<?xml version = "1.0" encoding = "UTF-8"?>

<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 = "jasper_report_template" pageWidth = "595" pageHeight = "842"
              columnWidth = "555" leftMargin = "20" rightMargin = "20" topMargin = "30"
              bottomMargin = "30">

    <title>
        <band height = "682">

            <staticText>
                <reportElement x = "0" y = "50" width = "150" height = "40"/>
                <textElement/>

                <text>
                    <![CDATA[Welcome to xnip.cn!]]>
                </text>
            </staticText>

            <staticText>
                <reportElement x = "160" y = "50" width = "390" height = "40"/>
                <textElement/>

                <text>
                    <![CDATA[<staticText>
           <reportElement x = "0" y = "50" width = "150" height = "40"/>
           <text>Welcome to xnip.cn!</text></staticText>]]>
                </text>
            </staticText>

            <staticText>
                <reportElement x = "0" y = "100" width = "150" height = "40"/>

                <textElement>
                    <font size = "12"/>
                </textElement>

                <text><![CDATA[Welcome to xnip.cn!]]></text>
            </staticText>

            <staticText>
                <reportElement x = "160" y = "100" width = "390" height = "40"/>
                <textElement/>

                <text>
                    <![CDATA[<staticText>
            <reportElement x = "0" y = "100" width = "150" height = "40"/>

            <textElement>
               <font size = "14"/>
            </textElement>

            <text> Welcome to xnip.cn!</text></staticText>]]>
                </text>
            </staticText>

            <staticText>
                <reportElement x = "0" y = "150" width = "150" height = "40"/>

                <textElement>
                    <font fontName = "DejaVu Serif" size = "12" isBold = "false"/>
                </textElement>

                <text><![CDATA[Welcome to xnip.cn!]]></text>
            </staticText>

            <staticText>
                <reportElement x = "160" y = "150" width = "390" height = "40"/>
                <textElement/>

                <text>
                    <![CDATA[<staticText>
            <reportElement x = "0" y = "250" width = "150" height = "40"/>

            <textElement>
               <font fontName = "DejaVu Serif" size = "12" isBold = "false"/>
            </textElement>

            <text>Welcome to xnip.cn!</text></staticText>]]>
                </text>
            </staticText>

            <staticText>
                <reportElement x = "0" y = "200" width = "150" height = "40"/>

                <textElement>
                    <font fontName = "DejaVu Serif" size = "12" isBold = "true"/>
                </textElement>

                <text><![CDATA[Welcome to xnip.cn!]]></text>
            </staticText>

            <staticText>
                <reportElement x = "160" y = "200" width = "390" height = "40"/>
                <textElement/>

                <text>
                    <![CDATA[<staticText>
            <reportElement x = "0" y = "300" width = "150" height = "40"/>

            <textElement>
               <font fontName = "DejaVu Serif" size = "12" isBold = "true"/>
            </textElement>

            <text>Welcome to xnip.cn!</text></staticText>]]>
                </text>
            </staticText>

            <staticText>
                <reportElement x = "0" y = "250" width = "150" height = "40"/>

                <textElement>
                    <font fontName = "Monospaced" size = "12" isItalic = "true"
                          isUnderline = "true" pdfFontName = "Courier-Oblique"/>
                </textElement>

                <text><![CDATA[Welcome to xnip.cn!]]></text>
            </staticText>

            <staticText>
                <reportElement x = "160" y = "250" width = "390" height = "40"/>
                <textElement/>

                <text>
                    <![CDATA[<staticText>
            <reportElement x = "0" y = "350" width = "150" height = "40"/>

            <textElement>
               <font fontName = "Monospaced" size = "12" isItalic = "true"
                  isUnderline = "true" pdfFontName = "Courier-Oblique"/>
            </textElement>

            <text>Welcome to xnip.cn!</text></staticText>]]>
                </text>
            </staticText>

            <staticText>
                <reportElement x = "0" y = "300" width = "150" height = "40"/>

                <textElement>
                    <font fontName = "Monospaced" size = "12" isBold = "true"
                          isStrikeThrough = "true" pdfFontName = "Courier-Bold"/>
                </textElement>
                <text><![CDATA[Welcome to xnip.cn!]]></text>
            </staticText>

            <staticText>
                <reportElement x = "160" y = "300" width = "390" height = "40"/>
                <textElement/>

                <text>
                    <![CDATA[<staticText>
            <reportElement x = "0" y = "400" width = "150" height = "40"/>

            <textElement>
               <font fontName = "Monospaced" size = "12" isBold = "true"
                  isStrikeThrough = "true" pdfFontName = "Courier-Bold"/>
            </textElement>

            <text>Welcome to xnip.cn!</text></staticText>]]>
                </text>
            </staticText>

            <staticText>
                <reportElement x = "0" y = "350" width = "150" height = "40"
                               forecolor = "#FF0000"/>

                <textElement>
                    <font size = "14"/>
                </textElement>

                <text><![CDATA[Welcome to xnip.cn!]]></text>
            </staticText>

            <staticText>
                <reportElement x = "160" y = "350" width = "390" height = "40"/>
                <textElement/>

                <text>
                    <![CDATA[<staticText>
            <reportElement x = "0" y = "450" width = "150" height = "40"
               forecolor = "red"/>

            <textElement><font size = "14"/></textElement>
            <text>Welcome to xnip.cn!</text></staticText>]]>
                </text>
            </staticText>

            <staticText>
                <reportElement x = "0" y = "400" width = "150" height = "40" mode = "Opaque"
                               forecolor = "#00FF00" backcolor = "#FFFF00"/>

                <textElement>
                    <font fontName = "Serif" size = "12" isBold = "true"
                          pdfFontName = "Times-Bold"/>
                </textElement>

                <text><![CDATA[Welcome to xnip.cn!]]></text>
            </staticText>

            <staticText>
                <reportElement x = "160" y = "400" width = "390" height = "40"/>
                <textElement/>

                <text>
                    <![CDATA[<staticText>
            <reportElement x = "0" y = "500" width = "150" height = "40"
               forecolor = "green" backcolor = "#FFFF00" mode = "Opaque"/>

            <textElement>
               <font fontName = "Serif" size = "12" isBold = "true"
                  pdfFontName = "Times-Bold"/>
            </textElement>

            <text>Welcome to xnip.cn!</text></staticText>]]>
                </text>
            </staticText>

            <staticText>
                <reportElement x = "0" y = "450" width = "150" height = "40" mode = "Opaque"
                               forecolor = "#0000FF" backcolor = "#FFDD99"/>

                <textElement textAlignment = "Center" verticalAlignment = "Middle">
                    <font fontName = "SansSerif" size = "12" isBold = "false"
                          isItalic = "true" pdfFontName = "Sans.Slanted" isPdfEmbedded = "true"/>
                </textElement>

                <text><![CDATA[Welcome to xnip.cn!]]></text>
            </staticText>

            <staticText>
                <reportElement x = "160" y = "450" width = "390" height = "40"/>
                <textElement/>

                <text>
                    <![CDATA[<staticText>
            <reportElement x = "0" y = "550" width = "150" height = "90"
               forecolor = "blue" backcolor = "#FFDD99" mode = "Opaque"/>

            <textElement textAlignment = "Center" verticalAlignment = "Middle">
               <font fontName = "SansSerif" size = "12" isBold = "false"
                  pdfFontName = "Sans.Slanted" isPdfEmbedded = "true"/>
            </textElement>

            <text>Welcome to xnip.cn!</text></staticText>]]>
                </text>
            </staticText>

            <staticText>
                <reportElement mode = "Opaque" x = "0" y = "500" width = "150" height = "40"
                               forecolor = "#FF0000" backcolor = "#99DDFF"/>

                <textElement textAlignment = "Right" verticalAlignment = "Bottom">
                    <font fontName = "SansSerif" size = "12" isBold = "true"
                          pdfFontName = "DejaVu Sans Bold" isPdfEmbedded = "true"/>
                </textElement>

                <text><![CDATA[Welcome to xnip.cn!]]></text>
            </staticText>

        </band>
    </title>

</jasperReport>

项目的pom.xml文件如下:

<dependencies>
        <!-- https://mvnrepository.com/artifact/net.sf.jasperreports/jasperreports -->
        <dependency>
            <groupId>net.sf.jasperreports</groupId>
            <artifactId>jasperreports</artifactId>
            <version>6.17.0</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/net.sf.jasperreports/jasperreports-fonts -->
        <dependency>
            <groupId>net.sf.jasperreports</groupId>
            <artifactId>jasperreports-fonts</artifactId>
            <version>6.17.0</version>
        </dependency>
        <dependency>
            <groupId>org.codehaus.groovy</groupId>
            <artifactId>groovy-all</artifactId>
            <version>2.4.7</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.17</version>
        </dependency>
    </dependencies>

先编译jrxml文件为Jasper文件

package cn.xnip;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperCompileManager;

public class JasperReportCompile {

    public static void main(String[] args) {
        String filePath = "D:/idea_codes/jasper_reports/jasper_report_template.jrxml";
        try {
            JasperCompileManager.compileReportToFile(filePath,"d:/jasper_report_template.jasper");
            System.out.println("编译成功");
        } catch (JRException e) {
            e.printStackTrace();
        }
    }
}

编译后在D:/盘根目录下生成jasper_report_template.jasper文件,然后再填充数据:

package cn.xnip;

import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

public class JasperReportFill {

   public static void main(String[] args) {
      String sourceFileName = "d:/jasper_report_template.jasper";

      DataBeanList DataBeanList = new DataBeanList();
      ArrayList<DataBean> dataList = DataBeanList.getDataBeanList();

      JRBeanCollectionDataSource beanColDataSource =
              new JRBeanCollectionDataSource(dataList);
      try {
         JasperFillManager.fillReportToFile(
                 sourceFileName, null, beanColDataSource);
      } catch (JRException e) {
         e.printStackTrace();
      }
   }
}

填充数据完毕后,在D:/盘根目录下生成jasper_report_template.jrprint文件,最后使用预览程序预览:

package cn.xnip;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.view.JasperViewer;

public class JasperReportView {
    public static void main(String[] args) {
        String filePath = "D:/jasper_report_template.jrprint";
        try {
            JasperViewer.viewReport(filePath,false);
        } catch (JRException e) {
            e.printStackTrace();
        }
    }
}

最后输出结果如下:

在这里,我们可以看到“Welcome to xnip.cn”文本以不同的字体格式显示。