2012-11-13 10 views
6

RichTextBox'un içeriğini yazdırmaya çalıştım ve yazıcıya yazdırıyorsam çok fazla hata var. Ancak XPS dosyasına (Windows'ta XPS-yazıcı aracılığıyla) yazdırırken, bu dosyayı yazıcıya yazdırmak tamam.XPS dosyasına yazdırın ve sonra yazıcıda yazdırın

Tüm bu şeyleri programlı olarak yapabilir miyim?

İşte benim baskı yöntemidir:

public int PrintRotate(bool rotate, PrintPageEventArgs e, int charFrom, int charTo) 
    { 
     //Calculate the area to render and print 
     RECT rectToPrint; 
     rectToPrint.Top = (int)(e.MarginBounds.Top * anInch); 
     rectToPrint.Bottom = (int)(e.MarginBounds.Bottom * anInch); 
     rectToPrint.Left = (int)(e.MarginBounds.Left * anInch); 
     rectToPrint.Right = (int)(e.MarginBounds.Right * anInch); 

     //Calculate the size of the page 
     RECT rectPage; 
     rectPage.Top = (int)(e.PageBounds.Top * anInch); 
     rectPage.Bottom = (int)(e.PageBounds.Bottom * anInch); 
     rectPage.Left = (int)(e.PageBounds.Left * anInch); 
     rectPage.Right = (int)(e.PageBounds.Right * anInch); 

     IntPtr hdc = e.Graphics.GetHdc(); 

     FORMATRANGE fmtRange; 
     fmtRange.chrg.cpMax = charTo;    //Indicate character from to character to 
     fmtRange.chrg.cpMin = charFrom; 
     fmtRange.hdc = hdc;     //Use the same DC for measuring and rendering 
     fmtRange.hdcTarget = hdc;    //Point at printer hDC 
     fmtRange.rc = rectToPrint;    //Indicate the area on page to print 
     fmtRange.rcPage = rectPage;   //Indicate size of page 


     SetGraphicsMode(fmtRange.hdc, GM_ADVANCED); 

     XFORM par = new XFORM(); 

     par = new XFORM(); 
     par.eM11 = 1; 
     par.eM12 = 0; 
     par.eM21 = 0; 
     par.eM22 = 1; 
     par.eDx = -e.PageSettings.Margins.Left/100 * e.PageSettings.PrinterResolution.X; 
     par.eDy = -e.PageSettings.Margins.Top/100 * e.PageSettings.PrinterResolution.Y; 
     ModifyWorldTransform(fmtRange.hdc, ref par, MWT_LEFTMULTIPLY); 

     IntPtr res = IntPtr.Zero; 

     IntPtr wparam = IntPtr.Zero; 
     wparam = new IntPtr(1); 

     //Get the pointer to the FORMATRANGE structure in memory 
     IntPtr lparam = IntPtr.Zero; 
     lparam = Marshal.AllocCoTaskMem(Marshal.SizeOf(fmtRange)); 
     Marshal.StructureToPtr(fmtRange, lparam, false); 

     //Send the rendered data for printing 
     res = SendMessage(Handle, EM_FORMATRANGE, wparam, lparam); 

     //Free the block of memory allocated 
     Marshal.FreeCoTaskMem(lparam); 

     //Release the device context handle obtained by a previous call 
     e.Graphics.ReleaseHdc(hdc); 

     //Return last + 1 character printer 
     return res.ToInt32(); 
    } 
+1

Bunun için bir çözüm buldunuz mu? Ben de aynı şeyi yapmaya çalışıyorum. –

+0

Ne yazık ki hayır. Bu görev benim için şimdi düşük önceliğe sahip. –

+0

Bunun için de bir çözüm istiyorum. – Jeff

cevap

1

Böyle bir problem vardı ve bir .XPS dosya yapma ve sonra yazıcıya gönderen sona erdi ettik.

Sorunuzdan, xps dosyasına aşağıdan "yazdırma" işlemi yaptığınız gibi geliyor, zira zengin metin kutusunu xps dosyasına yazdırma işlemi hakkında hiçbir şey bilmiyorum. Benim senaryolarımda ms office kullanmadan bir belgesel yazdırmam gerekiyordu, bu yüzden bir XPS dosyası hazırladım, kodu düzenledim ve sonra yazıcıya gönderdim.

LocalPrintServer localPrintServer = new LocalPrintServer(); 
var queue = localPrintServer.GetPrintQueue("NameOfPrinter"); 
PrintSystemJobInfo xpsPrintJob = queue.AddJob("name of print job", "my/xps/path.xps",false); 

Ayrıca System.Printing VE "ReachFramework" başvuruları eklemek gerekir çalışmak bu kodu unutmayın:

Bu

Ben doğrudan yazıcıya xps-dosyayı göndermek için kullanın koddur. Beni, baskı işine niye erişemediğimi öğrenmek için hatırladığımdan daha uzun sürdü.

Çoğu yazıcı bunu deneyimlerimde desteklemelidir. Ortak olanları ve hatta depolama bölümündeki garip "barkod-yazıcı" üzerinde çalışır.

İlgili konular