Los trabajos de impresión que contienen caracteres EUDC pueden fallar silenciosamente cuando el servicio que los envía se ejecuta en segundo plano. Este artículo describe de forma práctica cómo evitar que los glifos aparezcan como “口” y lograr una salida fiel incluso sin sesión iniciada.
Qué son los caracteres EUDC y por qué son distintos
Los EUDC (End‑User Defined Characters) son glifos personalizados que amplían los conjuntos estándar para cubrir ideogramas chinos, japoneses o símbolos corporativos. Windows los administra como parte del subsistema gráfico GDI y requiere que la fuente esté correctamente instalada y registrada para que cada proceso logre encontrarlos. Cuando todo ocurre en una sesión interactiva, el entorno de usuario carga la fuente al iniciar; en cambio, un servicio sin escritorio puede enfrentarse a:
- Ausencia de la clave HKCU correspondiente.
- Spooler que arranca antes de que el subsistema de fuentes finalice su inicialización.
- Controladores XPS que delegan la rasterización en el cliente y no en el dispositivo.
Por qué la impresión falla sin sesión interactiva
Cada vez que un servicio se lanza con la cuenta Local System
se omite la carga del perfil de usuario salvo que la casilla Load User Profile esté habilitada. Ese perfil suele contener la ruta a la fuente EUDC en HKCU\EUDC\CodePage\*
. Al no encontrarla, Windows sustituye el glifo por el carácter “unknown” que, en la mayoría de las tipografías de Asia‑Pacífico, es el cuadro vacío. Para agravar el problema, muchos controladores XPS descartan glifos privados porque el estándar XPS 1.0 no obliga a incrustarlos, a diferencia de PostScript o PDF.
Diagnóstico rápido antes de aplicar cambios
- Confirma el origen del driver. Abre
printmanagement.msc
y revisa que el tipo de procesador de impresión no sea XPS. - Reproduce el escenario. Cierra todas las sesiones y envía un documento de prueba con el carácter EUDC desde la línea de comandos:
printui.exe /k /n "NombreImpresora"
. Si aparece “口”, el problema está confirmado. - Inspecciona el registro. Comprueba en
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\EUDC
la presencia de la ruta completa a la fuente.
Soluciones paso a paso
Paso | Acción | Detalle |
---|---|---|
1 | Cambiar el controlador | Sustituye el driver XPS por uno PCL 6, PostScript o GDI oficial del fabricante. Los paquetes universales PCL6 tienden a rastrear mejor los glifos privados que su equivalente XPS. |
2 | Instalación global de la fuente | Copia el archivo .ttf/.ttc en %WINDIR%\Fonts y agrega o edita la clave HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\EUDC<CodePage> con la ruta absoluta. |
3 | Cargar el perfil en el servicio | Abre services.msc, ve a la pestaña Log On y habilita Load User Profile. Si el servicio requiere acceso gráfico, activa también Allow service to interact with desktop. |
4 | Usar cuenta dedicada | Crea una cuenta de dominio con privilegios de impresión, inicia sesión una vez para que el perfil se genere y asigna esa cuenta al servicio. |
5 | Validación rápida | Con todas las sesiones cerradas, lanza de nuevo printui.exe /k /n "NombreImpresora" ; si el glifo aparece, la corrección es efectiva. |
6 | Contactar al fabricante | Algunos proveedores solo ofrecen drivers XPS. Solicita un firmware o un paquete PCL clásico que incruste correctamente los glifos EUDC. |
Cambiar el controlador: consideraciones prácticas
Los controladores XPS dependen del componente XpsPrint.dll
, que convierte el trabajo en spool a XPS. Este módulo no incrusta siempre las tablas CMAP privadas. Si tu impresora ofrece un firmware PostScript 3 o PCL 6, instálalo y define dicho driver como predeterminado. Una vez aplicado, borra la cola (net stop spooler && del %systemroot%\System32\spool\PRINTERS\* /Q && net start spooler
) antes de la siguiente prueba para evitar archivos corruptos.
Instalación global de la fuente
Para registrar la fuente a nivel de equipo:
reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\EUDC" ^
/v 936 ^
/t REG_SZ ^
/d "C:\Windows\Fonts\MiFuenteEUDC.ttf" ^
/f
El valor 936
corresponde al código de página Simplified Chinese. Repite la operación para cada código de página que necesites (932 para japonés, 950 para Traditional Chinese, etc.).
Habilitar “Load User Profile”
Cuando el servicio arranca, Windows lee la entrada ProfileImagePath
en el registro para cargar el hive NTUSER.DAT
. Sin esta carga, las fuentes instaladas solo en el contexto de usuario no están disponibles. Activar la casilla fuerza la carga y, por consiguiente, la disponibilidad de la fuente.
Ejecutar con una cuenta dedicada
Si el servicio realiza tareas críticas, se recomienda una cuenta con privilegios mínimos adicionales sobre Print Operators
. Esto reduce la superficie de ataque y garantiza que las fuentes se carguen al iniciarse la sesión del servicio.
Estrategias avanzadas para entornos exigentes
Retrasar el inicio del spooler
Los EUDC se cargan tarde en el proceso de arranque. Configura el servicio de cola de impresión como Automatic (Delayed Start) o programa un retardo manual de 60 s mediante un script PowerShell que reinicie el spooler. Ejemplo:
Start-Sleep -Seconds 60
Restart-Service -Name Spooler -Force
Incrustar el glifo directamente en PostScript
Si controlas la generación del documento, puedes definir el glifo como un /Type3
en PostScript. Esto evita depender de la instalación de la fuente en el dispositivo:
/EUDCChar {
0 0 1000 1000 setbbox
newpath 100 100 moveto
800 100 lineto
800 800 lineto
100 800 lineto
closepath fill
} bind def
Uso de AddFontResourceEx
Para aplicaciones propias, invoca AddFontResourceEx(L"MiFuenteEUDC.ttf", FRPRIVATE, 0)
al arrancar. El flag FRPRIVATE
mantiene la fuente aislada para ese proceso, eliminando dependencias del registro.
Automatización completa con PowerShell
Este script instala la fuente, actualiza el registro EUDC y reinicia el spooler. Ajusta la ruta y el código de página a tus necesidades:
# Ruta de la fuente
$fontPath = "C:\Temp\EUDC.ttf"
$targetPath = "$env:windir\Fonts\EUDC.ttf"
Copia si no existe
If (-not (Test-Path \$targetPath)) {
Copy-Item \$fontPath -Destination \$targetPath
}
Instala la fuente
Add-Type -AssemblyName System.Drawing
\[System.Drawing.Text.PrivateFontCollection]::new().AddFontFile(\$targetPath)
Registro EUDC global
\$pcode = "936"
\$key = "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\EUDC"
Set-ItemProperty -Path \$key -Name \$pcode -Value \$targetPath
Reinicia cola de impresión
Restart-Service -Name Spooler -Force
Write-Host "Fuente EUDC instalada y spooler reiniciado."
Pruebas de validación recomendadas
Tras aplicar cualquier cambio:
- Ejecuta
fc.exe /b
sobre un archivo de prueba antes y después; el tamaño del spool debería crecer unos bytes por cada glifo incrustado. - Verifica los event logs en Microsoft-Windows-PrintService/Admin; la ausencia de errores 372 o 372L indica que los glifos se han procesado.
- Imprime el mismo trabajo desde un cliente remoto y desde el servidor; ambos deben mantener la integridad del carácter.
Preguntas frecuentes (FAQ)
¿Puedo usar EUDC con Remote Desktop Services?
Sí, siempre que la fuente esté instalada en el servidor anfitrión y el control de impresiones redireccionadas use un driver compatible. A menudo el problema se confunde con las colas redireccionadas, pero la raíz sigue siendo la misma: el driver debe incrustar la fuente.
¿Qué pasa si mi impresora solo tiene driver V4?
Los modelos basados en Class Driver V4 usan XPS o PDF internamente. Instalar la extensión de política de grupo Render print jobs on client computers puede ayudar, pero en la práctica se recomienda migrar a un driver heredado V3 cuando se trabajen EUDC.
¿Hay impacto en el rendimiento?
Los glifos EUDC suelen añadirse como vectores simples y el tamaño añadido por página es mínimo (menos de 5 kB). No obstante, si tu fuente contiene centenares de símbolos, incrustarlos repetidamente puede aumentar el tamaño de spool; se aconseja usar font subsetting cuando sea posible.
Conclusión
Una correcta impresión de caracteres EUDC en Windows Server sin sesión interactiva depende, sobre todo, de que el servicio encuentre la fuente y el driver pueda incrustarla. Cambiar el controlador XPS por uno PCL/PostScript, registrar la fuente en HKLM y cargar el perfil de usuario del servicio resuelven la mayoría de los incidentes. Las estrategias avanzadas, como incrustar directamente el glifo o retrasar el spooler, ofrecen una capa adicional de fiabilidad en entornos donde cada trabajo debe salir perfecto a la primera.