Flashhilfe.de - Flash Community

PrintJob: Druck mit Skalierung & Seitenausrichtung [Flash 7]

 


AntwortenRegistrieren Seite1 2  

pact kiz reman#1
Benutzerbild von pact kiz reman
Beiträge: 172
Registriert: May 2006

04.05.2006, 11:40

Hallo,

meinen ersten Beitrag in diesem Forum will ich mal nutzen, um etwas halbweg nützliges zu posten. Fragen kommen bei mir noch genug auf, also gehe ich mal in Vorleistung. Kurze Info zu mir: jung, Designer, kann nur so halbwegs mit AS umgehen und saugt gerade Wissen auf.

Zum Thema: Ich habe mich in letzter Zeit mit dem Thema Drucken beschäftigt. Man findet zwar einige wirklich gute Ideen und Scripts, aber ich denke man kann das Thema ruhig nochmal aufgreifen.
Mein Ziel war eine Druckfunktion zu erstellen, die mir mit meinen einfachen Kenntnissen ermöglicht, einen Flashfilm an z.B. ein A4 Blatt angepasst (skaliert) auszudrucken. Dann habe ich mich noch mit dem Problem der Druckausrichtung, also ob Hoch- oder Querformat beschäftigt und ein Script erstellt, dass eigentlich ganz okay ist um eine einfache Druckfunktion zu starten. Achtung! Ich möchte hier gleich mal erwähnen, dass es sich im kommenden Beisiel nicht um eine "echte" Seitenanpassung handelt, und auch die Ränder nur "Pseudoränder" sind. Mir ist klar, dass man das mit einem ausgefeilten Script noch besser hinbekommen kann. Ich habe das hier jedoch halbwegs kreativ auf meine Weise gelöst. Wer das also noch verbessern kann, sollte das auch tun!

Start.
Die Funktion soll, in einem Button integriert, alle Inhalte auf der Bühne drucken. Dabei sollen auch Komponenten wie ScrollPane-Inhalte etc. zu sehen sein. Gedruckt werden soll immer das aktuelle Bild.
Die Ausgabegröße auf dem Papier soll unabhängig von der Filmgröße in px einstellbar (skaliert) sein. Es soll dabei erkannt werden, ob der Benutzer die Seite im Hoch- bzw. Querformat druckt und es soll dabei jeweils eine ander Größe ausgegeben werden. Zudem soll der Druck halbwegs mittig auf dem Papier platziert sein.

Schaut euch bitte zunächst mal die FLA an.
Wenn ihr euch den Code in der FLA anseht (ist kommentiert), steigt ihr sicher schnell durch.
Komplizierter wird es bei meinem "freien, kreativen" Dazutun! Daher bedarf das noch einiger Erklärung. Also, FLA ansehen und hier weiterlesen um die Funktion auch anpassen zu können!

Anpassen der FLA.
Welches Codestück was macht, ist ja kommentiert. Interessant ist eigentlich nur, wie man Ränder und die entsprechende Ausgabegröße einstellt. Dafür habe ich ein lustige kleine Rechnung die erklärt, wie und warum das funktioniert. Jetzt gehen wir mal zurück zu den Basics in der Flash Hilfe.
Vorweg noch kurz: man kann hier sozusagen nur eine feste Ausgabegröße in (umgerechnet) cm angeben, nicht aber den Druckbereich automatisch an das gewählte Papierformat anpassen lassen. (Das kann ja mal noch einer posten!)

Berechnung der Seitengröße und Skalierung.
Zunächst sollte man wissen, dass 72px bei uns 1" (Inch) entsprechen. In cm entsprechen 72px also 2,54cm (1" entspricht 2,54cm). 1cm entspricht also rund 28,34px (abgerundet).
Rechnet man also mit diesem Verhältnis mal die Seitenbreite eines A4 Blattes hochkant in Pixeln aus, erhält man die max. Breite für seinen Flashfilm. Jedenfalls wenn der Film 21cm Breite beim Drucken nicht überschreiten soll (ohne Rand). Die Rechnung ist einfach (alles ist etwas abgerundet):

1cm entspricht ca. 28,34px
21cm entsprechen ca. 595,14px (kurze A4 Seite)
29,7 cm entsprechen ca. 841,69px (lange A4 Seite)

