3 Pertanyaan: AS3 menggunakan PrintJob untuk mencetak MovieClip

pertanyaan dibuat di Fri, Apr 19, 2013 12:00 AM

Saat ini saya mencoba membuat fungsi yang memungkinkan saya untuk meneruskan MovieClip dan mencetaknya.

Ini adalah versi fungsi yang disederhanakan:

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

Sayangnya ini tidak berfungsi seperti yang diharapkan yaitu mencetak lebar penuh dari MovieClip dan melakukan pemutusan halaman pada panjangnya.

    
5
3 Jawaban                              3                         

Saya lupa mengatur skala area cetak agar sesuai dengan klip video yang diubah ukurannya. Lihat di bawah untuk solusi yang berfungsi:

 
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 );
    
5
2009-09-14 17: 18: 15Z
  1. Jika ini berhasil (saya belum mencobanya ...), terima kasih, karena ini adalah contoh yang sangat umum dan berguna tentang cara mencetak MovieClip yang besar untuk span beberapa halaman dalam Flash AS3.
    2009-09-17 18: 15: 32Z

Terima kasih atas semangat Open-source Anda! Berdasarkan karya hebat Anda, saya menerapkannya dan membuat sedikit perbaikan untuk menyelesaikan masalah pencetakan MovieClip praktis saya. Kemajuan besar yang telah saya buat adalah mencari cara mencetak MovieClip dengan multi-frame hanya dengan satu pengiriman pekerjaan pencetakan. Tentu saja, saya menyelesaikan pertanyaan "mencetak lebar penuh Movieclip". Karena SWF menyimpan konten dalam bentuk vektorgraph, yang perlu Anda lakukan adalah memastikan clip.height = printArea.height; clip.width = printArea.width;. Ini cara yang mudah:

 
 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    }

Jika Anda ingin informasi lebih lanjut, Anda dapat melihat gambar klip saya (dan memberi Anda sedikit mengerti bahasa Mandarin): itu semua di blog saya . Ada juga thumbnail MovieClip (masih Cina).

    
2
2013-04-19 23: 47: 17Z
  1. Saya bahkan tidak mempertimbangkan banyak frame, kerja bagus :) meskipun sebagai saran, bagaimana dengan menghapus referensi ke mx: combobox dari fungsi dan membuat " printPage "variabel argumen opsional? Akan membuatnya sedikit lebih fleksibel.
    2011-06-08 09: 55: 34Z

Saya menambahkan perbaikan kecil yang mengatur ulang dimensi MovieClip setelah pekerjaan pencetakan selesai. Masalahnya adalah ketika Anda mencetak sesuatu yang lebih besar dari halaman Anda, kode juga akan skala klip video di atas panggung. Jadi saya Memperbaiki itu ... tidak ada yang istimewa tapi mungkin berguna untuk orang lain :)

kode ini juga memperbaiki fakta bahwa PNG transparan Anda JUGA akan transparan pada cetakan Anda

 
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
2012-06-16 10: 36: 32Z
  1. Saya harus mencoba ini, kedengarannya ace. Terima kasih!
    2012-07-18 08: 58: 14Z
sumber ditempatkan sini