2009-09-14 22 views
5

Tôi hiện đang cố gắng tạo một chức năng cho phép tôi chuyển vào một số MovieClip và in nó.AS3 sử dụng PrintJob để in một MovieClip

Đây là phiên bản đơn giản của hàm:

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

Thật không may này không hoạt động như mong đợi ví dụ: in toàn bộ chiều rộng của MovieClip và làm ngắt trang vào độ dài.

Trả lời

5

Tôi quên chia tỷ lệ vùng in cho phù hợp với movie clip đang được thay đổi kích thước. Xem bên dưới để biết giải pháp làm việc:

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

của bạn Nếu công trình này (tôi chưa thử nó ...), sau đó cảm ơn, bởi vì nó là một ví dụ rất chung chung và hữu ích về cách in một MovieClip lớn để mở rộng nhiều trang trong Flash AS3. – Triynko

2

Cảm ơn bạn vì tinh thần nguồn mở! Dựa trên công việc tuyệt vời của bạn, tôi thực hiện nó và thực hiện một chút cải tiến để giải quyết vấn đề in ấn MovieClip thực tế của tôi. Những tiến bộ chính tôi đã thực hiện là để làm việc ra một cách để in một MovieClip với nhiều khung hình chỉ bằng một printjob gửi. Tất nhiên, tôi giải quyết câu hỏi "in toàn bộ chiều rộng của Movieclip". Bởi vì SWF lưu trữ nội dung dưới dạng đồ họa véc tơ, những gì bạn cần làm là đảm bảo clip.height = printArea.height; clip.width = printArea.width;. Đó là một cách dễ dàng:

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 } 

Nếu bạn muốn biết thêm thông tin, bạn có thể có một cái nhìn vào hình ảnh clip của tôi (và cho bạn hiểu một chút tiếng Trung Quốc): đó là tất cả in my blog. Ngoài ra còn có MovieClip thumbnails (vẫn là tiếng Trung Quốc).

+0

Tôi thậm chí không được coi là nhiều khung hình, công việc tốt :) mặc dù là một gợi ý, những gì về việc loại bỏ các tham chiếu đến mx: combobox từ chức năng và làm cho biến "printPage" một đối số tùy chọn? Làm cho nó trở nên linh hoạt hơn một chút. –

0

Tôi đã thêm một bản sửa lỗi nhỏ để đặt lại kích thước của MovieClip sau khi in xong. Vấn đề là khi bạn in một cái gì đó lớn hơn sau đó trang của bạn, mã cũng sẽ quy mô movieclip trên sân khấu. Vì vậy, tôi cố định mà ... không có gì đặc biệt nhưng có thể có ích cho những người khác :)

mã này cũng sửa chữa thực tế là trong suốt PNG của bạn cũng sẽ được minh bạch trên bản in

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

Tôi sẽ phải thử cái này, nghe ace. Cảm ơn! –

Các vấn đề liên quan