Jetzt wissen wir also, dass unser Flashfilm nicht größer sein darf, wenn wir ihn 1:1 ausdrucken wollen. Tatsächlich sind viele Projekte größer oder sogar so klein, dass man sie gerne vergrößert auf's Papier bringen möchte. Dafür müssen wir den Film skalieren. In der FLA könnt ihr diese Funktion ja sehen. Um den richtigen Skalierungswert (hier %) zu errechnen, müsst ihr so vor gehen:

Skalierung errechnen.
Unser Ziel ist es jetzt, einen film der 800px breit ist, so zu skalieren, dass er möglichst exakt auf 21cm Papierbreite passt (Ränder sind noch nicht berücksichtigt).
595,14px teilen wir durch 800px, dann erhalten wir den Skalierungsfaktor: (0,7439 x 100) 74,39%.
Das ganze müssen wir dann noch fürs Querformat machen. - Also wenn ihr eure Filmbreite nehmt, den Faktor errechnet und alles toll in den Code eintragt, wird euer Flashfilm so grob randlos aufs Papier gebracht. (Kann man z.B. mit dem Flashpaper Druckertreiber Testen.)
Das ganze funktioniert natürlich nur, wenn man davon ausgeht, dass der User auch z.B. A4 Papier zum Drucken nutzt. Bei kleineren Formaten würde dann was abgeschnitten werden, bei größeren würde es zu klein wirken.

Ränder hinzufügen, Film zentrieren.
Es ist möglich einen Rand um den zu druckenden Film festzulegen. Dabei solltet ihr aber beachten, dass der "echte" Druckrand des jeweiligen Druckers noch dazu kommt. Ausgehend von den Koordinaten 0,0 wird euer Film also nach links bzw. unter auf dem Papier verschoben. Folgende Rechnung muss man in der Praxis also noch etwas ändern. Um in Flash einen Rand links und oben zu erzeugen, gebt ihr bei xMin + yMin jeweils einen Minuswert an. Also z.B. -28,34. Da diese Werte sozusagen die Position des Druckbereiches gemessen an x0,y0 angeben, kann man den Film also entweder (+)28,34 Pixel beschneiden lassen (Druckbereich fängt dann also 28,34px weiter links oder unten an) oder man addiert den Bereich weiter rechts und oben von der Bühne noch dazu. Euer Film wird also um den jeweiligen Wert größer. Dabei wird der Bereich links und/oder oben von der Bühne mit in den Druckbereich eingezogen. Verborgende Objekte müssen also eventuell mit einem weißen Balken abgedeckt werden. Guckt euch dazu einfach auch die FLA an.
Wenn man also Ränder haben möchte die z.B. links und rechts gleich groß sind, muss man diese Werte mit in seine Skalierungsrechnung einbeziehen. Dabei sollte man wissen, dass es ohne großen mathematischen Aufwand nicht genau möglich ist, die Randbreite in cm im Voraus zu ermitteln. Man kann also entweder nur schätzen, oder macht eine Näherung (Immer wieder rechnen und bei jedem Durchlauf wird das Ergebnis genauer). Hier mal ein Beispiel dazu:
Wir wissen ja jetzt, dass 1cm auf dem Papier ca. 28,34px entspricht. Möchte ich also einen 1cm Rand um meinen Film haben, gebe ich bei .Min -28,34 ein. Bei .Max addiere ich diesen Wert zu der tatsächlichen Filmgröße dazu, also: 828,34px. Wenn ich also den Film mit 100% seiner Größer Drucken würde, hätte ich also 1cm Rand. Jetzt skalieren wir diesen aber. Dazu müssen wir die Skalierungsrechnung neu machen:
28,34px (Rand links) + 800px (Bühnenbreite) + 28,34px (Rand rechts) = 856,68px.
(595,14 durch 856,68) x 100 = 69,47%. Jetzt haben wir den Rand mit der Bühne auf die Papierbreite skaliert. Klar, dass der Rand jetzt nicht mehr 1cm entspricht, sondern eben ca 69% davon. Unser Rand ist jetzt also ca. 0,695cm Breit. Es ist möglich nun, den Faktor zu errechnen, den es Braucht um schließlich auf einen cm zu kommen. Dabei muss man aber alles neu Eingeben und errechnen. Wenn man dann durch ist, hat man einen genaueren Wert, etc. 100% wird's aber nicht. Mein Tipp, schätzen! Ich habe zwar schon einmal woanders erklärt wie man das rechnen könnte, aber das macht eh keiner. Schaut mal auf die Werte im FLA. Mein Tipp ist jetzt nach der Skalierungsrechnung bei den .Min Werten etwas für den tatsächlichen vom Drucker erzeugten Rand abzuziehen. Probiert halt mal rum.

