2009-09-14 10 views
5

Obecnie próbuję utworzyć funkcję, która pozwoli mi przejść w MovieClip i wydrukować.AS3 przy użyciu PrintJob do drukowania MovieClip

Oto uproszczona wersja funkcji:

function printMovieClip(clip:MovieClip) { 

var printJob:PrintJob = new PrintJob(); 
var numPages:int = 0; 
var printY:int = 0; 
var printHeight:Number; 

if (printJob.start()) { 

/* Resize movie clip to fit within page width */ 
if (clip.width > printJob.pageWidth) { 
    clip.width = printJob.pageWidth; 
    clip.scaleY = clip.scaleX; 
} 

numPages = Math.ceil(clip.height/printJob.pageHeight); 

/* Add pages to print job */ 
for (var i:int = 0; i < numPages; i++) { 
printJob.addPage(clip, new Rectangle(0, printY, printJob.pageWidth, printJob.pageHeight)); 
printY += printJob.pageHeight; 
} 

/* Send print job to printer */ 
printJob.send(); 

/* Delete job from memory */ 
printJob = null; 

} 

} 

printMovieClip(testMC); 

Niestety to nie działa zgodnie z oczekiwaniami, czyli drukowanie całej szerokości MovieClip i robi podziały stron na długości.

Odpowiedz

5

Zapomniałem przeskalować obszar wydruku, aby dopasować rozmiar klipu filmowego, którego rozmiar został zmieniony. Poniżej znajduje się opis rozwiązania roboczego:

function printMovieClip(clip:MovieClip) { 

    var printJob:PrintJob = new PrintJob(); 
    var numPages:int = 0; 
    var printArea:Rectangle; 
    var printHeight:Number; 
    var printY:int = 0; 

    if (printJob.start()) { 

     /* Resize movie clip to fit within page width */ 
     if (clip.width > printJob.pageWidth) { 
      clip.width = printJob.pageWidth; 
      clip.scaleY = clip.scaleX; 
     } 

     /* Store reference to print area in a new variable! Will save on scaling calculations later... */ 
     printArea = new Rectangle(0, 0, printJob.pageWidth/clip.scaleX, printJob.pageHeight/clip.scaleY); 

     numPages = Math.ceil(clip.height/printJob.pageHeight); 

     /* Add pages to print job */ 
     for (var i:int = 0; i < numPages; i++) { 
      printJob.addPage(clip, printArea); 
      printArea.y += printArea.height; 
     } 

     /* Send print job to printer */ 
     printJob.send(); 

     /* Delete job from memory */ 
     printJob = null; 

    } 

} 

printMovieClip(testMC); 
+0

Jeśli to zadziała (I jeszcze go nie wypróbowałem ...), a następnie dzięki, ponieważ jest to bardzo ogólny i użyteczny przykład drukowania dużego filmu MovieClip w celu rozproszenia wielu stron we Flashu AS3. – Triynko

2

Dziękuję za ducha Open-source! Opierając się na twojej wspaniałej pracy, zaimplementowałem ją i trochę ulepszyłem, aby rozwiązać mój praktyczny problem z drukowaniem MovieClip. Najważniejszym postępem, jaki poczyniłem, jest opracowanie sposobu drukowania MovieClipa z wieloma klatkami tylko za pomocą jednego wysyłania wydruków. Oczywiście rozwiązałem kwestię "drukowania całej szerokości klipu filmowego". Ponieważ SWF przechowuje zawartość w formie grafiki wektorowej, należy upewnić się, że jest to clip.height = printArea.height; clip.width = printArea.width;. Jest to prosty sposób:

