Barkod Printer, Seri Port, USB, C# üzerine… – 2

makalenin ilk versiyonunda (http://www.mavis.com.tr/blog/?p=233) Barkod printer üzerine genel bir giriş yapmıştık.

Barkod yazıcıya anlayacağı dilden (PPLA, PPLB, ZPL ..) etiket tasarlamanın en kolay yolu, genelde barkod yazıcının kendi CD si ile birlikte gelen tasarım programını kullanmaktır. (PPLA PPLB komutlarını açıklayan PDF dosyayı buradan indirebilirsiniz)  Etiket görsel olarak istenilen şekilde tasarlanır. Yazıcıdan çıktı denemeleri alınır. En ideal etiket tasarımında karar verildikten sonra, yazıcıya gönderilecek dosyanın kaynak kodu elde edilir. Bazı programlarda PPLA / PPLB kodunu göster seçeneği var, bazı programlarda ise bunu yapmak için Windows arabiriminde “Print To File” işaretlenerek, yazıcıya göndereceği veriyi bir dosyaya yazdırması sağlanır.

Yukarıdaki resim, Zebra yazıcılar ile birlikte ücretsiz gelen ZebraDesigner programında Print To File işleminin yapılmasını gösterir. Etiket, görsel olarak istenildiği gibi tasarlanır. Yazıcıya gönderme işleminde, görsel tasarım dışında, baskı tipi (termal transfer, direk baskı – ribon-), renk doygunluğu (density) etiket boy ve boşluk bilgileri gibi başlık (Header) bilgileri de yer alır. Bunları tek tek kodlamak için ciddi bir Programmers Guide hatmedilmelidir. (Kısmen eğlenceli de olsa, çoğu kez zaman kaybından başka bişey de değildir)

“Print To File” seçeneği işaretlenerek oluşturulmuş örnek bir barkod tasarım bilgisi :

Q160,019
q831
rN
S1
D7
ZT
JB
OD
R335,0
N
GW104,104,6,48,ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïÿÿÿÿÿÿÿÿÿÿ¿
A152,24,2,2,1,1,N,"ZD:01.01.10"
A152,48,2,2,1,1,N,"QC:235-167"
A152,72,2,2,1,1,N,"01.06.2010"
A152,96,2,2,1,1,N,"03L131051BH"
P1

ilk başta yer alan satırlar (1..10 arası) barkodun başlık bilgileri, geri kalan yazılacak verilere ilişkin koordinatlar ve data ları içerir. GW ile başlayan satır, etikette bir grafik olduğunu gösterir. Bu örnekte ben grafik kullandım, çünkü C# içinden  grafiği düzgün bastırabilmek için kodda bazı düzenlemeler yapmak gerekmektedir.

Gerçek hayatta, her barkod üzerindeki bilgiler değişeceği için, etiketin üzerindeki bu bilgileri de değiştirerek yazıcıya göndermek gerekmektedir. Bu yüzden orijinal etiket dosyasını aşağıdaki gibi değiştirdim.

Q160,019
q831
rN
S1
D7
ZT
JB
OD
R335,0
N
GW104,104,6,48,ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïÿÿÿÿÿÿÿÿÿÿ¿
A152,24,2,2,1,1,N,"*LINE1*"
A152,48,2,2,1,1,N,"*LINE2*"
A152,72,2,2,1,1,N,"*LINE3*"
A152,96,2,2,1,1,N,"*LINE4*"
P1

amacım; ** arasında geçen değişkenleri *LINE1* gibi, program ile RunTime anında değiştirebilmek.

Bunun için, Print To File yaparak elde ettiğim dosyayı, edit edip (not defteri vb. bir programla) yukarıdaki gibi düzenleyerek, bildiğim bir yere (diyelim ki C:\PrnTmp klasörüne) bildiğim bir isimle (mesela Template.prn) kaydedelim.

Şimdi, bu dosyayı okuyup, dinaik olarak değiştirip yazıcıya gönderen C# kodum aşağıdaki gibi olacaktır.

		public void PrintBarcode(String L1, String L2, String L3, String L4)
		{
			String tempFile = "C:\\PrnTmp\\Template.prn";
			String PrinterName = "ZDesigner TLP 2844";
			StreamReader SR = new StreamReader(tempFile, Encoding.Default);
			String all = SR.ReadToEnd();
			SR.Close();

			all = all.Replace("*Line1*", L4);
			all = all.Replace("*Line2*", L3);
			all = all.Replace("*Line3*", L2);
			all = all.Replace("*Line4*", L1);

			RawPrinterHelper.SendStringToPrinter(PrinterName, all);

		}

Bu rutin, verdiğim 4 değişkeni orijinal barkod tasarımında yerine koyar ve bu verdiğim değerlere göre barkod basar.
Grafiklerin doğru basılabilmesi için, StremReader nesnesi, Encoding.Default parametresi ile çağırılmalıdır.

Buradaki, RawPrinterHelper USB bağlantı üzerinden direk barkod basan sınıfın adıdır. Bir sonraki makalede bu sınıftan bahsetmeyi düşünüyorum. Tabii, seri ya da paralel port üzerinden yazıcıya erişmek için bu sınıfı kullanmaya gerek olmadığını belirtmeye gerek yok sanırım.

Makalenin son bölümünde, bu sınıf açık kaynak kodu ile birlikte yer almaktadır.

Makalenin Son Bölümü : Bölüm – 3

Barkod Printer, Seri Port, USB, C# üzerine… – 2” üzerine 18 düşünce

  1. Geri izleme: Barkod Printer, Seri Port, USB, C# üzerine… – 1 | Mavis Kameralı Kontrol Projeleri

  2. öncelikle çok teşekkür ederim verdiğiniz bilgiler için,

    şöyle bir problemim var zebradesginer’dan (sürüm 1.0.2) tasarladığım labelı prn file olarak alıyorum bunu doğrudan vermiş olduğunuz c# kodlarıyla yazdırabiliyorum ancak prn dosyası içerisinde sabit textler GW ile başlıyor yani textleri prn dosyasına grafik olarak atıyor öyle olduğu içinde textleri değişken şeklinde kullanamıyorum.

    Bu konuda yardımcı olursanız çok sevinirim. saygılar.

  3. Evet zebra fontalı kullanmak en mantıklısı zaten. True Type font kullanıldığında, onları grafik olarak basıyor. Hem gönderilen data artıyor hem de kalite düşüyor. Gerçi bir utility var, True type fontları printer a atıyorsun, sonra Zebra fontları gibi kullanabiliyorsun ama bu işlere gerek te olmuyor genelde. Zebra fontları yeterli. Kolay gelsin.

  4. Yazi için teşekkürler Mustafa bey , elinize sağlık.
    Zebra 2844 barkod yazicı kullanıyorum . Ve yazdigim programdan gönderilen parametreye göre 1 yada daha cok barkod basmam gerekiyor (her barkod ayri etikette olacak sekilde). Ancak bazi denemelerimde tum barkodlar duzgun cikmasina ragmen bazen de “Out od paper and/or ribbon” seklinde hata aliyorum . Bir türkü tutarlı çalıştiramadım. Bunun sebebi hakkında bir oneriniz olabilir mi ? Donanumsal (ribbon, printer vs) ya da printer a gonderilen komut kumesi ile mi alakalidir acaba. Yada printer ayarlari ile mi ilgili sizce ?
    Şimdiden Teşekkürler, İyi Çalışamalar

  5. “Bazen” hata veriyor olması daha çok donanımsal olduğunu düşündürtüyor. Yazılımsal olsa, periyodik tekrarlanması beklenirdi.

    Öncelikle Etiketlerin ve sayfanın boyutlarının düzgün verildiğine emin olun. Boyutlandırma ile ilgili bir hata varsa o tür saçmalıkları yapabilir.
    Sonra ribbon dan dolayı hata vermemesi için, thermal transfer (ribon) baskı yerine, direct thermal (ribonsuz) çalışın bir süre. (Yani sorun ribon da mı etikette mi en azından ona emin olun)

    Bir de, zamanında beni de uğraştıran (kötü) bir tecrübeme dayanarak şunu da söyleyebilirim:
    2 Etiket arası boşluğu (gap) göremiyor olabilir. Yazıcının optik gözünü temizleyin, etiketin ve altındaki şeffaf malzemenin kalitesini kontrol edin. Bazı etiketlerde, etiket ile alttaki şeffaf kısım birbirine çok yakın renklerde oluyor. Optik göz göremiyor. (Denemek için, her etiketin üzerine 1 tane daha yapıştırın mesela.)

    Kolay Gelsin.

  6. Cevap için teşekkür ederim :

    Önerilerinizi denedim ancak bir türlü istediğim sonucu alamadım .

    Ancak dikkatimi çeken bir şey var. Ne zaman printer bu state e düşmüş olsa printer kapağini açarken
    ribbon un kağida yapişmiş olduğunu görüyorum. Son çare olarak yeni ribbon ve etiket le bir denicem.

    Bir de printer in özelliklerinde advanced bölümündeki driver kisminda bir drop down menu var.
    Burada zebra ile ilgili 3 tane driver var, Bunlar

    ZDesigner TLP 2844,
    Zebra TLP2844,
    Zebra TLP2844-Z

    Burası da kafamı kariştırdı . Bende secili olan “ZDesigner TLP 2844”. Burasi ile ilgili de bir problem olabilir mi acaba .

    Tekrar Teşekkür Ederim
    İyi Çalışmalar

  7. Sadece Windows tan baskı yapacaksan, Zebra TLP2844 driver ı yüklemen yeterli. ZDesigner programından da baskı yapacaksan, ZDesigner TLP 2844 yüklemek gerekir sanırım. (Zaten aksi halde ZDesigner programı başlamıyor) Bence ribonsuz baskı dene. (Thermal transfer). TLP2844 zaten ribonsuz baskı verebilen bir yazıcı. Tek yapman gereken termal etiket edinmek. (ısıtınca kararan) Böylece donanımsal / ribondan kaynaklanan bir durum olup olmadığını anlarsın. Kolay Gelsin.

  8. Peki hocam bunu asp.net ile nasıl yazdırabiliriz. Sonuçta hostingde bu kodlar servera bağlı bir yazıcıya gidecek. Client taraflı bir işlem gerçeklemesi lazım. Bu konuda yardımlarınızı bekliyorum saygılar.

  9. Bu kodları asp.net içinden kulancaksan tabii ki client tarafında değil de server tarafında çalışacaktır. Bu durumda, asp.net yerine WinForms kullanman tavsiye edilir. Eğer mutlaka asp.net kulanman gerekiyorsa; soru, browser içinden seri porta nasıl erişirim gibi bir şekle dönüyor. Bunun yöntemleri ActiveX kullanman, serialport destekleyen javascript kodu (normalde javascript serialport gibi bir class barındırmaz, çeşitli üreticilerin ürünlerini denemen lazım. https://github.com/voodootikigod/node-serialport gibi…) denemen lazım. ActiveX kullanırsan o kodun sadece Internet Explorer da çalışacağını unutma.

  10. Merhaba ben tüm uygulamaları yaptım. sorun yok gibi kontrol ettim hatada vermiyor ancak denetim masasından zebra 2844 yazıcının içini açtığımda programı çalıştırdığımda ekrana hiç bir şey düşmüyor. kısacası yazdırmıyor. gerekli sınıfları ve kütüphaneleri ekledim ama yazıcı basmıyor acaba yazıcımı başka bilgisayardan paylaşımdan aldığım için olabilir mi. yani doğrudan yazıcıya bağlansam sorunu çözer miki ? ya da başka ne gibi problem olabilir?

  11. Evet, yazıcıyı kendi bilgisayarınıza takıp denemelisiniz. Program, bilgisayarın USB portuna veri gönderir. Oysa sizin yazıcınız, başka bir bilgisayarın USB portunda.
    Öncelikle, kendi bilgisayarınıza takıp deneyin. Zebra Designer ile de deneyin. Sorunsuz çalışacaktır. (2844 ler ile en az 20 farklı projede sorunsuz çalıştım) Mutlaka başka bilgisayara bağlı bir yazıcıya gönderecekseniz, bu durumda network üzerinden göndermeniz gerekir.

  12. merhaba ben zebra desing dan tasarımı yaptım c# da projemde gerekli kodları kullandım. düne kadar barkod basabiliyordum ancak bugün noldu ise gönderdiğim veriler yazıcıdan çıkmıyor yani veriyi gönderdiğimde boş çıkartıyor. .prn yi kontrol ettim problem yok gibi c# da formumda da değişiklik yapmadım. ama boş çıkartıyor. zebra designerda test çıktısı alabiliyorum. bide başka bir problemim daha var. yazıcımda daha önce çıktı alabiliyorken kalitesiz çıkartıyordu yani silik silik çıkartıyordu. ama designerdan çıktı aldığım zaman gayet kaliteli çıkartıyordu. nasıl bir yol izleyebilirim. bana bu konuda yardımcı olabilirseniz çok sevinirim

  13. mrh ben zebra desing dan tasarımı yaptım c# da projemde gerekli kodları kullandım. düne kadar barkod basabiliyordum ancak bugün noldu ise gönderdiğim veriler yazıcıdan çıkmıyor yani veriyi gönderdiğimde boş çıkartıyor. .prn yi kontrol ettim problem yok gibi c# da formumda da değişiklik yapmadım. ama boş çıkartıyor. zebra designerda test çıktısı alabiliyorum. bide başka bir problemim daha var. yazıcımda daha önce çıktı alabiliyorken kalitesiz çıkartıyordu yani silik silik çıkartıyordu. ama designerdan çıktı aldığım zaman gayet kaliteli çıkartıyordu. nasıl bir yol izleyebilirim. bana bu konuda yardımcı olabilirseniz çok sevinirim

  14. Elinize sağlık, güzel anlatmışsınız, keşke bundan daha önce haberim olsaydı biraz amele işi barkod yazdırmışım ben:)

  15. Merhaba,Kodunuzu inceledim.Windows isletim sisteminde guzel calisiyor.Fakat Web ortaminda Debug modunda kendi bilgisayarimda calisiyor.Release olarak alip bir web server’dan explorer ile uygulamayi cagirip kendi lokal’imdeki pc’den etiketi dokmeye kalktigimda alamiyorum. Yani Web ortami icin yardimci olabilirmisiniz?

  16. selamlar yazdığınız makale çok güzel beğendim mikro ve akınsoft programlarıda bu yöndemi kullanmakta
    fakat benim yazdığım yazılım dili vb.net bununa göre RawPrinterHelper.SendStringToPrinter yazılmış kodlar varsa paylaşırsanız sevinirim
    mehmetay72@hotmail.com

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir