Bulk afdrukken met Flex

Deze casestudy laat zien hoe te gebruiken PrintAdvancedDataGrid en een gewoonte itemRenderer om meerdere pagina's met gegevens en afbeeldingen af ​​te drukken, met behulp van de SWFloader bestanddeel.


Eindresultaat voorbeeld

Laten we eens kijken naar het uiteindelijke resultaat waar we naartoe zullen werken - hieronder vindt u een overzicht van een PDF-pagina met 12 pagina's afgedrukt vanuit een Flex-toepassing met behulp van de technieken in dit artikel:

flex_print_preview

Demonstrated in This Tutorial:

  1. FlexPrintJob-klasse gebruiken.
  2. Gebruik makend van PrintAdvancedDataGrid.
  3. Een aangepast maken itemRenderer met een SWFLoader.
  4. Een kop- en voettekst afdrukken.
  5. Filteren van een collectionView.
  6. Afdrukken a Data rooster met een hoogte van meer dan 7500.

Enkele problemen met betrekking tot flexdruk:

  1. Uw inhoud of Data rooster rijen moeten allemaal zichtbaar zijn op het podium of ze zullen niet afdrukken.
  2. Het toevoegen van handmatige pagina-einden is moeilijk en wordt bereikt door het instellen van uw rijhoogte om overeen te komen met wat u op elke afgedrukte pagina wilt weergeven.
  3. Flex printen gaat in de war als je totaal PrintAdvancedDataGrid inhoud hoogte is groter dan ongeveer 7500 pixels, vereist een alternerende actie van meerdere PrintAdvancedDataGrids.

Stap 1: importeer de afdrukklassen

Begin met het importeren van de benodigde printklassen, evenals uw print-renderer in uw Flex-project:

 import mx.printing.FlexPrintJob; importeer mx.printing.FlexPrintJobScaleType; import com.reiman.PrintItemRenderer;

Stap 2: Maak een weergave voor PrintAdvancedDataGrid en itemRenderer

Maak een kijkstatus voor uw bulkafdrukken. In mijn geval heb ik een staat gemaakt met de naam printState.

* als alternatief kunt u een exemplaar van uw maken PrintAdvancedDataGrid en itemRenderer en voeg ze toe aan het podium via actionscript, maar voor een bulkprintproject vond ik dit te moeilijk om mee te werken en omdat ik probeerde SWF's af te drukken die XML-driven zijn, moest ik ervoor zorgen dat mijn SWF's correct weergeven vóór het afdrukken.


Stap 3: voeg uw toe PrintAdvancedDataGrid

     

Als u een totaal afdrukgebied van meer dan 7500 wilt hebben, hebt u een ander nodig PrintAdvancedDataGrid voor elk gebied


Stap 4: Stel uw wachtwoord in PrintAdvancedDataGrid opties

Een ding dat ik belangrijk vond, was om de optie in te stellen

 sizetoPage = "true"

Volgens de PrintDataGrid-besturingspagina van Adobe Flex 3 LiveDocs zorgt de eigenschap sizeToPage ervoor dat het besturingselement PrintAdvancedDataGrid gedeeltelijk zichtbare of lege rijen verwijdert en de grootte van de rijen wijzigt zodat alleen volledige rijen in de huidige weergave worden opgenomen.


Stap 5: voeg uw toe itemRenderer

Voeg een itemRenderer toe aan uw AdvancedDataGridColumn.

 

Stap 6: Maak het itemRenderer bestanddeel

In mijn geval wilde ik verschillende dingen bereiken met de itemRenderer:

  1. Voeg een ... toe SWFLoader
  2. voeg een kop toe met de paginatitel
  3. voeg een side footer toe met mijn url
  4. voeg afstand aan de bovenkant, onderkant en zijkanten toe voor een goede afdruk

Omdat mijn URL beter werkte als verticale tekst, vond ik het veel beter om een ​​SWF te gebruiken voor deze tekst in plaats van een tekstvak. Je kunt creatief zijn met je itemRenderer, gegevensitems uit uw XML- of gegevensbron toevoegen, evenals logo's, URL's, enz. Hier zijn de weergave-items in mijn code voor de itemRenderer component, die ook te vinden is in de src / com / Reiman / PrintItemRenderer.mxml bestand in het downloadpakket voor deze tutorial:

                

