Sitze gerade an einem Flash-Projekt und habe viel Zeit mit einem ActionScript 3-Bug vertan. In der Hoffnung anderen die langwierige Suche zu ersparen, hier ein kurzer Post zu dem Problem.
Ausgangssituation:
Ich habe einen Flash-Film (ActionScript 3), der ein Sprite erzeugt, dass explizit für den Ausdruck erzeugt. Diesem Sprite-Objekt werden via addChild() etliche TextFields und Bitmaps zugefügt.
Schicke ich dieses Sprite nun direkt per addPage() an den Drucker – mit der Standardeinstellung printAsBitmap=false – so erhalte ich einen guten Ausdruck. Meistens zumindests. Denn manche Drucker scheinen Probleme mit der Ausgabe der Druckdaten als Vektor zu haben.
Es bleibt also nichts anderes übrig als die Option printAsBitmap auf true zu setzen. Et voila – leere, weiße Seiten purzeln aus dem Drucker.
Des Rätsels Lösung fand ich auf David Doulls Blog. Das Sprite MUSS der Bühne als Child zugewiesen werden – sonst gibt das nix. Unglaublich, aber wahr.
Damit der Benutzer diesen Pfusch (von Adobe) nicht sieht, kann man das Sprite aber außerhalb des sichtbaren Bereichs der Bühne platzieren. Es druckt dann trotzdem.
Nach dem Drucken sollte man das Sprite natürlich wieder von der Bühne löschen.
Leider tritt bei diesem Vorgehen noch ein Problem auf: Die Darstellung von Texten ist nicht mehr genau so wie zuvor. Das Kerning oder so scheint sich mit der Umwandlung in ein Bitmap beim Drucken nicht gut zu vertragen. Bemerkbar machte sich das bei mir dadurch, weil ich manche Texte durch vorangestellte Leerzeichen “formatiert” hatte (Hüstel). Nicht die feine englische Art – aber auf dem Bildschirm und beim Drucken OHNE printAsBitmap gab es damit keine Probleme.
Lösung: Das Sprite vor dem Drucken mit Flash-Mitteln in ein Bitmap umwandeln, dieses Bitemap dann in einen MovieClip einhängen und diesen Movieclip dann wie zuvor beschrieben mit der Option printAsBitmap=true drucken.
Leider ist die Qualität des Ergebnis bei weitem nicht so hübsch wie die vektorbasierte Ausgabe – aber das verwundert wohl niemanden…
Falls es interessiert – hier noch der ActionScript-Code:
function drucken(evt:MouseEvent):void{
//Das Sprite in das ich meine Ausgabe schreibe:
var prSprite:Sprite = new Sprite();
//Diese 2 Zeilen sind bei meinem Projekt nötig, um die Ausgabe zu initialisieren – hat natürlich nichts mit der eigentlichen Druckthematik zu tun
aktzellen.readInputFelder();
var przellen:zellen = new zellen( prSprite , steuerung, 1100, 180 ); przellen.createsheet( prSprite ); przellen.cleansheet( prSprite );
//DruckJobOption: Ausgabe als Bitmap
var options:PrintJobOptions = new PrintJobOptions();
options.printAsBitmap = true;
//Skalierungsmatrix um die Ausgabe auf die Seite zu skalieren
var myMatrix:Matrix = new Matrix();
myMatrix.a = 0.72;
myMatrix.d = 0.72;
//PrintJob starten:
var pj:PrintJob = new PrintJob();
var success = pj.start();
if(success){
for(var i:int=1; i < = steuerung.Printbereichanzahl;i++){
//Die Ausgabe wird erzeugt und in das Sprite geschrieben:
przellen.drawsheetForPrint(prSprite,i);
//Das Sprite in ein BitMap überführen und skalieren: var imageData:
BitmapData = new BitmapData( prSprite.width+500, prSprite.height+500, false, 0xFFFFFF);
imageData.draw(prSprite, myMatrix2);
var imageData2:BitmapData = new BitmapData( imageData.width, imageData.height, false, 0xFFFFFF);
imageData2.draw(imageData, myMatrix, null, null, null, true);
var imageBmp:Bitmap = new Bitmap(imageData2);
//Das Bitmap in einen MovieClip einfuegen var printMC:
MovieClip = new MovieClip();
printMC.addChild(imageBmp);
//MovieClip MUSS (tolle Einzelleistung Adobe!) der Bühne als Child zugewiesen sein wenn es mit printAsBitmap ausgegeben werden soll!
//Der x-Wert sorgt dafür, dass der MovieClip nicht sichtbar ist
printMC.x = 1000;
this.addChild(printMC);
//Ausgabe an Drucker:
pj.addPage(printMC , new Rectangle(0,0,pj.paperWidth,pj.paperHeight), options);
//MovieClip wieder von Bühne löschen:
this.removeChild(printMC);
//Bitmap-Objekte aufräumen:
imageData.dispose();
imageData2.dispose();
}
//Druckauftrag abschliessen:
pj.send();
}
//Aufräumarbeiten für meine Ausgabeklasse und den Druckjob:
przellen.cleansheet(prSprite);
pj = null;
}
Nachtrag (11.05.2011): Leider führt obiger Code (zumindest bei mir) zu Fehlermeldungen der Druckertreiber.
Ich habe meine Ausgabe nun komplett von allen Bitmaps bereinigt, die Druckausgabe mache ich nun wieder mit printAsBitmap=false und ich füge mein Druck-Sprite der Bühne hinzu während des Druckens. Letzteres ist unbedingt nötig für MACs – scheint ein Fehler der Flash-Player für MAC zu sein.
Nun klappt das Drucken sowohl auf Windows als auch auf Mac OS X.
Recent Comments