26 Eylül 2007 Çarşamba

Dot Matrix Printer ve .NET ile RAW Printing

Çalıştığım projelerden birinde Windows Forms içinden (C#) belirli formattaki bir string i print edebilme gereksinimi vardı. Kullanılacak printer Nokta Vuruşlu yani Dot Matrix tipinde bir printer olacaktı. .NET ile fazla tecrübem olmamasına karşın bir çok basit problemi hakikaten basitçe çözebilmesine olan güvenimle hemen işe giriştim ve bir kaç googlelamadan sonra PrintDocument sınıfı ile işi kolayca çözebildim. Aşağıdaki kod bölümü bunu özetliyor.

PrintDocument printDoc = new PrintDocument();
printDoc.PrintPage += new PrintPageEventHandler(this.printDoc_PrintPage);
printDoc.Print();

private void printDoc_PrintPage(object sender, PrintPageEventArgs e) {

e.Graphics.DrawString("nereye ne yazmak istiyorsak yazariz",.....);
e.HasMorePages = false;
}


Üstteki bölümde yapılan .NET Frameworkunun bize hazır olarak sunduğu Printing API sinden faydalanmak ve PrintDocument sınıfından olan printDoc nesnemize yazdırmayı idare edecek EventHandlerı atamak. Daha sonra yazdırma işlemini printDoc.print() diyerek yapıyoruz ve olay Event Handler metodunun içeriğine kalıyor. Event Handler da metod parametrelerinden faydalanarak yazdırma işlemini fiziksel olarak tanımlayan Graphics objesine ulaşıyoruz ve DrawString, DrawLine gibi metodlarla istediğimiz formatı elde ediyoruz, dolayısı ile yazdıracağımız veriyi yazdırmış oluyoruz.

Buraya kadar herşey çok güzel ve hızlı. Ancak bu yöntem, yazdırma işlemi için Windowsun printer driveri üzerinden geçiyor ve Nokta Vuruşlu bir yazıcı için oldukça yavaş; çünkü windows bu işlemi graphics objesi oluşturarak yapıyor ve tüm veriyi önce graphics objesi üzerinde yerleştirip sonra yazdırma işlemine başlıyor. İşte tam bu noktada eski DOS tabanlı programların nokta vuruşlu yazıcılar ile ne kadar efektif ve hızlı çalıştığı aklıma geldi ve bunu araştırmaya başladım. Tahmin ettiğim gibi bu tarz programlar yazıcıya veriyi önceden formatlı bir şekilde ve RAW olarak yolluyorlardı. Dolayısı ile aradaki printer driveri ve graphics oluşturma şamatasına gerek kalmıyordu. Bende hemen işe koyuldum ve C# ile bunu yapmanın yollarını aramaya başladım. http://support.microsoft.com/?kbid=322091 linkinde konu ile ilgili bir makale buldum ve aynen tarif edilen gibi Win32 Spooler fonksiyonlarını DLLImport ile C# kodumda tanımlayarak kullanmaya başladım. Sonuç itibarı ile tam istediğim gibi hızlı, basit ve gereksinimi birebir karşılayan bir DotMatrixPrinting kabiliyeti elde etmiş oldum.

Bu arada bu Dot Matrix Printerlar hakikaten bir derya. Bu yazıcıların en ufak ayarını dahi ESCAPE CODE lar sayesinde kontrol edebiliyorsunuz. Özellikle benim projemdeki gibi önceden basılmış devamlı form kıvamında (fatura, irsaliye vb.) çıktılarla uğraşıyorsanız sayfa boyu ayarlamak, kalın/ince yazıya geçmek ve bunun gibi bir çok ayar için ESCAPE CODE lara ihtiyacınız var demektir. Gene RAW Printing vasıtası ile halledebileceğiniz bu konunun üzerinde bir sonraki yazımda duracağım çünkü gerçekten bu yazının hedefi dışında bir konu.

NOT: Bu işleri kurcalarken bir yerlerde gözüme eğlencelik bir komut çarptı. İsterseniz sizde bir deneyin.
1- Bir TEXT dökümanı oluşturun ve içine rastgele bir şeyler yazın. Yazdığınız garip bir formattada olabilir.
2- Komut satırına geçin ve oluşturduğunuz TEXT dökümanını direk yazıcıya yollayın.
copy Deneme.txt lpt1 şeklinde.
Bu şekilde de RAW Printing yapmış oluyoruz ve makalede belirtilenlere gerek kalmamış oluyor. Sadece C# kodumuz içerisinde bu komutu çalıştırmamız yeterli.

2 yorum:

Unknown dedi ki...

Ultra Yardımcı Oldu Çok Sağol Kanka

Unknown dedi ki...

Ultra Yardımcı Oldu Çok Sağol Kanka