Impresión de caracteres EUDC en Windows Server sin sesión iniciada: guía definitiva

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.

Índice

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

  1. Confirma el origen del driver. Abre printmanagement.msc y revisa que el tipo de procesador de impresión no sea XPS.
  2. 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.
  3. 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

PasoAcciónDetalle
1Cambiar el controladorSustituye 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.
2Instalación global de la fuenteCopia 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.
3Cargar el perfil en el servicioAbre 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.
4Usar cuenta dedicadaCrea 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.
5Validación rápidaCon todas las sesiones cerradas, lanza de nuevo printui.exe /k /n "NombreImpresora"; si el glifo aparece, la corrección es efectiva.
6Contactar al fabricanteAlgunos 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.

Índice