Actuellement en train de programmer une application pour une agence, j’ai été amené à utiliser la classe PrintJob. Peut-être que je ne suis pas doué, et je ne sais pas ce qu’en pense les autres développeurs flash, mais je me suis bien arraché les cheveux pendant plusieurs jours à débugger dans tous les sens mon flash pour que l’impression marche. Récapitulatif donc pour que d’autres ne se cassent pas les dents comme moi :
1/ Ici dans mon cas concret, je devais forcer une impression au format paysage. Rien de plus simple, il suffit de faire une rotation du displayObject que l’on veut imprimer en testant si le paramètre d’impression est réglé sur “portrait” et décaler sa position pour peu que son origine soit en haut à gauche :
import flash.printing.PrintJob; import flash.printing.PrintJobOrientation; var printJob:PrintJob = new PrintJob(); if (printJob.start()) { if (printJob.orientation == "portrait") { // positionning content _clip.rotation = 90; _clip.x = printJob.pageWidth; } printJob.send(); }
2/ Ne pas utiliser de polices système. Après rotation (point précèdent) de son displayObject, si les polices ne sont pas incluses, le résultat est imprévisible. Dans le meilleur des cas, le texte disparaÎt (sur PC, ie et firefox), dans le pire je me suis retrouvé avec des textes en escaliers sur mon mac. Pas de chance pour moi, la typo que je devais utiliser était de la Verdana. J’ai vraiment mis beaucoup de temps avant de comprendre le problème alors que le texte s’imprimait très bien au format paysage, caché sous des tonnes de masque et d’imbrications de clips.
3/ lorsque l’on veut imprimer un displayObject, le flash prend en compte la taille totale du clip. Dans mon cas je cherchais à imprimer la partie masquée (donc visible) d’une longue bande. Mon flash imprimait mon clip sur une petite surface de la feuille à gauche laissant un conséquent espace vierge de l’autre côté. Pour remédier à cela, j’ai changé l’homothétie de mon clip jusqu’à trouver empiriquement le bon rapport.
4/ La méthode addPage permet de créer des impressions multiPages, mais de displayObject différents. On peut donc imprimer un seul objet (qui peut contenir ce que l’on veut bien sûr) par page. Pour faire une impression d’une sprite trop longue sur plusieurs pages, il faut feinter. Essayer de déplacer la sprite puis d’appeler addPage ne marche pas. Il faut encapsuler ce que l’on veut imprimer dans une autre sprite et déplacer son contenu (notre sprite en l’occurrence).
import flash.printing.PrintJob; import flash.printing.PrintJobOrientation; var printJob:PrintJob = new PrintJob(); if (printJob.start()) { var tempContentHolder:Sprite = new Sprite(); var countPages:uint = 0; tempContentHolder.visible = false; tempContentHolder.addChild(__content); addChild(tempContentHolder); // for long page, we calculate the number of page to add if (__content.height > printJob.pageHeight) { countPages = Math.ceil(__content.height / printJob.pageHeight); } // adding pages for (var j = 0; j < countPages; j++) { printJob.addPage(tempContentHolder, new Rectangle(0,0, printJob.pageWidth, printJob.pageHeight)); __content.y -= printJob.pageHeight; } printJob.send(); }
5/ Si l'on désire une impression totale du clip, c'est-à-dire sans histoire de masque, Turtlebite Flash CMS Framework a écrit un classe qui simplifie beaucoup l'impression. Celle-ci permet le multipage, la gestion des marges, calcule automatiquement le ratio entre la taille de votre displayObject et le format de papier utilisé et quelques petits autres points. La classe est ici
Je n'ai d'ailleurs pas essayer le CMS en flash de Turtle Flash, mais le projet a l'air plutôt bien abouti.
Ton lien Turtle Flash ne fonctionne pas :(
oupsss ! c’est corrigé