Prise en charge Unicode

Dans JasperReports, travailler avec des textes nécessite des outils dédiés pour traiter à la fois les représentations de caractères et les propriétés de mise en forme du texte. Tout texte peut être considéré comme une séquence de caractères avec une structure de représentation particulière. L'apparence du texte comprend à la fois les paramètres de mise en page (et de paragraphe) et de police. Mais si dans la plupart des cas, la mise en page du texte reste invariante, les paramètres de police peuvent changer lors de l'exécution du rapport dans des paramètres régionaux différents.

Nous savons que différentes langues ont besoin de jeux de caractères différents en ce qui concerne la représentation de caractères spécifiques. Par conséquent, travailler avec des textes signifie travailler avec des polices. Cependant, une discussion détaillée sur l'utilisation des polices dans JasperReports est disponible dans le chapitre Polices de rapport .

L'une des principales caractéristiques concernant le contenu textuel d'un rapport donné est la possibilité de l'internationaliser. Cela signifie que nous pouvons exécuter le rapport dans différents environnements localisés, en utilisant différentes langues et d'autres paramètres de localisation sans aucune modification codée en dur. Le codage des caractères est une caractéristique importante lorsqu'un rapport est destiné à être internationalisé.

Encodage de caractère

Un caractère est la plus petite unité d'écriture véhiculant une information significative. C'est un concept abstrait, un personnage n'a pas d'apparence visuelle. «Majuscule Latin A» est un caractère différent de «Latin minuscule a» et de «A cyrillique majuscule» et «Alpha grec majuscule».

Une représentation visuelle d'un personnage est connue sous le nom de glyph. Un certain ensemble de glyphes est appelé unfont. «Latin A majuscule», «cyrillique A majuscule» et «alpha grec majuscule» peuvent avoir des glyphes identiques, mais ce sont des caractères différents. En même temps, les glyphes pour "majuscule Latin A" peuvent être très différents dans les chancelleries Times New Roman, Gill Sans et Poetica en italique, mais ils représentent toujours le même caractère.

L'ensemble des caractères disponibles est appelé un répertoire de caractères . L'emplacement (index) d'un caractère donné dans un répertoire est connu comme sa position de code, ou point de code. La méthode de représentation numérique d'un point de code dans un répertoire donné est appeléecharacter encoding.

Les codages sont normalement exprimés en octets. Un octet est un groupe de huit chiffres binaires, c'est-à-dire huit uns et zéros. Un octet peut exprimer une plage numérique entre 0 et 255, ou entre 0x00 et 0xFF, pour utiliser la notation hexadécimale.

Unicode

Un Unicode est un répertoire de caractères qui contient la plupart des caractères utilisés dans les langues du monde. Il peut accueillir des millions de caractères et en contient déjà des centaines de milliers. Unicode est divisé en "plans" de 64K caractères. Le seul utilisé dans la plupart des cas est le premier plan, connu sous le nom de plan multilingue de base, ou BMP.

UTF-8 est l'encodage recommandé. Il utilise un nombre variable d'octets pour représenter différents caractères.

Dans un fichier JRXML, l'attribut de codage est spécifié dans l'en-tête. Il est utilisé au moment de la compilation du rapport pour décoder le contenu XML. Par exemple, si le rapport contient uniquement des mots français et des caractères tels que ç, é, â, alors le codage ISO-8859-1 (aka Latin-1) est suffisant -

<?xml version = "1.0" encoding = "ISO-8859-1"?>

Comme vu ci-dessus, nous pouvons idéalement choisir l'ajustement du codage au jeu de caractères minimal, qui peut représenter correctement tous les caractères du document. Mais dans le cas de documents multilingues (c'est-à-dire des documents contenant des mots épelés en plusieurs langues), il faut choisir l'encodage adapté au jeu de caractères minimal, capable de représenter correctement tous les caractères du document, même s'ils appartiennent à des langues différentes. L'un des encodages de caractères capables de gérer des documents multilingues est leUTF-8, utilisée comme valeur de codage par défaut par JasperReports.

Les textes sont généralement conservés dans des fichiers de regroupement de ressources plutôt que dans le document lors de l'internationalisation. Ainsi, il y a des cas où le JRXML lui-même semble complètement compatible ASCII, mais les rapports générés lors de l'exécution contiennent des textes illisibles avec ASCII. Par conséquent, pour un certain type de formats d'exportation de documents (tels que CSV, HTML, XHTML, XML et texte), il faut également connaître le codage du document généré. Différentes langues sont prises en charge par différents encodages de caractères. Ainsi, à chaque fois, nous devons exécuter un rapport dans un environnement localisé. De plus, nous devons savoir quel est le codage de caractères le plus approprié pour la langue du document généré. Dans ce cas, la propriété de codage définie dans le fichier JRXML lui-même peut ne pas être plus utile.

Pour résoudre ce genre de problèmes, nous pouvons utiliser une propriété de client d'exportation appelée net.sf.jasperreports.export.character.encoding . Cette propriété personnalisée d'exportation est par défaut UTF-8 et est présente dans JasperReports.

