Interfaz de impresión del sistema y tareas del motor de ejecución de Flash

Flash Player 9 y posterior, Adobe AIR 1.0 y posterior

Debido a que los motores de ejecución de Flash distribuyen páginas a la interfaz del impresión del sistema operativo, deben conocerse las tareas administradas por ambas aplicaciones y las tareas administradas por la interfaz de impresión del sistema operativo. Los motores de ejecución de Flash pueden iniciar un trabajo de impresión, leer parte de la configuración de página de una impresora, pasar el contenido de un trabajo de impresión al sistema operativo y verificar si el usuario o el sistema han cancelado un trabajo de impresión. Otros procesos, como mostrar los cuadros de diálogo específicos de la impresora, cancelar un trabajo de impresión en cola o notificar el estado de la impresora son tareas que gestiona el sistema operativo. Los motores de ejecución de Flash pueden responder si hay un problema para iniciar o dar formato a un trabajo de impresión, pero solo pueden ofrecer información sobre determinadas propiedades o condiciones de la interfaz de usuario del sistema operativo. Como desarrollador, su código debe poder responder a estas propiedades o condiciones.

Trabajo con excepciones y valores devueltos

Si el usuario ha cancelado el trabajo de impresión, hay que comprobar si el método PrintJob.start() devuelve true antes de ejecutar llamadas a addPage() y send() . Una forma sencilla de comprobar si se han cancelado estos métodos antes de continuar es incluirlos en una sentencia if , tal y como se muestra en el siguiente ejemplo:

if (myPrintJob.start()) 
{ 
    // addPage() and send() statements here 
}

Si PrintJob.start() es true , el usuario seleccionó Print (o un motor de ejecución de Flash, como as Flash Player o AIR, ha iniciado un comando Print). Por lo tanto, se puede llamar a los métodos addPage() y send() .

Asimismo, para ayudar a administrar el proceso de impresión, los motores de ejecución de Flash emiten excepciones para el método PrintJob.addPage() , de forma que es posible capturar errores y proporcionar información y opciones al usuario. Si un método PrintJob.addPage() no se ejecuta correctamente, se puede llamar a otra función o detener el trabajo de impresión actual. Estas excepciones se pueden capturar incorporando llamadas addPage() en una sentencia try..catch , tal y como se muestra en el siguiente ejemplo. En el ejemplo, [params] es un marcador de posición para los parámetros, que especifica el contenido real que se desea imprimir:

if (myPrintJob.start()) 
{ 
    try 
    { 
        myPrintJob.addPage([params]); 
    } 
    catch (error:Error) 
    { 
        // Handle error,  
    } 
    myPrintJob.send(); 
}

Cuando se inicia el trabajo de impresión, se puede añadir contenido mediante PrintJob.addPage() y ver si se genera una excepción (por ejemplo, si el usuario ha cancelado el trabajo de impresión). Si es así, se puede añadir lógica a la sentencia catch para proporcionar al usuario (o el motor de ejecución de Flash) información y opciones, o bien, se puede detener el trabajo de impresión actual. Si se añade la página correctamente, se puede continuar enviando las páginas a la impresora mediante PrintJob.send() .

Si los motores de ejecución de Flash encuentran un problema al enviar el trabajo de impresión a la impresora (por ejemplo, si la impresora está sin conexión), se puede capturar también dicha excepción y proporcionar al usuario información o más opciones (por ejemplo, mostrar el texto de un mensaje o proporcionar una alerta en una animación). Por ejemplo, puede asignar texto nuevo a un campo de texto en una sentencia if..else , tal y como se indica en el siguiente código:

if (myPrintJob.start()) 
{ 
    try 
    { 
        myPrintJob.addPage([params]); 
    } 
    catch (error:Error) 
    { 
        // Handle error.  
    } 
    myPrintJob.send(); 
} 
else 
{ 
    myAlert.text = "Print job canceled"; 
}

Para ver ejemplos de uso, consulte Ejemplo de impresión: Ajuste de escala, recorte y respuesta .

Trabajo con las propiedades de página