Ich hoffe, ihr werdet draus schlau und das Gesülze kann jemand gebrauchen. Es ist zwar keine professionelle Lösung, aber sie funktioniert. Und wenn jemand weiß, wie man den Code so hinbekommt, dass er die echte Papiergröße vom Drucker ermittelt, ich bin der erste der's Wissen will!

Gruss + Dank!
Patrick
Gruss + Dank!
Patrick

Angehängte Dateien:
Komprimierte Datei pz_print.zip14.19 KB
Geändert von pact kiz reman am 04.05.06 um 11:46 Uhr
Werbung
Beiträge: 0
Registriert: Feb 2016


look#2
Benutzerbild von look
Beiträge: 1
Registriert: Nov 2006

24.11.2006, 11:29

Hi Patrick,

danke für Dein nützliches Script, das mir meinen wohlverdienten Feierabend gerettet hat. Bisher hatte ich vergeblich versucht, ein ähnliches Feature (eigentlich ging es bei mir nur um den Ausdruck des aktuellen Frames der Root über eine Schaltfläche) über die Standardfunktionen "print"  bzw. "printAsBitmap" umzusetzen, mit "printJob" hatte ich noch keine Erfahrung.

Viele Grüsse
Thomas
(jung, Designer, kann nur so halbwegs mit AS umgehen und saugt gerade Wissen auf;-)

mediatlantis#3
Benutzerbild von mediatlantis
Beiträge: 2
Registriert: Apr 2007

25.04.2007, 12:07

Hallo Patrick!

Vielen Dank für das sehr brauchbare Script- es kommt leider nur allzu selten vor, dass jemand etwas nützliches verfaßt, es zur Verfügung stellt und auch noch so umfangreich dokumentiert- weiter so!

Mike Nottebrock
c/o mediatlantis.de

pact kiz reman#4
Benutzerbild von pact kiz reman
Beiträge: 172
Registriert: May 2006

Themenautor/in

26.04.2007, 08:26

Vielen Dank für das Lob!

Ich habe dann auch noch eine Ergänzung zu meinem Beitrag oben, diese betrifft die Rechnung für den Papierrand:

Als ich damals den Beitrag verfasste, ging ich immer von der Bühnengröße und ihrem Skalierungsfaktor aus um den Rand zu errechnen. Man kann das aber doch genauer machen. Dazu ziehen wir, vor der Rechnung des Skalierungsfaktors der Bühne auf dem Papier, einfach den gewünschten Rand in cm von der Papiergröße ab. So gehen wir also nicht von 21 cm Papierbreite aus, sondern von z.B. nur 19 cm. Dann errechnen wir den Skalierungsfaktor der Bühne, die an 19 cm Breite angepasst sein soll. So einfach ist das. Wir erhalten also links und rechts je 1 cm Rand.

Warum ich damals nicht drauf gekommen bin, weiß ich auch nicht. Naja, jetzt ist's ja online.

Gruß!
Gruss + Dank!
Patrick
Geändert von pact kiz reman am 26.04.07 um 08:27 Uhr
Werbung
Beiträge: 0
Registriert: Feb 2016


atlanter#5
Benutzerbild von atlanter
Beiträge: 1
Registriert: Jul 2007

06.08.2007, 18:08

Super dein Beitrag!! Klasse und danke!!

syringe#6
Benutzerbild von syringe
Beiträge: 3
Registriert: Aug 2007

13.08.2007, 14:37

Super gemacht, funktioniert einwandfrei!!!
Gibt es denn auch noch eine Variante, mit der man ALLE Seiten drucken kann???

burnZ#7
Benutzerbild von burnZ
Beiträge: 2827
Wohnort: Bayern
Registriert: Aug 2005

13.08.2007, 16:33

inwiefern alle? man fügt seiten doch durch addPage hinzu, und zwar soviele wie nötig.

