Sur un serveur Windows, un service qui imprime des documents avec des caractères chinois personnalisés (EUDC) peut remplacer ces glyphes par « 口 » quand personne n’est connecté. Voici un guide complet, concret et durable pour résoudre ce problème côté système et côté impression.
Problématique de l’impression des polices EUDC lorsqu’aucun utilisateur n’est connecté
De nombreuses applications historiques en Asie utilisent les End‑User‑Defined Characters (EUDC) pour ajouter des glyphes qui n’existent pas dans la police de base : noms propres, variantes d’idéogrammes, symboles internes, etc. En environnement serveur, tout va bien tant qu’un utilisateur est connecté de façon interactive ; mais dès que plus personne n’est connecté, les impressions issues d’un service Windows lancé sous Local System (ou sous un autre compte de service sans profil interactif) montrent des carrés de substitution « 口 ». Cette situation est typique des traitements nocturnes ou 24/7 (EDI, ERP, facturation, état stock, étiquettes logistiques, etc.).
La cause n’est pas un manque de droits, mais la manière dont Windows charge et associe les polices EUDC : par utilisateur. La session des services (session 0) n’hérite pas des mappages EUDC du dernier utilisateur connecté ; de plus, un pilote XPS peut ne pas télécharger correctement les EUDC vers l’imprimante, d’où la substitution « 口 ».
Vue d’ensemble du symptôme
- Avec session interactive ouverte sur le serveur : l’impression contient les bons glyphes EUDC.
- Sans aucun utilisateur connecté : les mêmes caractères sont remplacés par « 口 » (caractère de substitution).
- Contexte typique : service Windows tournant sous
LocalSystem
(ou compte de service) dans la session 0, impression via un pilote XPS ou v4, ou vers une imprimante réseau.
Origine technique
Chargement par utilisateur : le cœur du problème
Les polices EUDC ne sont pas de simples fichiers .ttf « globaux ». Elles s’accompagnent d’un mappage caractère→glyphe enregistré sous la ruche HKCU\Software\Microsoft\Windows NT\CurrentVersion\EUDC
du profil utilisateur courant. Quand une application GDI/Uniscribe dessine un caractère déclaré comme EUDC, Windows consulte ce mappage, puis charge la police EUDC correspondante (souvent un fichier .tte/.ttf dédié).
Un service qui s’exécute en session 0 n’a pas de profil interactif chargé : sa « vue » du registre ne contient pas la ruche HKCU de l’administrateur ou de l’utilisateur qui possède les EUDC. À défaut de mappage visible, GDI substitue le caractère introuvable par « 口 ».
Limitation des pilotes XPS
Dans la chaîne d’impression XPS (pilotes v4, XPS-based), certaines implémentations ne téléchargent pas correctement les polices EUDC vers l’imprimante : la tâche d’impression contient le texte, mais pas les glyphes EUDC attendus. Le périphérique utilise alors sa police de substitution et affiche « 口 ». À l’inverse, des pilotes PCL6 ou PostScript (souvent « v3 ») gèrent mieux ces cas, en rasterisant côté spooler ou en intégrant la police au flux RAW.
Conséquence
Quand aucun utilisateur n’est connecté, vous combinez deux effets : absence de mappage EUDC visible pour la session 0 + pilote XPS qui ne télécharge pas la police. Résultat : substitution « 口 ».
Plan d’action recommandé
- Changer de pilote d’impression : privilégiez un pilote PCL6 ou PostScript du constructeur, voire un pilote v3 universel. Évitez XPS/v4 pour les travaux contenant des EUDC.
- Rendre le mappage EUDC visible en session 0 :
- Option A : dupliquer la clé EUDC dans
HKEY_USERS\.DEFAULT
(vision de la session 0). - Option B : exécuter le service sous un compte de service dédié (profil persistant) et mettre en place le mappage EUDC dans
HKCU
de ce compte.
- Option A : dupliquer la clé EUDC dans
- Installer la police pour tous (machine‑wide) si nécessaire : copiez .ttf/.tte dans
C:\Windows\Fonts
et créez l’entrée correspondante dansHKLM\...\Fonts
. Le mappage EUDC reste cependant par utilisateur, d’où le point précédent. - Contournement applicatif : intégrez la police dans le document (PDF) ou convertissez le texte EUDC en courbes avant impression. Cela supprime la dépendance à l’imprimante et au pilote.
Comparatif utile des pilotes
Pilote | Chaîne d’impression | Comportement typique avec EUDC | Avantages | Points d’attention |
---|---|---|---|---|
XPS / v4 | XPS | Risque de non‑téléchargement des EUDC, apparition de « 口 » | Architecture moderne, packaging simplifié | Compat EUDC aléatoire selon modèle d’imprimante |
PCL6 (v3) | GDI / RAW | Très bonne compatibilité ; rasterisation côté spooler si besoin | Stable, large support constructeur | Fichiers spool pouvant être volumineux |
PostScript (v3) | GDI / RAW | Bonne prise en charge via téléchargement de polices ou rasterisation | Qualité vectorielle, support pro | Fonction des options PS de l’imprimante |
Procédures détaillées
Basculer du pilote XPS vers PCL/PostScript
- Identifiez le modèle exact de l’imprimante et téléchargez le pilote constructeur PCL6 ou PS (version serveur) correspondant.
- Ouvrez Propriétés de l’imprimante → Avancé :
- Installez le nouveau pilote et basculez l’imprimante dessus.
- Désactivez « Activer les fonctionnalités avancées d’impression » si des artefacts persistent (cela force un chemin plus simple).
- Activez « Rendre l’impression disponible quand le serveur d’impression n’est pas connecté » si proposé.
- Imprimez un document contenant des EUDC depuis le service (pas depuis une session interactive) pour valider.
Dupliquer le mappage EUDC vers la session 0
Cette méthode rend la clé EUDC disponible sous HKEY_USERS\.DEFAULT\Software\Microsoft\Windows NT\CurrentVersion\EUDC
, laquelle est consultée par les processus tournant en session 0.
Pré‑requis
- La configuration EUDC est déjà correcte pour un utilisateur de référence (par ex. Administrator), et les fichiers de police EUDC (.tte/.ttf) sont présents.
- Vous êtes administrateur local sur le serveur.
Script Startup (ordinateur) via GPO ou tâche planifiée
Le script suivant charge la ruche de l’utilisateur de référence, copie la clé vers HKU\.DEFAULT
, puis décharge la ruche. Il fonctionne même après redémarrage, avant toute ouverture de session.
rem ==== variables à adapter ====
set SRC_USER=Administrator
set SRC_PROFILE=C:\Users\%SRC_USER%
set SRC_NTUSER=%SRC_PROFILE%\NTUSER.DAT
rem ==== charger la ruche de l'utilisateur source sous HKU\TEMP ====
reg load "HKU\TEMP" "%SRC_NTUSER%"
rem ==== supprimer puis copier la clé EUDC vers .DEFAULT ====
reg delete "HKU.DEFAULT\Software\Microsoft\Windows NT\CurrentVersion\EUDC" /f
reg copy "HKU\TEMP\Software\Microsoft\Windows NT\CurrentVersion\EUDC" ^
"HKU.DEFAULT\Software\Microsoft\Windows NT\CurrentVersion\EUDC" /s /f
rem ==== décharger ====
reg unload "HKU\TEMP"
rem ==== assurer la présence des fichiers de police au niveau machine ====
rem (optionnel si déjà installés)
copy "%SRC_PROFILE%\AppData\Local\Microsoft\Windows\Fonts*.ttf" "C:\Windows\Fonts"
Astuce : si l’utilisateur de référence stocke ses EUDC dans son dossier AppData, copiez les fichiers vers C:\Windows\Fonts
pour garantir leur accessibilité système. Créez si besoin l’entrée dans HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts
:
reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts" ^
/v "EUDC (TrueType)" /t REG_SZ /d "EUDC.ttf" /f
Variante PowerShell robuste
$srcUser = "Administrator"
$srcHive = "HKU:\TEMP"
$eudcSubKey = "\Software\Microsoft\Windows NT\CurrentVersion\EUDC"
# Monter la ruche de l'utilisateur source
& reg.exe load "HKU\TEMP" "C:\Users$srcUser\NTUSER.DAT" | Out-Null
# Supprimer l'ancienne clé sous .DEFAULT
Remove-Item -Path "Registry::HKEY_USERS.DEFAULT$eudcSubKey" -Recurse -Force -ErrorAction SilentlyContinue
# Créer la clé destination
New-Item -Path "Registry::HKEY_USERS.DEFAULT$eudcSubKey" -Force | Out-Null
# Copier récursivement valeurs et sous-clés
function Copy-RegKey($src, $dst) {
New-Item -Path $dst -Force | Out-Null
(Get-Item -Path $src).GetValueNames() | ForEach-Object {
$val = (Get-ItemProperty -Path $src -Name $*).$*
$kind = (Get-Item -Path $src).GetValueKind($*)
New-ItemProperty -Path $dst -Name $* -Value $val -PropertyType $kind -Force | Out-Null
}
Get-ChildItem -Path $src | ForEach-Object {
Copy-RegKey $*.PsPath (Join-Path $dst $*.PSChildName)
}
}
Copy-RegKey "Registry::$srcHive$eudcSubKey" "Registry::HKEY_USERS.DEFAULT$eudcSubKey"
# Démonter la ruche
& reg.exe unload "HKU\TEMP" | Out-Null
Après exécution, redémarrez le service d’impression et testez depuis le service applicatif (toujours sans session interactive ouverte).
Exécuter le service sous un compte avec profil persistant
Autre approche : créer un compte de service dédié (local ou domaine), démarrer le service sous ce compte, ouvrir une session une fois pour créer son profil, puis y configurer EUDC normalement. Avantages : isolation, auditabilité, maîtrise du cycle de vie. Inconvénient : il faut maintenir les EUDC au sein de ce profil (GPO de démarrage recommandée pour automatiser).
Mise en place
- Créez
svcImpression
(ou similaire) et attribuez‑lui les droits nécessaires minimaux. - Modifiez le service : Se connecter en tant que :
.\svcImpression
(ouDOMAINE\svcImpression
). - Ouvrez une session une fois avec ce compte pour générer
C:\Users\svcImpression
. - Installez/associez les EUDC depuis cette session (ou copiez‑les par script dans
HKU\SID\...\EUDC
).
Copie automatisée vers le profil du compte de service
set SRC_USER=Administrator
set DST_USER=svcImpression
reg load "HKU\SRC" "C:\Users%SRC_USER%\NTUSER.DAT"
reg load "HKU\DST" "C:\Users%DST_USER%\NTUSER.DAT"
reg delete "HKU\DST\Software\Microsoft\Windows NT\CurrentVersion\EUDC" /f
reg copy "HKU\SRC\Software\Microsoft\Windows NT\CurrentVersion\EUDC" ^
"HKU\DST\Software\Microsoft\Windows NT\CurrentVersion\EUDC" /s /f
reg unload "HKU\SRC"
reg unload "HKU\DST"
Note : si le compte de service n’a jamais ouvert de session, il n’a pas encore de fichier NTUSER.DAT
. Ouvrez une session une fois ou utilisez un mécanisme de profil de base pour le créer.
Installer les polices EUDC pour tous les utilisateurs
Installez les fichiers .ttf/.tte dans C:\Windows\Fonts
et déclarez‑les dans HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts
. Cela rend la police accessible au système, mais n’inscrit pas le mappage EUDC : vous devez tout de même dupliquer la clé ...\EUDC
vers la session 0 ou vers le profil du compte de service.
Contournements applicatifs
- PDF avec intégration complète de la police : configurez le moteur de rendu pour intégrer les polices (pas seulement en sous‑ensemble) ; l’imprimante n’aura plus besoin de connaître EUDC.
- Conversion en courbes : pour des tickets/étiquettes statiques, convertissez le texte EUDC en chemins vectoriels avant impression.
Vérifications et diagnostic pas à pas
Vérifier les polices visibles en session 0
Lancez un processus interactif en session 0 et listez les polices chargées :
psexec -i 0 -s powershell.exe -NoProfile -Command ^
"[System.Drawing.Text.InstalledFontCollection]::new().Families | ForEach-Object Name"
Si votre police EUDC n’apparaît pas, c’est que la session 0 ne « voit » ni la police ni son mappage. Après duplication de la clé ...\EUDC
, relancez le test.
Forcer un rendu côté serveur
- Dans les propriétés de l’imprimante : décochez Activer les fonctionnalités avancées d’impression pour forcer une rasterisation côté spooler.
- Sur pilote partagé : activez Rendre l’impression disponible quand le client n’est pas connecté pour éviter les rendus côté client.
Valider la chaîne complète
- Imprimez le même document : ① depuis le service (sans session interactive) et ② depuis une session administrateur. Comparez.
- Essayez un deuxième pilote (PCL6 ou PS) ; si l’impression devient correcte, le problème venait de XPS.
- Examinez le journal Applications et services → Microsoft → Windows → PrintService (canal Opérationnel) pour repérer des avertissements liés aux polices.
Solutions regroupées et commentées
Catégorie | Action | Détails / Commentaires |
---|---|---|
Pilote d’impression | Utiliser un pilote PCL/PostScript ou la dernière version constructeur | Le problème disparaît souvent en abandonnant le pilote XPS/v4, qui ne télécharge pas les EUDC. |
Compte de service | Exécuter le service sous un compte avec profil persistant | Fonctionne si ce profil contient bien le mappage EUDC. Maintenance via GPO de démarrage. |
Mappage des polices | Importer/dupliquer la clé EUDC vers HKEY_USERS\.DEFAULT ou vers le profil du compte de service | Copie manuscrite ou script reg / PowerShell. Rend la police visible en session 0. |
Installation système | Installer la police « pour tous les utilisateurs » via GPO ou C:\Windows\Fonts | Garantit la présence du fichier, mais le mapping EUDC (HKCU) reste requis. |
Contournement logiciel | Intégrer le glyphe dans le document (PDF) ou convertir en courbes | Supprime la dépendance aux EUDC côté imprimante. Idéal pour archivage/traçabilité. |
Cas particuliers et bonnes pratiques
- Services interactifs : l’option « Autoriser le service à interagir avec le Bureau » peut charger des polices utilisateur par effet de bord, mais elle n’est pas recommandée en production (superficie d’attaque accrue, comportements non déterministes).
- Imprimantes réseau : certains modèles acceptent le téléchargement de polices par le biais de leur utilitaire constructeur. Téléchargez le .ttf/.tte EUDC dans la mémoire de l’imprimante pour fiabiliser le rendu, surtout en PostScript.
- Sessions RDS/RemoteApp : vérifiez si l’option « rendu côté client » est active. Pour des EUDC, préférez un rendu côté serveur + pilote PCL/PS.
- Maintenance : versionnez vos fichiers EUDC, documentez leur emplacement et le script de duplication. Ajoutez un contrôle de présence au démarrage du service.
Scripts prêts à l’emploi
Tester la présence d’une police EUDC depuis la session 0
psexec -i 0 -s powershell.exe -NoProfile -Command ^
"$n='*EUDC*'; [System.Drawing.Text.InstalledFontCollection]::new().Families |
Where-Object { $_.Name -like $n } | Select-Object -ExpandProperty Name"
Contrôle automatique au démarrage (extrait PowerShell)
# Vérifie la clé .DEFAULT\EUDC et relance le service si elle est absente
$eudc = 'Registry::HKEY_USERS\.DEFAULT\Software\Microsoft\Windows NT\CurrentVersion\EUDC'
if (-not (Test-Path $eudc)) {
Write-Host "EUDC manquante en session 0 - action requise"
# Appeler ici votre fonction de duplication (voir plus haut) puis :
Restart-Service -Name Spooler -Force
Restart-Service -Name MonServiceDImpression -Force
}
Migration de pilote automatisée (idée de base)
# Exemple : basculer "Imprimante-Prod" sur un pilote PCL6 déjà installé
$printer = Get-Printer -Name "Imprimante-Prod"
Set-Printer -Name $printer.Name -DriverName "HP Universal Printing PCL 6"
Set-Printer -Name $printer.Name -EnableBidi $false
Set-Printer -Name $printer.Name -RenderingMode RenderOnServer
FAQ express
Pourquoi l’impression est correcte seulement quand un utilisateur est connecté ? Parce que la configuration EUDC (mappage HKCU) est alors chargée, donc visible par l’application. En l’absence de session interactive, la session 0 n’a pas ce mappage.
<dt>Le passage à un pilote PCL/PS suffit-il toujours ?</dt>
<dd>Très souvent, mais pas systématiquement. Même avec PCL/PS, la session 0 doit pouvoir <em>lire</em> la police et son mappage. D’où la duplication vers <code>HKU\.DEFAULT</code> ou l’usage d’un compte de service avec profil.</dd>
<dt>Pourquoi voit‑on précisément le caractère « 口 » ?</dt>
<dd>Il s’agit du <em>caractère de substitution</em> utilisé par la police de remplacement lorsque le glyphe demandé n’existe pas ou n’est pas téléchargeable.</dd>
<dt>Les polices « pour tous les utilisateurs » suffisent-elles ?</dt>
<dd>Non. Elles rendent le fichier accessible, mais le <em>mappage</em> EUDC reste par utilisateur.</dd>
<dt>Peut‑on éviter totalement EUDC ?</dt>
<dd>Oui, en migrant vers des polices unifiées et en codant les caractères manquants dans la zone d’usage privé (PUA) d’Unicode avec des polices intégrées au document. Mais cela nécessite l’aval métier et la mise à jour des outils.</dd>
Checklist de mise en œuvre
Étape | Action | OK ? |
---|---|---|
Audit | Identifier qui possède le mappage EUDC fonctionnel (compte de référence) et où résident les fichiers .ttf/.tte. | □ |
Pilote | Installer/basculer l’imprimante sur PCL6 ou PostScript. Désactiver les fonctions avancées si besoin. | □ |
Duplication | Copier la clé ...\EUDC vers HKU\.DEFAULT ou vers le profil du compte de service (script GPO Startup). | □ |
Police | Installer les fichiers de police pour tous (C:\Windows\Fonts ) si absents. | □ |
Validation | Imprimer depuis le service sans session interactive et comparer avec l’impression depuis une session. | □ |
Automatisation | Conserver un script de vérification/duplication au démarrage. Journaliser et superviser. | □ |
Informations complémentaires et conseils pratiques
- Journalisation : activez le canal PrintService/Opérationnel pour repérer les échecs de téléchargement de polices.
- Sauvegarde : exportez la clé
...\EUDC
d’origine (reg export
) avant toute manipulation. - Sécurité : gardez les EUDC dans un répertoire protégé (ACL minimales), évitez d’accorder au service plus de privilèges que nécessaire.
- Évolution : documentez la procédure (où sont les fichiers, qui met à jour, comment tester). Un simple remplacement de serveur ou de pilote ne doit pas casser l’impression.
Synthèse claire pour décider
Le dysfonctionnement provient du chargement par utilisateur des EUDC et de la chaîne XPS qui n’intègre pas toujours ces polices dans le flux d’impression. La voie la plus robuste en production est de remplacer le pilote XPS par PCL6 ou PostScript, puis de rendre la configuration EUDC visible en session 0 (duplication vers HKU\.DEFAULT
) ou d’exécuter le service sous un compte disposant d’un profil contenant le bon mappage. En complément, l’intégration de la police dans le document et/ou la conversion en courbes suppriment toute dépendance côté imprimante. Une fois ces trois leviers maîtrisés, les « 口 » disparaissent, et vos impressions EUDC redeviennent fiables 24 h/24.
Annexe : références de clés et chemins utiles
HKCU\Software\Microsoft\Windows NT\CurrentVersion\EUDC
: mappage utilisateur EUDC.HKEY_USERS\.DEFAULT\Software\Microsoft\Windows NT\CurrentVersion\EUDC
: mappage « par défaut » visible en session 0.HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts
: polices installées pour tous les utilisateurs.C:\Windows\Fonts
: dépôt machine des polices.C:\Users\<User>\NTUSER.DAT
: ruche HKCU d’un utilisateur (pourreg load
).