Guía para imprimir desde Arch Linux a una impresora compartida por Windows usando CUPS y SMB.

Estado: ✅ Funciona — verificado con HP PSC 1400 series y Brother HL-L1222 (ambas host-based).


Lo importante (lo que realmente funciona)

Las impresoras baratas modernas (HP PSC 14xx, Brother HL-L1xxx, etc.) son host-based / GDI: no entienden PCL ni texto plano. Si les mandás datos “genéricos”, Windows dice “se imprimió” pero la impresora no saca nada. Para que funcione hace falta:

  1. Driver específico del modelo en Linux (NO everywhere, NO pxlmono).
  2. Usuario de Windows normal, con contraseña, con permiso Print. La cuenta Invitado/Guest NO sirve (ni con contraseña, ni con permisos totales en la impresora) y el anónimo tampoco — ver “Sin usuario” en Problemas.
  3. Para HP host-based: desactivar el soporte bidireccional (BIDI) en Windows (ver Paso 5).
  4. Enviar PDF, no texto plano (evita un crash del filtro texttopdf).

Corrección respecto a versiones anteriores: antes recomendaba pxlmono.ppd. No funciona en impresoras host-based (sale “impreso” en Windows pero no imprime nada). Usá el driver del modelo.


Requisitos previos

  • PC Windows con una impresora conectada (y compartida — ver Paso 0)
  • La IP de la PC Windows (ej: 192.168.0.203)
  • Una cuenta de Windows normal (grupo Usuarios) con contraseña y permiso Print en la impresora

Paso 0: En Windows — usuario y compartir (una sola vez)

En la PC que tiene la impresora (CMD/PowerShell como administrador). Si la impresora ya está compartida y usás un usuario con contraseña, pasá directo al Paso 1.

:: 1) Usuario con contraseña (dedicado, para no dejar tu contraseña en Linux)
net user arctest TuContraseñaSegura /add

:: 2) Compartir la impresora (el nombre del share es el que se ve con smbclient -L)
net share "HP PSC 1400 series"="\\LIVING\HP PSC 1400 series" /GRANT:Todos,FULL

(O desde GUI: Propiedades de la impresora > pestaña Compartir > “Compartir esta impresora”.)

Detalles verificados en la práctica:

  • La ACL por defecto al compartir (Todos: Imprimir) alcanza; no hace falta agregar el usuario a la seguridad de la impresora.
  • La cuenta Invitado/Guest no sirve aunque le pongas contraseña: el spooler acepta el trabajo y lo borra al instante (ver Problemas). Cualquier usuario normal con contraseña funciona — puede ser el usuario que ya usás, o uno dedicado como arctest.
  • Si usás contraseña no hace falta tocar políticas (verificado: ForceGuest=0, default en Win10 Pro).
  • Opcional — ocultar el usuario dedicado de la pantalla de login:
    reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\SpecialAccounts\UserList" /v arctest /t REG_DWORD /d 0 /f
    

Paso 1: Instalar CUPS + el driver de tu impresora

sudo pacman -S --needed cups cups-filters ghostscript a2ps

Driver según el modelo:

  • HP PSC / DeskJet (host-based): instalar hplip (provee hp-psc_1400_series.ppd, etc.)
    sudo pacman -S hplip
    
  • Brother HL-L1xxx / DCP-L2xxx: driver oficial desde AUR
    yay -S brother-hll1222        # ajustá el modelo al tuyo
    

Paso 2: Iniciar CUPS

sudo systemctl enable --now cups

Paso 3: Descubrir la impresora compartida en Windows

smbclient -L //192.168.0.203 -U usuario

Buscá el nombre del share de la impresora en la salida, por ejemplo:

HP PSC 1400 series   Printer

Paso 4: Agregar la impresora a CUPS (con el driver del modelo)

HP (driver hplip):

sudo lpadmin -p HP1400 \
  -v "smb://usuario:contraseña@192.168.0.203/HP%20PSC%201400%20series" \
  -P /usr/share/ppd/HP/hp-psc_1400_series.ppd.gz \
  -E

Brother (driver brother-hll1222):

sudo lpadmin -p Brother \
  -v "smb://usuario:contraseña@192.168.0.203/Brother%20HL-L1222%20Printer" \
  -P /usr/share/cups/model/Brother/brother-HLL1222-cups-en.ppd \
  -E

Nota: -P (ruta al PPD) es más robusto que -m para estos drivers.


Paso 5: ★ En Windows — desactivar el soporte bidireccional (BIDI) ★