Stap 7: Voeg het Basic Actionscript toe FlexPrintJob Code naar uw main.mxml-bestand

 public function print (): void var printJob: FlexPrintJob = new FlexPrintJob (); printJob.printAsBitmap = false; if (printJob.start ()) printJob.addObject (printGrid); PrintJob.send (); 

Stap 8: Instellen PrintJob Schaaltype

Kies de PrintJob schaaltype dat u wilt gebruiken (om over te lezen FlexPrintJob schaaltypen, kijk hier op de Flex LiveDocs-pagina) en stel eventueel de printAsBitmap keuze. Ik wilde dat mijn items als vector zouden worden afgedrukt, en in feite was deze instelling de sleutel tot het correct afdrukken van mijn inhoud.

 printJob.printAsBitmap = false;

Stap 9: Voeg code toe die moet worden uitgevoerd vóór de PrintJob

Voeg eventuele waarschuwingen of acties toe die u wilt uitvoeren tijdens het afdrukken (zoals een waarschuwing om de gebruiker te vertellen LANDSCAPE-afdrukken in te schakelen). Bijvoorbeeld:

 Alert.show ("Stel je printerinstellingen in op LANDSCHAP" + '\ n' + "anders wordt je quiz NIET correct afgedrukt!")

Als u een. Wilt instellen alarm, het moet uitvoeren voor uw afdrukken begint. Bekijk de code in de download die bij deze tutorial hoort voor de printAlert () in de main.mxml het dossier.


Stap 10: uw afdrukken instellen breedte en hoogte Variabelen

Stel je vóór het afdrukken breedte- en hoogtewaarden voor de PrintAdvancedDataGridbreedte, en rijhoogte

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

Stap 11: Stel de nieuwe waarden in

Stel de nieuwe waarden in voor de hoogte, breedte, en rijhoogte gelijk aan de FlexPrintJob waarden

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

Stap 12: voeg meerdere pagina's code toe aan FlexPrintJob

Voeg uw code toe om tegemoet te komen aan het toevoegen van meerdere pagina's aan de PrintJob. Volgens de Flex LiveDocs dit volgende pagina() cheque moet ervoor zorgen dat uw inhoud correct wordt afgedrukt, ongeacht uw AdvancedDataGrid hoogte, hoewel ik ondervond dat na een hoogte van ongeveer 7500 het afdrukken niet correct is voltooid.

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

Stap 13: Optioneel Pas de printGrid Hoogte

Ik ontdekte dat ik minder afdrukfouten kreeg toen ik dit aan de code uit stap 12 toevoegde:

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

Dus nu ziet mijn totale code voor stap 12 er zo uit:

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

Dit lijkt te maken te hebben met het probleem van Flex 3 of met betrekking tot het afdrukken van datagrids met een grote hoogte, wat een echt probleem is bij het afdrukken van dingen zoals meerdere SWF's of afbeeldingen, omdat uw datagrid-hoogte feitelijk de totale hoogte van de afbeeldingen of SWF's moet weergeven wordt afgedrukt!


Stap 14: voeg de code toe om iets anders aan uw toe te voegen PrintJob

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

Stap 15: Verzend uw PrintJob

Sluit je PrintJob, en voer eventuele extra functies uit, zoals een alarm, en het opnieuw instellen van de printGrid en printColumn waarden terug naar wat ze waren voordat ze werden afgedrukt. Als u een weergavestatus gebruikt voor afdrukken, waar de gebruiker misschien een Print Center type interface waar ze kunnen zien wat ze gaan printen, dit zou handig zijn. Als u ervoor kiest om de PrintAdvancedDataGrid naar het podium via actionscript, dan zou dit niet nodig zijn, en in deze stap zou je in plaats daarvan de PrintAdvancedDataGrid van het podium.

 PrintJob.send (); printColumn.width = before_widdy; printGrid.width = before_widdy; printGrid.rowHeight = before_hiddy; Alert.show ("Afdruktaak voltooid!")

