Guide de dépannage des problèmes de Font Aliasing / Font Subsetting / Font Embedding
Introduction
S'APPLIQUE À :
Oracle Reports Developer - Version 9.0.2.0 et ultérieures
Les informations de ce document s'appliquent à toutes les plateformes.
***Pertinence vérifiée le 2 juillet 2013***
Objectif
Ce document donne quelques conseils et astuces pour résoudre les problèmes de Font Aliasing (substitution de polices), de Font Subsetting (sous-ensembles de polices) et de Font Embedding (incorporation de polices).
Remarque : cette note porte sur un environnement "Postscript Printer" (informations de métrique des polices contenues dans les fichiers AFM).
Oracle Reports 11g Release 1 (11.1.1) utilise un nouveau modèle de polices qui prend en charge les types de polices TTF et TTC sur les plateformes UNIX.
Ce document ne traite pas de ce "nouveau modèle de polices"
http://docs.oracle.com/cd/E12839_01/bi.1111/b32121/pbr_xplat002.htm
L'emplacement de certains fichiers a changé en version 11g. Pour plus de détails, consultez le document :
Doc ID 1083666.1 Location Of Different Reports Configuration Files in Fusion Middleware Forms and Reports 11.1.1.1 and 11.1.1.2 Installations
Pourquoi le Font Aliasing?
Pour pouvoir mettre en forme le résultat, Reports DOIT avoir accès aux informations de métrique des polices (fichiers AFM dans un environnement "Postscript Printer").
Si les informations "Font Metric" ne sont pas disponibles pour une police utilisée dans un rapport, Reports remplace cette police par un "alias", c'est-à-dire une autre police pour laquelle ces informations sont disponibles.
Le fichier uifont.ali peut servir à donner des "directives" de substitution des polices.
S'il n'existe aucune directive pour une police, ou si les directives ne peuvent pas être utilisées, Oracle Reports cherche la police la plus proche dans le même jeu de caractères pour la remplacer.
Ce problème peut survenir lorsque vous développez vos rapports sur un type de plateforme (Windows) et que vous les déployez sur un autre (UNIX).
Pour plus de détails sur la gestion des polices dans Reports :
Oracle Application Server Reports Services Publishing Reports to the Web 10g Release 2 (10.1.2)
B14048-02
4 Managing Fonts in Oracle Reports
Valider les fichiers utilisés par le Font Aliasing
La première étape du débogage d'un problème de Font Aliasing consiste à vérifier les fichiers utilisés par Reports :
uifont.ali / uiprint.txt / fichiers PPD / fichiers AFM
Des erreurs dans ces fichiers peuvent perturber le Font Aliasing sans produire aucun message d'erreur.
Valider le fichier uifont.ali
Un utilitaire est fourni dans le répertoire /bin pour vérifier le fichier uifont.ali :
UNIX : mfontchk90 (Reports 9.0.x), mfontchk (Reports 10.1.2.x / 11.1.1.x)
Windows : fnchk90 (Reports 9.0.x), fnchk (Reports 10.1.2.x / 11.1.1.x)
Si vous appelez cet utilitaire sans paramètre, c'est le fichier uifont.ali "standard" qui est validé.
Exemple sous UNIX :
mfontchk
Parsing font alias file "/oracle/oas1012/midtier/guicommon/tk/admin/uifont.ali"
Successfully parsed font alias file
Exemple d'erreur :
>mfontchk
Parsing font alias file "/oracle/oas1012/midtier/guicommon/tk/admin/uifont.ali"
Courier New = cour.ttf
^
Error at line 279: Invalid font specification
Parse of font alias file failed
Dans cet exemple, le nom de police Courier New doit être placé entre guillemets :
"Courier New" = cour.ttf
Vérifier les fichiers AFM / PPD / uiprint.txt / uifont.ali
Ces fichiers ont pu être modifiés sous Windows puis transférés sous UNIX. S'ils ont été transférés en mode binaire, certains peuvent subsister dans ces fichiers et empêcher le Font Aliasing.
Pour vérifier s'il en reste, utilisez l'utilitaire UNIX 'od' avec l'option -a :
(Selon la plateforme, la commande peut être od -a ou od -t a )
cd $ORACLE_HOME/guicommon/tk/admin/AFM
od -a * | grep -i cr
cd $ORACLE_HOME/guicommon/tk/admin/PPD
od -a * | grep -i cr
cd $ORACLE_HOME/guicommon/tk/admin
od -a uiprint.txt | grep -i cr
cd $ORACLE_HOME/guicommon/tk/admin
od -a uifont.ali | grep -i cr
La commande "od -a * | grep -i cr" ne devrait retourner aucune ligne. Si elle en retourne ("od -a * | grep -i cr "), vous pouvez utiliser un script comme celui de l'exemple ci-dessous pour trouver le ou les fichiers qui contiennent les .
#!/bin/sh
for fic in `ls *`
do
(od -a $fic | grep -i cr) && echo "File containing a Carriage Return: " $fic
done
Remarque : les commandes ci-dessus s'appliquent à Reports 10.1.2. Pour Reports 9.0.2 / 9.0.4, remplacez /guicommon/tk par /guicommon9/tk90.
Polices disponibles dans l'environnement "Postscript Printer"
Dans le fichier PPD, les fichiers AFM associés au PPD sont énumérés sous :
*% Font Information =====================
Par exemple :
*% Font Information =====================
*DefaultFont: Courier
*Font Courier: Standard "(001.004)" Standard ROM
*Font Courier-Bold: Standard "(001.001)" Standard ROM
*Font Courier-BoldOblique: Standard "(001.001)" Standard ROM
*Font Courier-Oblique: Standard "(001.001)" Standard ROM
*Font Helvetica: Standard "(001.001)" Standard ROM
*Font Helvetica-Bold: Standard "(001.001)" Standard ROM
*Font Helvetica-BoldOblique: Standard "(001.001)" Standard ROM
*Font Helvetica-Oblique: Standard "(001.001)" Standard ROM
*Font Symbol: Special "(001.001)" Special ROM
*Font Times-Bold: Standard "(001.001)" Standard ROM
*Font Times-BoldItalic: Standard "(001.001)" Standard ROM
*Font Times-Italic: Standard "(001.001)" Standard ROM
*Font Times-Roman: Standard "(001.001)" Standard ROM
Les fichiers AFM doivent se trouver dans le répertoire AFM (/guicommon/tk/admin/AFM par défaut), sinon rwrun.sh retourne un message d'avertissement.
Par exemple :
Supposons que la ligne suivante ait été ajoutée au fichier PPD :
*Font NotExist: Standard "(V.2)" Standard ROM
Comme le fichier NotExist n'existe pas dans le répertoire /guicommon/tk/admin/AFM, le message suivant s'affiche au lancement de rwrun.sh :
Can't open AFM file(s):
NotExist
Le nom de police que Reports utilise pour un fichier AFM est celui indiqué dans l'attribut "FamilyName".
Par exemple :
FamilyName Helvetica
Créer un rapport très simple pour déboguer le Font Aliasing
Il est toujours plus facile de travailler avec un rapport qui n'utilise qu'une seule police. Pour déboguer plus facilement les problèmes de Font Aliasing, créez pour l'occasion un nouveau rapport simple qui comporte :
- aucune requête SQL;
- un simple texte boilerplate dans le Paper Layout;
- la police à tester appliquée à ce texte boilerplate.
Utiliser votre environnement "privé" pour les tests
Vous pouvez faire vos tests avec des fichiers AFM / PPD / uifont.ali et uiprint.txt "privés", plutôt qu'avec les fichiers de l'emplacement par défaut, $ORACLE_HOME/guicommon/tk/admin.
Vous pouvez modifier n'importe quel fichier "privé" sans aucun impact sur le Reports Server.
Répertoires et variables d'environnement à utiliser pour créer un "environnement privé" :
Reports 9.0.x
$ORACLE_HOME /guicommon9/tk90
Emplacement des fichiers PPD : TK90_PPD
Emplacement des fichiers AFM : TK90_AFM
Emplacement des fichiers HPD : TK90_HPD
Emplacement des fichiers TFM : TK90_TFM
Emplacement de uifont.ali : TK90_FONTALIAS
Emplacement de uiprint.txt : TK90_UNKNOWN
Reports 10.1.2.x / 11.1.1.x
$ORACLE_HOME/guicommon/tk
Emplacement des fichiers PPD : TK_PPD
Emplacement des fichiers AFM : TK_AFM
Emplacement des fichiers HPD : TK_HPD
Emplacement des fichiers TFM : TK_TFM
Emplacement de uifont.ali : TK_FONTALIAS
Emplacement de uiprint.txt : TK_UNKNOWN
Remarque : ces variables ne peuvent être utilisées que sur les plateformes UNIX. Sous Windows, les répertoires PPD/AFM/HPD/TFM et le fichier uiprint.txt n'existent pas. Pour utiliser sous Windows un autre fichier uifont.ali que celui par défaut, utilisez la variable UI au lieu de TK_FONTALIAS
Étapes de création de votre "environnement privé" :
# Create the directory testaliasing in $ORACLE_HOME/guicommon/tk
#
cd $ORACLE_HOME/guicommon/tk
mkdir testaliasing
#
# Create the directories AFM and PPD in $ORACLE_HOME/guicommon/tk/testaliasing
#
cd $ORACLE_HOME/guicommon/tk/testaliasing
mkdir AFM
mkdir PPD
#
# Copy the AFM files to your private directory:
#
cp $ORACLE_HOME/guicommon/tk/admin/AFM/* $ORACLE_HOME/guicommon/tk/testaliasing/AFM
#
# Copy the PPD files to your private directory:
#
cp $ORACLE_HOME/guicommon/tk/admin/PPD/* $ORACLE_HOME/guicommon/tk/testaliasing/PPD
#
# Copy the files uiprint.txt and uifont.ali to your private directory:
#
cp $ORACLE_HOME/guicommon/tk/admin/uiprint.txt $ORACLE_HOME/guicommon/tk/testaliasing
cp $ORACLE_HOME/guicommon/tk/admin/uifont.ali $ORACLE_HOME/guicommon/tk/testaliasing
#
# Copy the file reports.sh
#
cp $ORACLE_HOME/bin/reports.sh $ORACLE_HOME/bin/ta_reports.sh
#
# Copy the file rwrun.sh
#
cp $ORACLE_HOME/bin/rwrun.sh $ORACLE_HOME/bin/ta_rwrun.sh
Modifiez le fichier $ORACLE_HOME/bin/ta_rwrun.sh et remplacez la ligne :
$ORACLE_HOME/bin/reports.sh
par :
$ORACLE_HOME/bin/ta_reports.sh
Modifiez le fichier $ORACLE_HOME/bin/ta_reports.sh et ajoutez les lignes suivantes :
################### Reports Private Environment Variables #########################################
REPORTS_DEFAULT_DISPLAY=YES ; export REPORTS_DEFAULT_DISPLAY
TK_PPD=$ORACLE_HOME/guicommon/tk/testaliasing/PPD ; export TK_PPD
TK_AFM=$ORACLE_HOME/guicommon/tk/testaliasing/AFM ; export TK_AFM
TK_HPD=$ORACLE_HOME/guicommon/tk/testaliasing/HPD ; export TK_HPD
TK_TFM=$ORACLE_HOME/guicommon/tk/testaliasing/TFM ; export TK_TFM
TK_FONTALIAS=$ORACLE_HOME/guicommon/tk/testaliasing ; export TK_FONTALIAS
TK_UNKNOWN=$ORACLE_HOME/guicommon/tk/testaliasing ; export TK_UNKNOWN
REPORTS_PATH=$ORACLE_HOME/guicommon/tk/testaliasing:$REPORTS_PATH ; export REPORTS_PATH
TK_PRINTER=printer_ps ; export TK_PRINTER
TK_PRINT_STATUS=echo ; export TK_PRINT_STATUS
Remarque : l'imprimante printer_ps doit être définie dans le fichier $ORACLE_HOME/guicommon/tk/testaliasing/uiprint.txt :
printer_ps:postscript:2:Test PostScript Printer:default.ppd:
Pour utiliser l'environnement d'aliasing "privé", exécutez le rapport avec le script ta_rwrun.sh :
ta_rwrun.sh report=test destype=file desname=/tmp/test.html desformat=html
Vérifier le nom de police utilisé dans le RDF
Pour vérifier le nom exact de la police utilisée dans le rapport, vous pouvez faire une recherche dans la version XML de votre rapport.
Pour générer le fichier XML, vous pouvez :
- enregistrer le RDF au format XML avec Reports Builder,
ou
- convertir le RDF en XML. Exemple de syntaxe :
rwconverter.sh stype=rdffile source=test.rdf dtype=xmlfile dest=test.xml (UNIX)
rwconverter.exe stype=rdffile source=test.rdf dtype=xmlfile dest=test.xml (Windows)
Une fois le fichier XML obtenu, recherchez-y la chaîne "face=" :
grep -i face= /tmp/myreport.xml (UNIX)
Exemple (UNIX) :
>rwconverter.sh stype=rdffile source=test.rdf dtype=xmlfile dest=test.xml batch=yes
Report Builder: Release 10.1.2.0.2 - Production on Mon Dec 12 12:07:47 2005
Copyright (c) 1982, 2005, Oracle. All rights reserved.
REP-25200: Converting 'test.rdf' to 'test.xml'...
>grep -i face= test.xml
<font face="Helvetica" size="14" bold="yes" italic="yes"/>
<font face="Helvetica" size="12" bold="yes"/>
<font face="Helvetica" size="12" bold="yes"/>
<font face="Helvetica" size="12" bold="yes"/>
<font face="Arial" size="12" bold="yes"/>
<font face="Helvetica" size="36" bold="yes" italic="yes"/>
<font face="Helvetica" size="20" bold="yes" textColor="gray64"/>
>
Vérifier la police utilisée dans le résultat après le "Font Aliasing"
La façon la plus simple de vérifier le nom de police utilisé dans un résultat généré par Reports est d'utiliser DESFORMAT=HTML.
Comme le résultat HTML est un fichier texte, le nom de police utilisé s'y retrouve facilement.
Par exemple, exécutez le rapport avec :
DESFORMAT=HTML
DESTYPE=FILE
DESNAME=/tmp/test_aliasing.html
Vérifiez le nom de police utilisé dans le résultat en recherchant la chaîne "face=" :
grep -i face= /tmp/font_aliasing.html
Font Aliasing en PDF
En PDF, le nom de police est sensible à la casse. Dans certains cas, le nom de police généré par Reports peut être erroné.
Étape 1) Vérifiez le nom de police utilisé dans le fichier PDF en recherchant la chaîne "basefont" :
grep -i basefont test.pdf
Exemple :
>grep -i basefont /tmp/test.pdf
/BaseFont /Helvetica-Bold
>
Étape 2) Vérifiez le nom de police qu'utilise Acrobat Reader pour afficher le document PDF :
Depuis Acrobat Reader 7.0
File -> Document Properties ...
Tab "Fonts"
Vérifiez la valeur de "Actual Font".
Étape 3) Si le nom de police généré par Reports est incorrect (problème de majuscules, espace manquant dans le nom de la police, etc.), vous pouvez utiliser la section [ PDF ] du fichier uifont.ali.
Exemple : [ PDF ]
fontname1 = FontName1
fontname2 = "Font Name 2"
Remarques :
a) Cette section [PDF] est lue après le "Font Aliasing". Le nom de police indiqué à gauche du signe égal doit être le nom de la police une fois le "Font Aliasing" effectué.
b) Cette section ne doit servir QU'À corriger des problèmes de majuscules, de minuscules ou d'espaces dans le nom de la police. Il est possible de remplacer un nom de police par une police totalement différente; dans ce cas, toutefois, le résultat risque de présenter des problèmes de troncature ou de chevauchement.
Exemple pouvant entraîner des problèmes de troncature ou de chevauchement :
[ PDF ]
Arial = "Courier New"
Avec ce paramètre, le résultat du rapport sera mis en forme avec les informations de métrique de la police Arial, mais Adobe Reader utilisera la police Courier New, dont les métriques sont totalement différentes.
Problèmes de Font Subsetting / Font Embedding en PDF
Le Font Subsetting et le Font Embedding ont toujours lieu APRÈS le Font Aliasing. C'est pourquoi il est important de vérifier d'abord le résultat du Font Aliasing. Pour faire du Font Subsetting ou du Font Embedding, vous devez ajouter dans uifont.ali une ligne comme :
Font Subsetting :
<font name>="<ttf filename>" in the section [ PDF:Subset ].
Font Embedding sous Windows :
<font name>="<pfm filename> <pfb filename>" in the section [ PDF:Embed ].
Font Embedding sous UNIX :
<font name>="<afm filename> <pfa filename>" in the section [ PDF:Embed ].
Le nom de police indiqué à gauche du signe égal est le nom de la police APRÈS le "Font Aliasing". Ainsi, si la police choisie par Reports lors du Font Aliasing n'est pas celle indiquée à gauche du signe égal, le Subsetting ou l'Embedding n'aura pas lieu. Si vous avez des problèmes de Font Subsetting ou de Font Embedding, générez un résultat HTML et vérifiez le nom de police utilisé dans le fichier HTML.
Lors du Font Subsetting ou du Font Embedding, les fichiers ttf / pfm / pfb / afm / pfa sont utilisés. Ces fichiers doivent être accessibles à Reports (dans REPORTS_PATH) et lisibles (droits d'accès sous UNIX). Les utilitaires de trace UNIX, comme strace ou truss, peuvent servir à déboguer les problèmes que vous soupçonnez d'être liés aux droits d'accès.
Doc ID 110888.1 How to Trace Unix System Calls
Doc ID 882227.1 How to Know if Font Subsetting / Font Embedding Has Been Used by Oracle Reports when Generating a PDF output ?
Problèmes liés au jeu de caractères
Pour vérifier si le problème est lié au jeu de caractères, testez toujours la génération d'un résultat avec
NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1
Si le problème ne se produit pas avec NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1, modifiez les fichiers AFM comme le décrit la note suivante :
Doc ID 300416.1 Symbol Characters ("Greek") Instead Of Expected Characters Are Displayed in Reports or Reports Parameter Form
Ce problème de jeu de caractères est aussi décrit dans le document :
Oracle Application Server Reports Services Publishing Reports to the Web 10g Release 2 (10.1.2) B14048-02
Repairing Garbled Fonts When Using the WE8ISO8859P15 Character Set
Ce problème peut aussi survenir avec d'autres jeux de caractères que WEISO8859P15 (UTF8, EE8ISO8859P2, etc.).
Voici un exemple de script qui modifie la valeur EncodingScheme dans les fichiers AFM :
1) Créez un nouveau répertoire AFM2 sous $ORACLE_HOME/guicommon/tk/admin
2) Créez le script suivant dans le répertoire $ORACLE_HOME/guicommon/tk/admin/AFM
#!/bin/sh
for filename in *
do
sed "s/EncodingScheme AdobeStandardEncoding/EncodingScheme FontSpecific/" $filename > ../AFM2/$filename
done
3) Enregistrez le script et donnez-lui les droits d'exécution (dans l'exemple ci-dessous, le script s'appelle change_encoding.sh) :
chmod a+x change_encoding.sh
4) Exécutez le script change_encoding.sh
5) Renommez le répertoire AFM en AFM_backup :
cd $ORACLE_HOME/guicommon/tk/admin
mv AFM AFM_backup
6) Renommez le répertoire AFM2 en AFM :
cd $ORACLE_HOME/guicommon/tk/admin
mv AFM2 AFM
Si vous utilisez un "environnement privé", vous pouvez modifier les fichiers AFM du répertoire indiqué dans TK_AFM (TK90_AFM).
Les fichiers AFM créés par l'utilitaire ttf2pt1 ont par défaut "EncodingScheme FontSpecific".