Utskrift i bulk med Flex

Dette casestudiet demonstrerer hvordan man bruker PrintAdvancedDataGrid og en skikk itemRenderer å skrive ut flere sider med data og grafikk, ved hjelp av SWFloader komponent.


Endelig resultatforhåndsvisning

La oss se på det endelige resultatet vi skal jobbe for - nedenfor er en oversikt over en 12-siders PDF-utskrift fra et Flex-program ved hjelp av teknikkene i denne artikkelen:

flex_print_preview

Demonstrert i denne opplæringen:

  1. Bruke FlexPrintJob klasse.
  2. Ved hjelp av PrintAdvancedDataGrid.
  3. Opprette en egendefinert itemRenderer med en SWFLoader.
  4. Skriver ut et overskrift og bunntekst.
  5. Filtrering a collectionView.
  6. Skriver ut a Datagrid med høyde som overstiger 7500.

Noen vanskeligheter med hilsen til Flex-utskrift:

  1. Ditt innhold eller Datagrid Rader må alle være synlige på scenen, eller de vil ikke skrive ut.
  2. Å legge til manuelle sideskift er vanskelig, og oppnås ved å sette inn din rowHeight for å matche hva du vil vises på hver utskrevet side.
  3. Fleksibel utskrift går haywire hvis din total PrintAdvancedDataGrid Innholdshøyde er større enn ca. 7500 piksler, og krever en løsning på flere PrintAdvancedDataGrids.

Trinn 1: Importer utskriftsklassene

Begynn med å importere de nødvendige utskriftsklassene, så vel som utskriftsgjenkjenningen i Flex-prosjektet ditt:

 importere mx.printing.FlexPrintJob; importere mx.printing.FlexPrintJobScaleType; importer com.reiman.PrintItemRenderer;

Trinn 2: Opprett en visning for PrintAdvancedDataGrid og itemRenderer

Opprett en visning State for din masseutskrift. I mitt tilfelle opprettet jeg en stat som heter printState.

* Alternativt kan du opprette en forekomst av din PrintAdvancedDataGrid og itemRenderer og legg dem til scenen via actionscript, men for et bulkutskriftsprosjekt fant jeg at dette var for vanskelig å jobbe med, og da jeg prøvde å skrive ut SWF'er som er XML-drevne, trengte jeg å sørge for at mine SWFs var viser riktig før utskrift.


Trinn 3: Legg til PrintAdvancedDataGrid

     

Hvis du trenger et totalt utskriftsområde som er større enn 7500 i høyden, trenger du en annen PrintAdvancedDataGrid for hvert område


Trinn 4: Still inn PrintAdvancedDataGrid opsjoner

En ting jeg fant viktig var å sette alternativet

 sizetoPage = "true"

Ifølge PrintDataGrid Control-siden fra Adobe Flex 3 LiveDocs, sørger egenskapen sizeToPage for at PrintAdvancedDataGrid-kontrollen fjerner noen delvis synlige eller tomme rader, og å endre størrelsen på seg selv for å inkludere bare komplette rader i den nåværende visningen.


Trinn 5: Legg til itemRenderer

Legg til en vareBytte til din AdvancedDataGridColumn.

 

Trinn 6: Opprett itemRenderer Komponent

I mitt tilfelle ønsket jeg å utføre flere ting med itemRenderer:

  1. Legg til en SWFLoader
  2. legg til et overskrift med sidetittelen
  3. legg til en sidebetekst med min webadresse
  4. legg til avstand til topp, bunn og sider for riktig utskrift

Siden webadressen min fungerte bedre som vertikal tekst, fant jeg det mye bedre å bruke en SWF for denne teksten i stedet for en tekstboks. Du kan være kreativ med din itemRenderer, legger til dataposter fra XML- eller datakilden din, så vel som logoer, nettadresser, etc. Her er visningselementene fra innsiden av koden min for itemRenderer komponent, som også finnes i src / no / Reiman / PrintItemRenderer.mxml fil i nedlastingspakken for denne opplæringen:

                