Stap 16: Nog een toevoegen PrintAdvancedDataGrid als uw inhoud de 7500-hoogte overschrijdt

     

Stap 17: Dupliceer je data provider en resultHandler

Mijn data-oproep zag er oorspronkelijk zo uit:

 

Het enige wat ik moest doen was een extra resultaat-handler toevoegen, zodat de gegevens voor de tweede PrintAdvancedDatagrid zou gescheiden zijn:

 

Vervolgens heb ik een nieuwe resultaatafhandelaar toegevoegd:

 private function httpResult_handler2 (evt: ResultEvent): void if (evt.result.lessons.row) var resultAC: ArrayCollection = evt.res.lessons.row als ArrayCollection; for (var i: int = 0; i 

Deze nieuwe data provider voor de tweede PrintAdvancedDatagrid is ingesteld in mijn stripQuiz2 () filterfunctie.


Stap 18: toevoegen collectionView Variabelen en extra data provider

In mijn geval moest ik 3 nieuwe toevoegen ListCollectionViews, en nog 1 data provider:

 [Bindbaar] private var removeQuiz: ListCollectionView = new ListCollectionView (); [Bindbaar] private var removeQuiz2: ListCollectionView = new ListCollectionView (); [Bindbaar] private var itemsQuiz: ListCollectionView = new ListCollectionView (); [Bindbaar] privé var-lessenDataProvider2: ArrayCollection = new ArrayCollection ();

Stap 19: toevoegen filterFunction functies

Voor de twee datagrids waarvan ik wilde afdrukken, had ik filters nodig die de volgende functies zouden uitvoeren:

  1. Strip bepaalde activiteitstypen uit mijn druklijst, omdat sommige niet nodig waren
  2. Afkappen van de gegevens bij 12 ingangen, omdat ik na uitgebreide tests tot de conclusie kwam dat dit de limiet was voor het met succes afdrukken van SWF's van de volledige pagina uit de datagrid
  3. Verwijder de eerste 12 vermeldingen van de ListCollectionView voor de 2e PrintAdvancedDatagrid

Dit resulteerde in het creëren van de volgende functies:

 private function stripQuiz (): void removeQuiz = new ListCollectionView (lessonsDataProvider); removeQuiz.filterFunction = quizStripped; removeQuiz.refresh (); quizLimit (); removeQuiz.refresh (); printGrid.dataProvider = removeQuiz;  private function stripQuiz2 (): void removeQuiz2 = new ListCollectionView (lessonsDataProvider2); removeQuiz2.filterFunction = quizStripped; removeQuiz2.refresh (); quizPage2 (); removeQuiz2.refresh (); printGrid2.dataProvider = removeQuiz2;  private functie 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 ()! = "ACCOUNTANTS / ACTIVITEITEN / WORKSHEET_KIDS_AUDIO.SWF" && String (value.fileName) .toUpperCase ()! = "ACTIVEREN / ACTIVITEITEN / WORKSHEET_KIDS_AUDIO5.SWF";  quizLimit privéfunctie quizLimit (): void for (var i: int = removeQuiz.length-1; i> = 0; i--) if (removeQuiz.length> = 13) removeQuiz.removeItemAt (i);  persoonlijke functie 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); 

Stap 20: voeg het tweede toe printGrid naar PrintJob

Voordat ik de printJob stuurde, voegde ik de tweede toe PrintAdvancedDatagrid worden afgedrukt:

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

Download de bronbestanden die bij deze zelfstudie horen en bekijk de volledige code voor een betere kijk op de volledige code main.mxml het dossier.


Conclusie

Dit is misschien niet de meest elegante oplossing voor bulksafgedrukte SWF's van Flex, maar het is een oplossing die ik betrouwbaar heb gevonden, met uitvoer van hoge kwaliteit. Afdrukken in Flex kan een echte beer zijn, maar dat betekent niet dat u de opties die voor u beschikbaar zijn moet overzien, in het bijzonder door het gebruik van PrintDatagrid en PrintAdvancedDatagrid. Hartelijk dank voor het lezen van mijn zelfstudie en ik kijk uit naar eventuele vragen en opmerkingen.