Impresión a granel con Flex

Este estudio demuestra cómo usar PrintAdvancedDataGrid y una costumbre itemRenderer para imprimir múltiples páginas de datos y gráficos, utilizando la SWFloader componente.


Vista previa del resultado final

Veamos el resultado final en el que trabajaremos. A continuación, se presenta una descripción general de un PDF de 12 páginas impreso desde una aplicación de Flex utilizando las técnicas de este artículo:

flex_print_preview

Demostrado en este tutorial:

  1. Usando la clase FlexPrintJob.
  2. Utilizando PrintAdvancedDataGrid.
  3. Creando una costumbre itemRenderer con un SWFLoader.
  4. Imprimir un encabezado y pie de página.
  5. Filtrando un colecciónvista.
  6. Imprimiendo un Cuadrícula de datos Con altura que supera los 7500..

Algunas dificultades con respecto a la impresión flexible:

  1. Tu contenido o Cuadrícula de datos Las filas deben ser visibles en el escenario o no se imprimirán..
  2. Adición de saltos de página manuales es difícil, y se logra al configurar su altura de la fila para que coincida con lo que desea mostrar en cada página impresa.
  3. La impresión flexible se descompone si su total PrintAdvancedDataGrid la altura del contenido es mayor que aproximadamente 7500 píxeles, lo que requiere una solución de múltiples PrintAdvancedDataGrids.

Paso 1: importar las clases de impresión

Comience importando las clases de impresión necesarias, así como su procesador de impresión en su proyecto Flex:

 importar mx.printing.FlexPrintJob; importar mx.printing.FlexPrintJobScaleType; importar com.reiman.PrintItemRenderer;

Paso 2: Crear una vista para PrintAdvancedDataGrid y itemRenderer

Crear un estado de vista para su impresión a granel. En mi caso, creé un estado llamado printState..

* alternativamente, puedes crear una instancia de tu PrintAdvancedDataGrid y itemRenderer y los agrega al escenario a través de actionscript, pero para un proyecto de impresión masiva me resultó muy difícil trabajar con ellos, y mientras intentaba imprimir archivos SWF que funcionan con XML, necesitaba asegurarme de que mis archivos SWF estaban se muestra correctamente antes de imprimir.


Paso 3: Añade tu PrintAdvancedDataGrid

     

Si necesita un área de impresión total de más de 7500 de altura, necesitará otra PrintAdvancedDataGrid para cada area


Paso 4: Configura tu PrintAdvancedDataGrid opciones

Una cosa que me pareció importante fue configurar la opción.

 sizetoPage = "true"

De acuerdo con la página de Control PrintDataGrid de Adobe Flex 3 LiveDocs, la propiedad sizeToPage se asegura de que el control PrintAdvancedDataGrid elimine cualquier fila parcialmente visible o vacía y se redimensione para incluir solo filas completas en la vista actual.


Paso 5: Agrega tu itemRenderer

Agrega un itemRenderer a tu AdvancedDataGridColumn.

 

Paso 6: Crea el itemRenderer Componente

En mi caso, quise lograr varias cosas con el itemRenderer:

  1. Agrega un SWFLoader
  2. añadir un encabezado con el título de la página
  3. añadir un pie de página lateral con mi url
  4. agregue espacio en la parte superior, inferior y laterales para una impresión adecuada

Dado que mi URL funcionó mejor como texto vertical, me pareció mucho mejor usar un SWF para este texto en lugar de un cuadro de texto. Puedes ser creativo con tu itemRenderer, agregando elementos de datos desde su fuente de datos o XML, así como logotipos, URL, etc. Aquí están los elementos de visualización dentro de mi código para el itemRenderer componente, que también se encuentra en el src / com / reiman / PrintItemRenderer.mxml archivo en el paquete de descarga para este tutorial:

                

Paso 7: Agregue el Actionscript Básico FlexPrintJob Código a su archivo main.mxml

 función pública print (): void var printJob: FlexPrintJob = new FlexPrintJob (); printJob.printAsBitmap = false; if (printJob.start ()) printJob.addObject (printGrid); printJob.send (); 

Paso 8: Establecer PrintJob Tipo de escala

