Impression EUDC sous Windows : corriger l’affichage « 口 » pour un service Local System

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.

Sommaire

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é

  1. 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.
  2. 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.
  3. Installer la police pour tous (machine‑wide) si nécessaire : copiez .ttf/.tte dans C:\Windows\Fonts et créez l’entrée correspondante dans HKLM\...\Fonts. Le mappage EUDC reste cependant par utilisateur, d’où le point précédent.
  4. 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

PiloteChaîne d’impressionComportement typique avec EUDCAvantagesPoints d’attention
XPS / v4XPSRisque 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 / RAWTrès bonne compatibilité ; rasterisation côté spooler si besoinStable, large support constructeurFichiers spool pouvant être volumineux
PostScript (v3)GDI / RAWBonne prise en charge via téléchargement de polices ou rasterisationQualité vectorielle, support proFonction des options PS de l’imprimante

Procédures détaillées

Basculer du pilote XPS vers PCL/PostScript

  1. Identifiez le modèle exact de l’imprimante et téléchargez le pilote constructeur PCL6 ou PS (version serveur) correspondant.
  2. Ouvrez Propriétés de l’imprimanteAvancé :
    • 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é.
  3. 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

  1. Créez svcImpression (ou similaire) et attribuez‑lui les droits nécessaires minimaux.
  2. Modifiez le service : Se connecter en tant que : .\svcImpression (ou DOMAINE\svcImpression).
  3. Ouvrez une session une fois avec ce compte pour générer C:\Users\svcImpression.
  4. 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

  1. Imprimez le même document : ① depuis le service (sans session interactive) et ② depuis une session administrateur. Comparez.
  2. Essayez un deuxième pilote (PCL6 ou PS) ; si l’impression devient correcte, le problème venait de XPS.
  3. 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égorieActionDétails / Commentaires
Pilote d’impressionUtiliser un pilote PCL/PostScript ou la dernière version constructeurLe problème disparaît souvent en abandonnant le pilote XPS/v4, qui ne télécharge pas les EUDC.
Compte de serviceExécuter le service sous un compte avec profil persistantFonctionne si ce profil contient bien le mappage EUDC. Maintenance via GPO de démarrage.
Mappage des policesImporter/dupliquer la clé EUDC vers HKEY_USERS\.DEFAULT ou vers le profil du compte de serviceCopie manuscrite ou script reg / PowerShell. Rend la police visible en session 0.
Installation systèmeInstaller la police « pour tous les utilisateurs » via GPO ou C:\Windows\FontsGarantit la présence du fichier, mais le mapping EUDC (HKCU) reste requis.
Contournement logicielIntégrer le glyphe dans le document (PDF) ou convertir en courbesSupprime 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

ÉtapeActionOK ?
AuditIdentifier qui possède le mappage EUDC fonctionnel (compte de référence) et où résident les fichiers .ttf/.tte.
PiloteInstaller/basculer l’imprimante sur PCL6 ou PostScript. Désactiver les fonctions avancées si besoin.
DuplicationCopier la clé ...\EUDC vers HKU\.DEFAULT ou vers le profil du compte de service (script GPO Startup).
PoliceInstaller les fichiers de police pour tous (C:\Windows\Fonts) si absents.
ValidationImprimer depuis le service sans session interactive et comparer avec l’impression depuis une session.
AutomatisationConserver 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 (pour reg load).
Sommaire