Trinn 7: Legg til Grunnleggende Actionscript FlexPrintJob Kode til din main.mxml-fil

 offentlig funksjon print (): void var printJob: FlexPrintJob = ny FlexPrintJob (); printJob.printAsBitmap = false; hvis (printJob.start ()) printJob.addObject (printGrid); printJob.send (); 

Trinn 8: Sett utskriftsjobben Skala Type

Velg utskriftsjobben skala type du vil bruke (for å lese om FlexPrintJob skala, velg Flex LiveDocs-siden her), og sett inn alternativet printasBitmap alternativ. Jeg ville at varene mine skulle skrives ut som vektor, og faktisk var denne innstillingen nøkkelen til innholdsutskriftene mine riktig.

 printJob.printAsBitmap = false;

Trinn 9: Legg til kode for å utføre før utskriftsjobben

Legg til eventuelle varsler eller handlinger du vil utføre ved utskrift (for eksempel en advarsel for å fortelle brukeren å slå på LANDSCAPE-utskrift). For eksempel:

 Alert.show ("Vennligst still inn skriverinnstillingene til LANDSCAPE" + '\ n' + "eller spørringen din vil IKKE skrive ut riktig!")

Hvis du vil angi en Varsling, det må utføres før din utskrift begynner. Vennligst se koden som er oppgitt i nedlastingen assosiert med denne opplæringen for printAlert () i main.mxml fil.


Trinn 10: Still utskrift bredde og høyde variabler

Still inn før utskrift bredde og høydeverdier for PrintAdvancedDataGridbredde, og rowHeight

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

Trinn 11: Sett de nye verdiene

Angi de nye verdiene for høyde, bredde, og rowHeight å likestille FlexPrintJob verdier

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

Trinn 12: Legg til flere sider Kode til FlexPrintJob

Legg til koden din for å imøtekomme å legge til flere sider til utskriftsjobben. Ifølge Flex LiveDocs, dette neste side() sjekk skal sørge for at innholdet ditt skrives ut på riktig måte, uavhengig av din AdvancedDataGrid høyde, selv om jeg fant ut at etter en høyde på ca 7500, klarte utskriften ikke å fullføre riktig.

 mens (sant) printGrid.nextPage (); hvis (! printGrid.validNextPage) printJob.addObject (printGrid); gå i stykker; 

Trinn 13: Valgfritt Juster printGrid Høyde

Jeg fant ut at jeg fikk færre utskriftsfeil når jeg la dette til koden fra Trinn 12:

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

Så nå ser min totale kode for Trinn 12 slik ut:

 mens (sant) printGrid.nextPage (); hvis (! printGrid.validNextPage) printGrid.height = printGrid.measuredHeight; printGrid.verticalScrollPolicy = "off"; printJob.addObject (printGrid); gå i stykker; 

Dette ser ut til å ha med Flex 3s problem eller feil med hensyn til utskriftsdatabaser med stor høyde, noe som er et reelt problem for utskrift av ting som flere SWFer eller bilder, fordi datagridhøyden din faktisk må gjenspeile total høyde på bildene eller SWF blir trykt!


Trinn 14: Legg til koden for å legge til noe annet til din utskriftsjobben

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

Trinn 15: Send din utskriftsjobben

Lukk din utskriftsjobben, og utfør eventuelle tilleggsfunksjoner som en Varsling, og tilbakestille printGrid og printColumn verdier tilbake til hva de var før utskrift. Hvis du bruker en visning Stat for utskrift, der brukeren kanskje har en Utskriftssenter type grensesnitt der de kan se hva de skal skrive ut, vil dette være nyttig. Hvis du velger å legge til PrintAdvancedDataGrid til scenen via actionscript, da ville dette være unødvendig, og i dette trinnet ville du i stedet fjerne PrintAdvancedDataGrid fra scenen.

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

Trinn 16: Legg til en annen PrintAdvancedDataGrid hvis innholdet overskrider 7500 høyde

     