Elegir la PrintJob tipo de escala que desea utilizar (para leer sobre FlexPrintJob tipos de escala, consulte la página de Flex LiveDocs aquí) y, opcionalmente, configure la printasBitmap opción. Quería que mis artículos se imprimieran como vectores, y de hecho esta configuración fue clave para que mi contenido se imprimiera correctamente.

 printJob.printAsBitmap = false;

Paso 9: Agregar código a ejecutar antes de PrintJob

Agregue cualquier alerta o acción que desee realizar después de la impresión (como una alerta para decirle al usuario que active la impresión LANDSCAPE). Por ejemplo:

 Alert.show ("Establezca la configuración de su impresora en LANDSCAPE" + '\ n' + "o su prueba NO se imprimirá correctamente!")

Si desea configurar un Alerta, debe ejecutar antes de su impresión comienza Por favor mire el código provisto en la descarga asociada con este tutorial para la printAlert () en el main.mxml expediente.


Paso 10: Configura tu impresión anchura y altura Variables

Establecer su antes de imprimir valores de anchura y altura para el PrintAdvancedDataGridanchura, y altura de la fila

 var before_widdy = printColumn.width; var before_hiddy = printGrid.rowHeight; var widdy = printJob.pageWidth; var hiddy = printJob.pageHeight;

Paso 11: Establecer los nuevos valores

Establecer los nuevos valores para el altura, anchura, y altura de la fila para igualar el FlexPrintJob valores

 printColumn.width = widdy; printGrid.width = widdy; printGrid.rowHeight = hiddy;

Paso 12: Agregar código de varias páginas a FlexPrintJob

Agregue su código para acomodar agregando múltiples páginas a la PrintJob. Según el Flex LiveDocs, este siguiente página() se supone que la verificación para garantizar que su contenido se imprima correctamente independientemente de su AdvancedDataGrid altura, aunque encontré que después de una altura de aproximadamente 7500, la impresión no se completa correctamente.

 while (true) printGrid.nextPage (); if (! printGrid.validNextPage) printJob.addObject (printGrid); descanso; 

Paso 13: Opcional Ajusta el printGrid Altura

Descubrí que obtuve menos errores de impresión cuando agregué esto al código del Paso 12:

 printGrid.height = printGrid.measuredHeight; printGrid.verticalScrollPolicy = "off";

Así que ahora mi código total para el Paso 12 se ve así:

 while (true) printGrid.nextPage (); if (! printGrid.validNextPage) printGrid.height = printGrid.measuredHeight; printGrid.verticalScrollPolicy = "off"; printJob.addObject (printGrid); descanso; 

Esto parece tener que ver con el problema o error de Flex 3 con respecto a la impresión de áreas de datos con una gran altura, que es un problema real para la impresión de cosas como múltiples archivos SWF o imágenes, ya que su altura debe reflejar la altura total de las imágenes o archivos SWF. siendo impreso!


Paso 14: Agregue el Código para agregar cualquier otra cosa a su PrintJob

 printJob.addObject (printGrid2); printJob.addObject (swfLoader, FlexPrintJobScaleType.NONE);

Paso 15: envía tu PrintJob

Cierra tu PrintJob, y realizar cualquier función adicional, como una Alerta, y restableciendo el printGrid y imprimir Columna Los valores vuelven a ser lo que eran antes de imprimir. Si está utilizando un estado de vista para imprimir, donde el usuario tiene tal vez un Centro de impresión Escriba una interfaz donde puedan ver lo que están a punto de imprimir, esto sería útil. Si elige agregar el PrintAdvancedDataGrid al escenario a través de actionscript, entonces esto sería innecesario, y en este paso usted eliminaría el PrintAdvancedDataGrid desde el escenario.

 printJob.send (); printColumn.width = before_widdy; printGrid.width = before_widdy; printGrid.rowHeight = before_hiddy; Alert.show ("Print Job Complete!")

Paso 16: Añadir otro PrintAdvancedDataGrid si su contenido excede la altura de 7500

     

Paso 17: Duplica tu proveedor de datos y resultadoHandler

Mi llamada de datos se parecía a esto originalmente:

 

Todo lo que tenía que hacer era agregar un controlador de resultados adicional, para que los datos del segundo PrintAdvancedDatagrid Estaría separado:

 