Cette valeur par défaut est définie dans le fichier default.jasperreports.properties . Pour des options plus spécifiques au moment de l'exportation, le paramètre d'exportation CHARACTER_ENCODING est également disponible.

Exemple

Pour démontrer l'utilisation du support Unicode dans Jasperreports, écrivons un nouveau modèle de rapport (jasper_report_template.jrxml). Save it to C:\tools\jasperreports-5.0.1\testannuaire. Ici, nous afficherons un texte dans différentes langues en utilisant les caractères Unicode (\ uXXXX). Tout caractère encodé avec UTF-8 peut être représenté en utilisant uniquement son code hexadécimal à 4 chiffres. Par exemple, la lettre grecque Γ peut être écrite comme \ u0393. Lorsqu'une telle notation est rencontrée, le moteur demande la représentation de caractère appropriée dans le jeu de caractères, et seul ce caractère particulier sera imprimé. Le contenu du JRXML est comme ci-dessous -

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

   <parameter name = "GreekText" class = "java.lang.String" isForPrompting = "false">
      <defaultValueExpression><![CDATA["\u0394\u03B5\u03BD "+
         "\u03BA\u03B1\u03C4\u03B1\u03BB\u03B1\u03B2\u03B1\u03AF"+
         "\u03BD\u03C9 \u0395\u03BB\u03BB\u03B7\u03BD\u03B9\u03BA\u03AC"]]>
      </defaultValueExpression>
   </parameter>
   
   <parameter name = "CyrillicText" class = "java.lang.String" isForPrompting = "false">
      <defaultValueExpression><![CDATA["\u042F \u043D\u0435 "+
         "\u043C\u043E\u0433\u0443 \u043F\u043E\u043D\u044F\u0442\u044C "+
         "\u0433\u0440\u0435\u0447\u0435\u0441\u043A\u0438\u0439"]]>
      </defaultValueExpression>
   </parameter>

   <parameter name = "ArabicText" class = "java.lang.String" isForPrompting = "false">
      <defaultValueExpression><![CDATA["\u0627\u0646\u0646\u0649 \u0644\u0627 "+
         "\u0627\u0641\u0647\u0645 \u0627\u0644\u0644\u063A\u0629 "+
         "\u0627\u0644\u0639\u0631\u0628\u064A\u0629"]]>
      </defaultValueExpression>
   </parameter>
   
   <parameter name = "HebrewText" class = "java.lang.String" isForPrompting = "false">
      <defaultValueExpression><![CDATA["\u05D0\u05E0\u05D9 \u05DC\u05D0 "+
         "\u05DE\u05D1\u05D9\u05DF \u05E2\u05D1\u05E8\u05D9\u05EA"]]>
      </defaultValueExpression>
   </parameter>
   
   <title>
      <band height = "782">
         
         <textField>
            <reportElement x = "0" y = "50" width = "200" height = "60"/>
            
            <textElement>
               <font fontName = "DejaVu Sans" size = "14"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$P{GreekText} + "\n" + $P{CyrillicText}]]>
            </textFieldExpression>
         </textField>
         
         <staticText>
            <reportElement x = "210" y = "50" width = "340" height = "60"/>
            <textElement/>
            
            <text>
               <![CDATA["GreekText and CyrillicText"]]>
            </text>
         </staticText>
         
         <textField>
            <reportElement x = "0" y = "120" width = "200" height = "60"/>
            
            <textElement>
               <font fontName = "DejaVu Sans" size = "14" isBold = "true"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$P{GreekText} + "\n" + $P{CyrillicText}]]>
            </textFieldExpression>
				
         </textField>
         
         <staticText>
            <reportElement x = "210" y = "120" width = "340" height = "60"/>
            <textElement/>
            <text><![CDATA["GreekText and CyrillicText"]]></text>
         </staticText>
         
         <textField>
            <reportElement x = "0" y = "190" width = "200" height = "60"/>
            
            <textElement>
               <font fontName = "DejaVu Sans" size = "14" isItalic = "true" 
                  isUnderline = "true"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$P{GreekText} + "\n" + $P{CyrillicText}]]>
            </textFieldExpression>
				
         </textField>
         
         <staticText>
            <reportElement x = "210" y = "190" width = "340" height = "60"/>
            <textElement/>
            <text><![CDATA["GreekText and CyrillicText"]]></text>
         </staticText>
         
         <textField>
            <reportElement x = "0" y = "260" width = "200" height = "60"/>
            
            <textElement>
               <font fontName = "DejaVu Sans" size = "14" isBold = "true" 
                  isItalic = "true" isUnderline = "true"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$P{GreekText} + "\n" + $P{CyrillicText}]]>
            </textFieldExpression>
				
         </textField>
         
         <staticText>
            <reportElement x = "210" y = "260" width = "340" height = "60"/>
            <textElement/>
            <text><![CDATA["GreekText and CyrillicText"]]></text>
         </staticText>

         <textField>
            <reportElement x = "0" y = "330" width = "200" height = "60"/>
            
            <textElement textAlignment = "Right">
               <font fontName="DejaVu Sans" size = "22"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$P{ArabicText}]]>
            </textFieldExpression>
				
         </textField>
         
         <textField>
            <reportElement x = "210" y = "330" width = "340" height = "60"/>
            
            <textElement textAlignment = "Right">
               <font fontName = "DejaVu Sans" size = "22"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$P{HebrewText}]]>
            </textFieldExpression>
				
         </textField>
      
      </band>
   </title>
	