Cuando el usuario hace clic en Aceptar en el cuadro de diálogo Imprimir y PrintJob.start() devuelve true , se puede acceder a las propiedades definidas por la configuración de la impresora. Estas propiedades se refieren a la anchura del papel, la altura del papel ( pageWidth y pageHeight ) y a la orientación del contenido en el papel. Debido a que se trata de la configuración de impresora, no controlada por el motor de ejecución de Flash, no es posible modificarla; sin embargo, se puede utilizar para alinear el contenido enviado a la impresora para que coincida con la configuración actual. Para obtener más información, consulte Configuración del tamaño, la escala y la orientación .

Configuración de la representación vectorial o de mapa de bits

Es posible configurar manualmente el trabajo de impresión para que cada una de las páginas se coloque en cola como un gráfico vectorial o una imagen de mapa de bits. En algunos casos, la impresión vectorial producirá un archivo de cola más pequeño y una imagen mejor que la impresión de mapa de bits. Sin embargo, si el contenido incluye una imagen de mapa de bits y se desea conservar la transparencia alfa o los efectos de color, se debe imprimir la página como una imagen de mapa de bits. Además, las impresoras que no son PostScript convierten automáticamente los gráficos vectoriales en imágenes de mapa de bits.

Para especificar la impresión de mapa de bits, pase un objeto PrintJobOptions como tercer parámetro de PrintJob.addPage() .

Para Flash Player y AIR anterior a AIR 2, defina el parámetro printAsBitmap del objeto PrintJobOptions como true del modo siguiente:

var options:PrintJobOptions = new PrintJobOptions(); 
options.printAsBitmap = true; 
myPrintJob.addPage(mySprite, null, options);

Si no se especifica un valor para el tercer parámetro, el trabajo de impresión utilizará el valor predeterminado, que es la impresión vectorial.

Para AIR 2 y posterior, utilice la propiedad printMethod del objeto PrintJobOptions para especificar el método de impresión. Esta propiedad acepta tres valores que se definen como constantes en la clase PrintMethod:

  • PrintMethod.AUTO : selecciona automáticamente el mejor método de impresión basándose en el contenido que se va a imprimir. Por ejemplo, si la página contiene texto, se elige el método de impresión vectorial. Sin embargo, si hay una imagen con marca de agua y transparencia alfa sobre el texto, se opta por la impresión de mapa de bits para conservar la transparencia.

  • PrintMethod.BITMAP : fuerza la impresión de mapa de bits sin importar el contenido

  • PrintMethod.VECTOR : fuerza la impresión vectorial sin importar el contenido

Sincronización de las sentencias del trabajo de impresión

ActionScript 3.0 no restringe un objeto PrintJob a un solo fotograma (como ocurría en versiones anteriores de ActionScript). Sin embargo, como el sistema operativo muestra al usuario información del estado de la impresión después de que el usuario haya hecho clic en el botón Aceptar del cuadro de diálogo Imprimir, debería llamarse a PrintJob.addPage() y PrintJob.send() , en cuanto sea posible, para enviar páginas a la cola. Una demora al llegar al fotograma que contiene la llamada a PrintJob.send() retrasará el proceso de impresión.

En ActionScript 3.0 hay un límite de tiempo de espera de script de 15 segundos. Por lo tanto, el tiempo entre cada sentencia principal de una secuencia de un trabajo de impresión no puede superar los 15 segundos. Dicho de otro modo, el límite de tiempo de espera del script de 15 segundos se aplica a los siguientes intervalos:

  • Entre PrintJob.start() y el primer PrintJob.addPage()

  • Entre PrintJob.addPage() y el siguiente PrintJob.addPage()

  • Entre el último PrintJob.addPage() y PrintJob.send()

Si alguno de los intervalos anteriores dura más de 15 segundos, la siguiente llamada a PrintJob.start() en la instancia de PrintJob devolverá false y el siguiente PrintJob.addPage() de la instancia de PrintJob hará que Flash Player o AIR emitan una excepción de tiempo de ejecución.