Luego agregué un nuevo controlador de resultados:

 función privada httpResult_handler2 (evt: ResultEvent): void if (evt.result.lessons.row) var resultAC: ArrayCollection = evt.result.lessons.row as ArrayCollection; para (var i: int = 0; i 

Este nuevo proveedor de datos para el segundo PrintAdvancedDatagrid se establece en mi stripQuiz2 () función de filtro.


Paso 18: Añadir colecciónvista Variables y adicionales proveedor de datos

En mi caso, necesitaba agregar 3 nuevos ListCollectionViews, y 1 más proveedor de datos:

 [Bindable] private var removeQuiz: ListCollectionView = new ListCollectionView (); [Bindable] private var removeQuiz2: ListCollectionView = new ListCollectionView (); [Bindable] private var itemsQuiz: ListCollectionView = new ListCollectionView (); [Bindable] private var lessonsDataProvider2: ArrayCollection = new ArrayCollection ();

Paso 19: Añadir filtroFunción Funciones

Para los dos sitios de datos de los que deseaba imprimir, necesitaba filtros que realizaran las siguientes funciones:

  1. Eliminar ciertos tipos de actividades de mi lista de impresión, ya que algunos no eran necesarios
  2. Trunque los datos en 12 entradas, ya que, después de pruebas exhaustivas, descubrí que este era el límite para imprimir con éxito SWF de página completa desde la red de datos.
  3. Eliminar las primeras 12 entradas de la ListCollectionView para el segundo PrintAdvancedDatagrid

Esto dio lugar a la creación de las siguientes funciones:

 función privada stripQuiz (): void removeQuiz = new ListCollectionView (lessonsDataProvider); removeQuiz.filterFunction = quizStripped; removeQuiz.refresh (); quizLimit (); removeQuiz.refresh (); printGrid.dataProvider = removeQuiz;  función privada stripQuiz2 (): void removeQuiz2 = new ListCollectionView (lessonsDataProvider2); removeQuiz2.filterFunction = quizStripped; removeQuiz2.refresh (); quizPage2 (); removeQuiz2.refresh (); printGrid2.dataProvider = removeQuiz2;  función privada quizStripped (value: Object): Boolean return String (value.lessonIcon) .toUpperCase ()! = "QUIZ" && String (value.lessonIcon) .toUpperCase ()! = "HANGMAN" && String (value.lessonIcon ) .toUpperCase ()! = "FLASHCARDS" && String (value.lessonIcon) .toUpperCase ()! = "DOWNLOADS" && String (value.lessonIcon) .toUpperCase ()! = "VIDEO" && String (value.fileName). toUpperCase ()! = "ASSETS / ACTIVITIES / WORKSHEET_KIDS_AUDIO.SWF" && String (value.fileName) .toUpperCase ()! = "ASSETS / ACTIVITIES / WORKSHEET_KIDS_AUDIO5.SWF";  función privada quizLimit (): void for (var i: int = removeQuiz.length-1; i> = 0; i--) if (removeQuiz.length> = 13) removeQuiz.removeItemAt (i);  función privada quizPage2 (): void if (removeQuiz2.length> = 13) removeQuiz2.removeItemAt (12); removeQuiz2.removeItemAt (11); removeQuiz2.removeItemAt (10); removeQuiz2.removeItemAt (9); removeQuiz2.removeItemAt (8); removeQuiz2.removeItemAt (7); removeQuiz2.removeItemAt (6); removeQuiz2.removeItemAt (5); removeQuiz2.removeItemAt (4); removeQuiz2.removeItemAt (3); removeQuiz2.removeItemAt (2); removeQuiz2.removeItemAt (1); 

Paso 20: Añadir segundo printGrid a PrintJob

Antes de enviar el printJob, agregué el segundo PrintAdvancedDatagrid para ser impreso:

 printJob.addObject (printGrid2); printJob.send ();

Para ver mejor el código completo, descargue los archivos de origen asociados con este tutorial y eche un vistazo a la main.mxml expediente.


Conclusión

Puede que esta no sea la solución más elegante para los SWF de impresión masiva de Flex, pero es una solución que encontré que funciona de manera confiable, con resultados de alta calidad. Imprimir en Flex puede ser un verdadero oso, pero eso no significa que deba pasar por alto las opciones disponibles para usted, en particular mediante el uso de PrintDatagrid y PrintAdvancedDatagrid. Muchas gracias por leer mi tutorial, y espero cualquier pregunta y comentario que pueda tener.