</jasperReport>

Dans le fichier ci-dessus, nous pouvons voir la présence de l'encodage UTF-8. Les morceaux de texte Unicode localisés sont également stockés dans les paramètres du document.

Le code java pour remplir et générer le rapport est le suivant. Sauvegardons ce fichierJasperUnicodeReportFill.java dans le répertoire C: \ tools \ jasperreports-5.0.1 \ test \ src \ com \ tutorialspoint.

package com.tutorialspoint;

import net.sf.jasperreports.engine.JREmptyDataSource;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperFillManager;

public class JasperUnicodeReportFill {
   public static void main(String[] args) {
      String sourceFileName ="C://tools/jasperreports-5.0.1/test/" + 
         "jasper_report_template.jasper";

      try {
         JasperFillManager.fillReportToFile(sourceFileName, null, 
            new JREmptyDataSource());
      } catch (JRException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
      }

   }
}

Ici, nous utilisons une instance de JREmptyDataSource lors du remplissage des rapports pour simuler une source de données avec un enregistrement, mais avec tous les champs de cet enregistrement unique étant null .

Génération de rapports

Nous compilerons et exécuterons le fichier ci-dessus en utilisant notre processus de construction ANT normal. Le contenu du fichier build.xml (enregistré sous le répertoire C: \ tools \ jasperreports-5.0.1 \ test) est comme ci-dessous.

Le fichier d'importation - baseBuild.xml est choisi dans le chapitre Configuration de l'environnement et doit être placé dans le même répertoire que build.xml.

<?xml version = "1.0" encoding = "UTF-8"?>
<project name = "JasperReportTest" default = "viewFillReport" basedir = ".">
   <import file = "baseBuild.xml" />
   
   <target name = "viewFillReport" depends = "compile,compilereportdesing,run"
      description = "Launches the report viewer to preview the report 
      stored in the .JRprint file.">
      
      <java classname = "net.sf.jasperreports.view.JasperViewer" fork = "true">
         <arg value = "-F${file.name}.JRprint" />
         <classpath refid = "classpath" />
      </java>
		
   </target>
   
   <target name = "compilereportdesing" description = "Compiles the JXML file and
      produces the .jasper file.">
      
      <taskdef name = "jrc" classname = "net.sf.jasperreports.ant.JRAntCompileTask">
         <classpath refid = "classpath" />
      </taskdef>
      
      <jrc destdir = ".">
         <src>
            <fileset dir = ".">
               <include name = "*.jrxml" />
            </fileset>
         </src>
         <classpath refid = "classpath" />
      </jrc>

   </target>
	
</project>

Ensuite, ouvrons la fenêtre de ligne de commande et allons dans le répertoire où build.xml est placé. Enfin, exécutez la commandeant -Dmain-class=com.tutorialspoint.JasperUnicodeReportFill (viewFullReport est la cible par défaut) comme suit -

C:\tools\jasperreports-5.0.1\test>ant  -Dmain-class=com.tutorialspoint.JasperUnicodeReportFill
Buildfile: C:\tools\jasperreports-5.0.1\test\build.xml

clean-sample:
   [delete] Deleting directory C:\tools\jasperreports-5.0.1\test\classes
   [delete] Deleting: C:\tools\jasperreports-5.0.1\test\jasper_report_template.jasper
   [delete] Deleting: C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrprint

compile:
   [mkdir] Created dir: C:\tools\jasperreports-5.0.1\test\classes
   [javac] C:\tools\jasperreports-5.0.1\test\baseBuild.xml:28:
   warning: 'includeantruntime' was not set, defaulting t
   [javac] Compiling 1 source file to C:\tools\jasperreports-5.0.1\test\classes

compilereportdesing:
   [jrc] Compiling 1 report design files.
   [jrc] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.engine.xml.JRXmlDigesterFactory).
   [jrc] log4j:WARN Please initialize the log4j system properly.
   [jrc] log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
   [jrc] File : C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrxml ... OK.

run:
   [echo] Runnin class : com.tutorialspoint.JasperUnicodeReportFill
   [java] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.extensions.ExtensionsEnvironment).
   [java] log4j:WARN Please initialize the log4j system properly.

viewFillReport:
   [java] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.extensions.ExtensionsEnvironment).
   [java] log4j:WARN Please initialize the log4j system properly.

BUILD SUCCESSFUL
Total time: 4 minutes 1 second

À la suite de la compilation ci-dessus, une fenêtre JasperViewer s'ouvre comme indiqué dans l'écran ci-dessous -

Ici, nous pouvons voir que le texte affiché est dans différentes langues. Nous voyons également que les langues sont regroupées sur la même page et également mélangées dans le même élément de texte.