syringe#8
Benutzerbild von syringe
Beiträge: 3
Registriert: Aug 2007

13.08.2007, 20:44

also mit Seiten meine ich die Frames. Ich möchte nicht nur den aktuellen Frame drucken sondern alle Frames.
was für Seiten fügt addPage überhaupt zu? Ich verstehe das leider nicht

burnZ#9
Benutzerbild von burnZ
Beiträge: 2827
Wohnort: Bayern
Registriert: Aug 2005

13.08.2007, 20:55

Die Seiten musst du selbst erstellen, in AS2 dürften dies MovieClips sein.
Du könntest z.B. vom aktuellen Frame eine Bitmap holen diese in einen Clip packen und über addPage hinzufügen - dann aufs nächste Frame gehen.
Also alles in einer Schleife.

syringe#10
Benutzerbild von syringe
Beiträge: 3
Registriert: Aug 2007

13.08.2007, 20:57

genau das wäre die Lösung - so eine Schleife bereitet MIR persönlich leider große Schwierigkeiten... Könntest du mir auf die Sprünge helfen? Wäre super!!!

mediatlantis#11
Benutzerbild von mediatlantis
Beiträge: 2
Registriert: Apr 2007

13.08.2007, 21:00

Dieser Thread wird langsam ansrengend- burnZ, könntest Du eine Lösung via FlashFile zur Verfügung stellen? Davon hätten hier alle was und man müßte sich nicht später durch dieses Frage Antwort Spiel durchhangeln...

;)) Mike

burnZ#12
Benutzerbild von burnZ
Beiträge: 2827
Wohnort: Bayern
Registriert: Aug 2005

13.08.2007, 21:30

ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import flash.display.BitmapData;

var bitmap:BitmapData = new BitmapData( zielClip.width, zielClip.height, true, 0xFFFFFF );

for( var i:Number = 1; i < zielClip._totalframes; i++ )
{
    zielClip.gotoAndStop( String( i ) );
    bitmap.dispose();
    bitmap.draw( zielClip ); // hier evtl matrix fuer skaliierung etc verwenden

    var printClip:MovieClip = new MovieClip();
          printClip.attachBitmap( bitmap );

    meinPrintJob.addPage( printClip );
}



nicht getestet aber das prinzip denke ich, reicht das? :( bin busy und müdä
Geändert von burnZ am 13.08.07 um 21:33 Uhr
alexzach#13
Benutzerbild von alexzach
Beiträge: 1
Wohnort: finnland
Registriert: Sep 2007

27.09.2007, 20:59

danke, danke, danke!!!

ich hab ewig nach diesem skript gesucht,
einen oscar für dich!


alex

Paulus2408#14
Benutzerbild von Paulus2408
Beiträge: 6
Registriert: Oct 2006

15.01.2008, 01:46

Super Beitrag!!!!

Endlich mal eine wirklich brauchbares Beispiel zum Thema Printjob!!!
Damit hast Du mir echt einige Stunden Arbeit erspart!

Danke!!!

Superkargo#15
Benutzerbild von Superkargo
Beiträge: 107
Registriert: Jul 2007

07.02.2008, 17:02

Kann mich nur den Huldigen anschließen. Endlich mal ein verständlich erklärtes Beispiel. Danke!

Superkargo#16
Benutzerbild von Superkargo
Beiträge: 107
Registriert: Jul 2007

07.02.2008, 17:25

Ach und noch eine Frage in die Runde:

Das Script erkennt ja, ob Hoch- oder Querformat gewählt ist. Kann ich diese Einstellung auch ändern? Das heißt, wenn ich möchte, dass immer im Querformat gedruckt wird (es sei denn, der Nutzer setzt es manuell auf Hochformat).
Oder besitzt die Flash-Applikation nicht die notwendigen Rechte, um diese Option zu setzen?

Danke!


AntwortenRegistrieren Seite1 2  

Schnellantwort

Du musst registriert sein, um diese Funktion nutzen zu können.

 
Ähnliche Beiträge zum Thema
Partner Webseiten: art-and-law.de  Mediengestalter.info   php-resource.de   phpforum.de   phpwelt.de   Pixelio.de   Scubacube.de  
Haftungsausschluss   Datenschutzerklärung   Hier Werben   Impressum
© 1999-2019 Sebastian Wichmann - Flashhilfe.de