[Vim] e365 failed to print postscript file

Nota rápida por si a alguien más le viene bien. La cuestión es que desde Vim no podía imprimir (desde LibreOffice lo hacía sin problemas). El error que arrojaba Vim era:

e365 failed to print postscript file

La cuestión es que el comando lpr (comando Linux para imprimir que Vim usa internamente) intentaba lanzar el trabajo a la impresora por defecto y ésta no estaba definida. En Ubuntu uso el sistema de impresión CUPS. Según el manual de CUPS, para conocer los nombres de impresoras disponibles podemos usar el comando lpstat:

$ lpstat -p -d

Y una vez conocido el nombre de las impresoras, puedes fijar una por defecto con lpoptions:

$ lpoptions -d hp_LaserJet_1300

¡Listo! Vim (GVim en mi caso) imprime ahora perfectamente 🙂

Sniffing de tráfico USB con Wireshark

Problema: una impresora HP LaserJet 1300 que funcionaba perfectamente en Ubuntu 9.10 ha dejado de hacerlo al actualizar a Ubuntu 10.04 el PC de sobremesa. Realmente el trabajo de impresión se envía, la impresora parpadea indicando que está recibiendo datos, pero nunca deja de parpadear, y no arrastra papel para imprimir.

Al conectar otro Ubuntu 10.04 – de un portátil – a la misma impresora, funciona perfectamente. Las versiones de CUPS, libpoppler, foomatic y compañía son las mismas en ambos ordenadores. Eliminando del PC completamente todos los programas indicados (apt-get remove –purge && rm -rf /etc/cups) y volviendo a instalar, no se soluciona el problema.

CUPS en modo debugger no indica ningún fallo (es posible ponerlo en modo debugger cambiando el DebugLevel en /etc/cups/cups.conf). Un diagnóstico de problemas de impresión tampoco arroja ningún resultado.

¿Cómo solucionar? Bien, la idea es ir al meollo de la cuestión: ¿qué se está enviando por USB a la impresora en uno y otro caso? ¿Cuál es la diferencia entre lo que envía el portátil y lo que envía el PC de sobremesa? Eso nos puede dar alguna pista.

Para capturar el tráfico USB nos valdremos de un kernel moderno y compilado con soporte debugs:

$ mount | grep debugfs
none on /sys/kernel/debug type debugfs (rw)

Lo siguiente es comprobar en qué bus USB tenemos conectada la impresora:

$ lsusb | grep Hewlett
Bus 007 Device 002: ID 03f0:1017 Hewlett-Packard LaserJet 1300

Ahora que tenemos todos los datos, arrancamos Wireshark y elegimos hacer sniffing sobre el bus USB apropiado. Al enviar un documento cualquiera a imprimir, veremos que hay actividad en Wireshark. En la imagen vemos que se ha convertido el documento a formato PostScript y eso es lo que se ha enviado a la impresora. Haciendo lo mismo desde el portátil, al enviar el mismo fichero a la misma impresora veo que hay diferencias precisamente al final del documento PostScript.

A partir de este punto el trabajo que he realizado no ha sido nada interesante, pues realmente ha sido un penoso proceso de prueba y error, copiando versiones de programas del portátil al PC, sin buenos resultados… hasta que en un foro he visto que para impresoras HP en Linux recomendaban encarecidamente instalar HPLIP, un conjunto de drivers y aplicaciones de gestión en Linux de la propia HP. Realmente hasta ahora nunca lo había usado (me bastaba con el soporte base que me daba CUPS), pero ha sido instalarlo, configurar una impresora desde hp-toolbox e imprimir a la primera.