1//MC printing Function 
2private function printMovieClip(clip:MovieClip):void 
3{ 
4 var printJob:PrintJob=new PrintJob(); 
5 var printArea:Rectangle; 
6 if (!printJob.start()) 
7  return; 
8 //The page you choose to print ,"selectPages" is a mx:combox object i used to support printing one frame of MC 
9 var printPage:int=selectPages.selectedItem.data; 
10 if (printPage == 0) //print all frames of the MovieClip 
11  { 
12  for (var i:int=1; i <= clip.totalFrames; i++) 
13  { 
14   clip.gotoAndStop(i); 
15   /* Resize movie clip to fit within page width */ 
16   clip.width=printJob.pageWidth; 
17   clip.scaleY=clip.scaleX; 
18   /* Store reference to print area in a new variable! Will save on scaling */ 
19   printArea=new Rectangle(0, 0, printJob.pageWidth, printJob.pageHeight); 
20   //numPages=Math.ceil(clip.height/printJob.pageHeight); 
21     /* Add pages to print job */ 
22   printJob.addPage(clip, printArea); 
23  } 
24  } 
25 else //print the selected frame 
26 { 
     //goto the selected frame firstly 
27  clip.gotoAndStop(printPage); 
28  /* Resize movie clip to fit within page width */ 
29  clip.width=printJob.pageWidth; 
30  clip.scaleY=clip.scaleX; 
31  printArea=new Rectangle(0, 0, printJob.pageWidth, printJob.pageHeight); 
32   /* Add pages to print job */ 
33  printJob.addPage(clip, printArea); 
34  } 
35 
36  /* Send print job to printer */ 
37  printJob.send(); 
38   /* Delete job from memory */ 
39  printJob=null; 
40 
41 } 

Jeśli chcesz uzyskać więcej informacji, można spojrzeć na mojego klipu obrazu (i podane zrozumieć trochę chiński): to wszystko in my blog. Istnieje również MovieClip thumbnails (nadal chiński).

+0

Nie brałem nawet pod uwagę wielu klatek, dobrej pracy :) chociaż jako sugestię, co z usunięciem odwołania do mx: combobox z funkcji i uczynienie zmiennej "printPage" opcjonalnym argumentem? Czyniłoby to trochę bardziej elastycznym. –

0

Dodałem małą poprawkę, która resetuje wymiary MovieClip po zakończeniu drukowania. Problem polegał na tym, że kiedy drukujesz coś, co jest większe niż twoja strona, kod również skalował klip filmowy na scenie. Więc naprawiłem że ... nic specjalnego, ale może być użyteczne dla innych ludzi :)

kod ten rozwiązuje również fakt, że przezroczysty PNG będą także przezroczysty na wydruku

protected function printMovieClip(clip:MovieClip):void { 

      var printJob:PrintJob = new PrintJob(); 
      var printJobOptions:PrintJobOptions = new PrintJobOptions(); 
      var numPages:int = 0; 
      var printArea:Rectangle; 
      var printHeight:Number; 
      var printY:int = 0; 
      var originalWidth:Number; 
      var originalHeight:Number; 

      if (printJob.start()) { 

       originalWidth = clip.width; 
       originalHeight = clip.height; 

       if (clip.width > printJob.pageWidth) { 
        clip.width = printJob.pageWidth; 
        clip.scaleY = clip.scaleX; 
       } 

       printArea = new Rectangle(0, 0, printJob.pageWidth/clip.scaleX, printJob.pageHeight/clip.scaleY); 

       numPages = Math.ceil(clip.height/printJob.pageHeight); 

       for (var i:int = 0; i < numPages; i++) 
       { 
        printJobOptions.printAsBitmap = true; 
        printJob.addPage(clip, printArea, printJobOptions); 
        printArea.y += printArea.height; 
       } 

       /* Send print job to printer */ 
       printJob.send(); 

       /* Delete job from memory */ 
       printJob = null; 

       /* reset the clips width and height on stage so it is back at its original size*/ 
       clip.width = originalWidth; 
       clip.height = originalHeight; 
      } 

     } 
+0

Muszę to wypróbować, brzmi as. Dzięki! –

Powiązane problemy