Este es el fix clave para las HP host-based. Con BIDI activo, Windows consulta el estado por USB, lee un falso “cartucho de tinta vacío” y detiene el trabajo RAW a mitad (la impresora hace ruido y se traba sin imprimir).

PowerShell como administrador:

net stop spooler /y
Set-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\Print\Printers\NOMBRE DE LA IMPRESORA" `
    -Name Attributes -Value ((Get-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\Print\Printers\NOMBRE DE LA IMPRESORA").Attributes -band (-bnot 0x800)) -Type DWord
net start spooler

(Eso quita el bit 0x800 = PRINTER_ATTRIBUTE_ENABLE_BIDI.)

Nota: la impresora debe tener un usuario con permiso Print (Paso 0). El permiso se da desde Propiedades de la impresora > Seguridad, o con SetPrinter (API Win32).


Paso 6: Imprimir (usar PDF)

lp -d HP1400 documento.pdf
lp -d Brother documento.pdf

Problemas conocidos y soluciones

“Documento remoto de bajo nivel” + 0 páginas, sin ruido

La impresora host-based no entendió los datos (driver genérico o texto crudo). Usá el driver del modelo (Paso 1 y 4). everywhere y pxlmono no funcionan con estas impresoras.

HP: hace ruido, se traba, falso “cartucho de tinta vacío”

Falta desactivar BIDI en Windows (Paso 5). El estado de tinta es falso; el driver de Windows lo ignora pero el trabajo RAW se detiene. Desactivar BIDI lo arregla.

texttopdf crashea (signal 11) en CUPS

Enviá PDF, no .txt. El filtro texttopdf a veces falla; el camino PDF→driver no lo usa.

Sin usuario / con Invitado: NT_STATUS_ACCESS_DENIED o el trabajo desaparece

Probado a fondo en Windows 10: el anónimo y la cuenta Invitado/Guest no pueden imprimir, aunque:

  • a Invitado se le ponga contraseña,
  • la ACL de la impresora le dé permiso Print a Todos/Autenticados/anónimos (incluso control total).

El trabajo llega a la cola (evento 800 en el visor PrintService/Operacional) y Windows lo borra solo al instante (evento 310). Solo sirven usuarios normales con contraseña (grupo Usuarios). La solución es crear/uso un usuario normal (Paso 0) — no es un tema de permisos de la impresora.


Ejemplo real (cómo quedó en esta red)

Servidor: Windows 10 LIVING (192.168.0.203), impresoras HP PSC 1400 series y Brother HL-L1222 Printer compartidas. Cliente: Arch Linux. Usuario dedicado: arctest (oculto del login; su contraseña vive solo en la cola de CUPS, no en ningún tutorial).

# Colas CUPS (verificadas)
sudo lpadmin -p HP1400 -v "smb://arctest:CONTRASENA@192.168.0.203/HP%20PSC%201400%20series" \
  -P /usr/share/ppd/HP/hp-psc_1400_series.ppd.gz -E
sudo lpadmin -p Brother1222 -v "smb://arctest:CONTRASENA@192.168.0.203/Brother%20HL-L1222%20Printer" \
  -P /usr/share/cups/model/Brother/brother-HLL1222-cups-en.ppd -E

# Prueba rápida de credenciales (imprime una hoja con un renglón)
smbclient -U "arctest%CONTRASENA" "//192.168.0.203/HP PSC 1400 series" -c "print /tmp/test.txt"

# Imprimir de verdad
lp -d HP1400 documento.pdf
lp -d Brother1222 documento.pdf

Verificación en Windows (PowerShell) si algo falla:

Get-WinEvent -LogName 'Microsoft-Windows-PrintService/Operational' -MaxEvents 10 |
  ForEach-Object { $_.TimeCreated.ToString('HH:mm:ss')+' id='+$_.Id+' | '+($_.Message -replace '\s+',' ') }
  • 307 = el documento se imprimió ✓
  • 800 seguido de 310 = el trabajo se encoló y se borró (cuenta invitada/anónima, o error de acceso)
  • Para limpiar trabajos trabados en la cola:
    net stop spooler /y
    del C:\Windows\System32\spool\PRINTERS\*.*
    net start spooler
    

Notas importantes

  • No es necesario montar el recurso compartido (CIFS) para imprimir; el backend smb (smbspool) va directo.
  • Estas HP/Brother host-based solo imprimen bien en negro desde Linux si el cartucho de color no está activo; el texto y las páginas en negro salen perfecto.
  • El trabajo se renderiza en Linux y Windows solo actúa de spooler hacia la impresora USB.