2009-09-14 11 views
5

Actualmente estoy intentando crear una función que me permita pasar un MovieClip e imprimirlo.AS3 usando PrintJob para imprimir un MovieClip

Aquí es la versión simplificada de la función:

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); 

Desafortunadamente esto no está funcionando como se esperaba, es decir la impresión de la anchura total de la MovieClip y haciendo saltos de página en la longitud.

Respuesta

5

Se me olvidó escalar el área de impresión para que coincida con el clip de película que se redimensiona. Vea a continuación la solución de trabajo:

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

Si esto funciona (I aún no lo he probado ...), gracias, porque es un ejemplo muy general y útil de cómo imprimir un MovieClip grande para abarcar varias páginas en Flash AS3. – Triynko

2

¡Gracias por su espíritu de código abierto! En base a su gran trabajo, lo implemento y realizo una pequeña mejora para resolver mi práctico problema de impresión de MovieClip. El mayor progreso que he hecho es encontrar una forma de imprimir un MovieClip con fotogramas múltiples solo mediante el envío de un trabajo de impresión. Por supuesto, resolví la cuestión de "imprimir todo el ancho del Movieclip". Debido a que SWF almacena contenido en forma de vectorgraph, lo que necesita hacer es asegurarse de clip.height = printArea.height; clip.width = printArea.width;. Es una manera fácil:

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 } 

Si desea más información, puede echar un vistazo a mi imagen en el clip (y dan a entender un poco chino): es todo in my blog. También hay MovieClip thumbnails (aún chino).

+0

Ni siquiera había considerado varios fotogramas, buen trabajo :), aunque como sugerencia, ¿qué hay de eliminar la referencia al mx: combobox de la función y hacer que la variable "printPage" sea un argumento opcional? Lo haría un poquito más flexible. –

0

Agregué una pequeña corrección que restablece las dimensiones de MovieClip después de que se haya terminado el trabajo de impresión. El problema es que cuando imprime algo que es más grande que su página, el código también escala el clip de película en el escenario. Así Me fijo que ... nada especial, pero podría ser útil para otras personas :)

este código también corrige el hecho de que su PNG transparente también será transparente sobre la impresión

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

Voy a tener que probar esto, suena como un as. ¡Gracias! –

Cuestiones relacionadas