•     
  •     
  •     
  • Chuletas
  • News
  • PVPC
  • Uso básico de impresora CUPS desde un programa

    1. Introducción

    A CUPS se le proporciona el contenido de los trabajos de impresion en forma de ficheros en formato Postscript, PDF o texto, se interactúa con él mediante HTTP, según el protocolo IPP y las características de las impresoras se especifican y acceden mediante el estándar PPD, establecido por Adobe, que consiste en un fichero de definición de prestaciones y características de cada impresora.

    La librería cups oculta permite interactuar con CUPS sin entrar en los detalles de IPP y acceder al contenido del fichero PPD sin bajar al detalle de su procesado.

    El servidor CUPS ofrece la documentación CUPS a traves de HTTP, de forma que solo hay que apuntar un navegador a localhost:631/help para tener acceso a ella. El apartado programming se incluye la referencia de las diferentes APIs que soporta.Para el cliente, la CUPS API es la que interesa.

    2. Selección de impresora

    Las impresoras se conocen, a nivel de API, como destinos. Se puede obtener la lista de destinos accesibles al usuario que se ejecuta el programa y también la impresora predeterminada.

    La función cupsGetDests() proporciona la lista de impresoras como una matriz de estructuras cups_dest_t, para lo que se le pasa la dirección de un puntero y se asigna su retorno a un entero que contendrá el número de destinos, mientras que el puntero cuya dirección se le ha pasado contiene la dirección de la primera cups_dest_t:

    cups_dest_t *dests;
    int ndests = cupsGetDests(&dests);
    
    cupsFreeDests(ndests, dests);
    
    

    Para obtener la impresora predeterminada, se utiliza cupsGetDest(), a la que hay que pasarle la lista que se ha obtenido previamente con cupsGetDests() El primer argumento es el nombre de la impresora que se le pide, si se pone NULL, proporciona la predeterminada (el segundo argumento también es opcional, véase Instances):

    cups_dest_t *dests;
    int ndests = cupsGetDests(&dests);
    cups_dest_t *dest = cupsGetDest(NULL, NULL, ndests, dests);
    
    if (dest) {
         ...
    }
    
    cupsFreeDests(ndests, dests);
    
    

    3. Generando el contenido

    Como se ha dicho arriba, el contenido del trabajo de impresión se le entrega a CUPS en forma de fichero. Queda fuera de esta chuleta (quizá en otra) la manera de generar el fichero, sea Postscript, PDF o texto plano.

    4. Opciones CUPS

    Las opciones de CUPS son el equivalente de los atributos de IPP y, por tanto, como ellos, mezclan características de una impresora dada con las opciones que regulan cómo se ha de efectuar la impresión o las que indican qué características tiene el trabajo de impresión. En general, se puede distinguir entre los atributos (opciones) que describen la impresora y aquellos que describen el trabajo de impresión.

    La sección 4.4 de la especificación IPP enumera y describe las atributos (opciones en CUPS) relativos a las características de la impresora. Esos atributos IPP vienen como matriz de cups_option_t dentro de la estructura cups_dest_t que define una impresora en CUPS.

    La sección 4.3 de la especificación IPP enumera y describe los atributos (opciones en CUPS) relativos a qué características tiene un trabajo de impresión, mientras que la sección 4.2 lo hace con los relativos a las indicaciones sobre cómo debe procesarse el trabajo de impresión.

    Detalles sobre la forma en que CUPS implementa (y amplía) esos atributos puede encontrarse en http://localhost:631/help/spec-ipp.html y específicamente en http://localhost:631/help/spec-ipp.html?TOPIC=Specifications#PRINTER_ATTRIBUTES

    El siguiente código:

    
    cups_dest_t *dests;
    int ndests = cupsGetDests(&dests);
    cups_dest_t *dest = cupsGetDest(NULL, NULL, ndests, dests);
    
    if (dest) {
       cups_option_t const *options = dest->options;
       for (int ii=0; ii<dest->num_options; ++ii,++options)
        printf("option name='%s', value='%s'n",options->name, options->value);
    }
    
    

    Podría producir la siguiente salida:

    option name='media', value='A4'
    option name='finishings', value='3'
    option name='copies', value='1'
    option name='job-hold-until', value='no-hold'
    option name='job-priority', value='50'
    option name='number-up', value='1'
    option name='auth-info-required', value='none'
    option name='job-sheets', value='none,none'
    option name='printer-info', value='Lexmark X1100 Series'
    option name='printer-location', value='USB Printer'
    option name='printer-make-and-model', value='Lexmark 1100 Foomatic/lm1100 (recommended)'
    option name='printer-state', value='5'
    option name='printer-type', value='135180'
    
    

    Algunas de esas opciones indican características o estado de la impresora mientras que otras indican opciones por defecto.

    5. Características de la impresora

    Entre las opciones que indican características de la impresora se encuentran:

    printer-location

    Descripción humana concisa del lugar donde se encuentra la impresora

    printer-info

    Descripción sucinta de la impresora, normalmente incluye el fabricante y modelo.

    printer-state

    Código numérico que indica el estado de la impresora: 3, está inactiva, en espera de trabajo; 4, está imprimiendo; 5, detenida, indica que no acepta trabajos y se requiere la intervención de administrador u operador.

    printer-type

    Un número que se interpreta como máscara de bits de características de la impresora, cuyo significado puede verse en http://localhost:631/help/spec-ipp.html?TOPIC=Specifications#PRINTER_ATTRIBUTES.

    auth-info-required

    Una extensión de cups, cuyo valor puede ser none o una combinación de domain, user, password, cada una indicando un elemento de autenticación requerido.

    6. Opciones de impresión

    En algunas ocasiones, las opciones por defecto establecidas en la impresora son válidas para ejecutar un trabajo de impresión, pero a menudo se desea un tratamiento diferente en uno o mas aspectos. Para indicarlo a CUPS, cuando se le envía un trabajo, se adjunta una lista de opciones, que se maneja según el siguiente esquema:

    
    int num_options = 0;
    int job_id;
    cups_option_t *options = NULL;
    
    num_options = cupsAddOption("media", "iso-a5", num_options, &options);
    
    num_options = cupsAddOption("second", "value", num_options, &options);
    
    job_id = cupsPrintFile(dest->name, "testprint.ps", "Test Print", num_options, options);
    
    cupsFreeOptions(num_options, options);
    
    
    media

    Palabra clave que determina qué tamaño de papel y bandeja se usaran (se designa uno de ellos e implícitamente mediante él, el otro). Lo habitual es un nombre de tipo de papel de los definidos aquí

    orientation-requested

    Contiene un código numérico que especifica la orientación escogida: 3, vertical; 4, apaisado; 5, apaisado al contrario y 6, vertical al contrario. El apaisado normal es girado 90º a la izquierda.

    page-ranges

    Especificados como es habitual, separados por comas y en sentido ascendente. Es motivo de rechazo el solapamiento de rangos, pero no el especificar páginas inexistentes, que simplemente se ignoran.

    copies

    Número de copias a imprimir.

    print-quality

    3, borrador; 4, normal; 5 alta calidad.

    number-up

    Indica cuántas páginas de documento se han de incluir en cada página física

    job-sheets

    Indica página(s) inicial y/o final que se imprimirán adicionalmente al contenido que se envía. Contiene dos valores, que pueden consistir en none, standard o alguno que haya sido definido por el administrador.

    7. landscape/portrait

    El estándar IPP especifica que el atributo orientation-requested es una indicación para la impresora, que dependiendo del formato del documento, puede soportarlo o no.

    CUPS soporta la opción landscape en línea de comandos y, efectivamente, en encode.c, donde se codifican las opciones dentro de una request, se contempla la opción como boolean. Sin embargo, es posible que solo sirva para ficheros de texto plano, pues se supone que pdf y postscript ya llevan esa información dentro del documento.

    8. Instances

    cupsAddDest() registra un conjunto de opciones como opciones predeterminadas para el usuario que ejecuta el programa.