Trinn 17: Kopier din dataprovider og resultHandler

Min dataanrop så ut som dette opprinnelig:

 

Alt jeg trengte å gjøre var å legge til en ekstra resultatbehandler, slik at dataene for det andre PrintAdvancedDatagrid ville være separat:

 

Så la jeg til en ny resultatbehandler:

 privat funksjon httpResult_handler2 (evt: ResultEvent): void if (evt.result.lessons.row) var resultAC: ArrayCollection = evt.result.lessons.row som ArrayCollection; for (var jeg: int = 0; i 

Dette nye dataprovider for den andre PrintAdvancedDatagrid er satt i min stripQuiz2 () filterfunksjon.


Trinn 18: Legg til collectionView Variabler og tillegg dataprovider

I mitt tilfelle måtte jeg legge til 3 nye ListCollectionViews, og 1 mer dataprovider:

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

Trinn 19: Legg til filterFunction funksjoner

For de to datagrunnene jeg ønsket å skrive ut, trengte jeg filtre som ville utføre følgende funksjoner:

  1. Strip ut bestemte aktivitetstyper fra min utskriftsliste, da noen ikke var nødvendige
  2. Avkort dataene ved 12 oppføringer, ettersom jeg etter omfattende testing fant at dette var grensen for å skrive ut full side SWFs fra datagrid
  3. Fjern de første 12 oppføringene fra ListCollectionView for den andre PrintAdvancedDatagrid

Dette resulterte i opprettelsen av følgende funksjoner:

 privat funksjon stripQuiz (): void removeQuiz = new ListCollectionView (lessonsDataProvider); removeQuiz.filterFunction = quizStripped; removeQuiz.refresh (); quizLimit (); removeQuiz.refresh (); printGrid.dataProvider = removeQuiz;  privatfunksjon stripQuiz2 (): void removeQuiz2 = new ListCollectionView (lessonsDataProvider2); removeQuiz2.filterFunction = quizStripped; removeQuiz2.refresh (); quizPage2 (); removeQuiz2.refresh (); printGrid2.dataProvider = removeQuiz2;  Private Function QuizStripped (verdi: Object): Boolean (Return String (value.lessonIcon) .toUpperCase ()! = "QUIZ" && String (value.lessonIcon) .toUpperCase ()! = "HANGMAN" && String (value.lessonIcon ) .toUpperCase ()! = "FLASHCARDS" && String (value.lessonIcon) .toUpperCase ()! = "LAST NED" && String (value.lessonIcon) .toUpperCase ()! = "VIDEO" && String (value.fileName). toUpperCase ()! = "AKTIVER / AKTIVITETER / WORKSHEET_KIDS_AUDIO.SWF" && String (value.fileName) .toUpperCase ()! = "AKTIVER / AKTIVITETER / WORKSHEET_KIDS_AUDIO5.SWF";  private funksjon quizLimit (): void for (var jeg: int = removeQuiz.length-1; i> = 0; i--) hvis (removeQuiz.length> = 13) removeQuiz.removeItemAt (i);  privatfunksjon 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); 

Trinn 20: Legg til andre printGrid til utskriftsjobben

Før jeg sendte printJob, la jeg til den andre PrintAdvancedDatagrid å bli skrevet ut:

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

For en bedre titt på hele koden, last ned kildefilene som er tilknyttet denne opplæringen, og ta en titt på main.mxml fil.


Konklusjon

Dette er kanskje ikke den mest elegante løsningen til fleksibelt SWF fra Flex, men det er en løsning jeg fant pålitelig med høy kvalitet. Utskrift i Flex kan være en ekte bjørn, men det betyr ikke at du bør overse alternativene som er tilgjengelige for deg, spesielt ved bruk av PrintDatagrid og PrintAdvancedDatagrid. Tusen takk for at du har lest min opplæring, og jeg gleder meg til eventuelle spørsmål og kommentarer du måtte ha.