RSS
 

PHP Printing With LPR

13 Apr

Merhaba,

Son zamanlardaki yoğunluğumdan malesef pek makale yazacak zaman bulamıyorum. :) İnternette çok geyiği dönenen ve olmayacağına dair üzerinde sayfalarca tartışılan bir işlemi gerçekleştiricez şimdi. :)

Normalde sizinde bildiğiniz gibi PHP, ASP, Python v.s. gibi diller server-side çalışan ve bir interpreter’a ve/veya compiler’a bağlı olan dillerdir. Hal böyle oluncada O/S’a müdahelede kısıtlı oluyor. Sanırım PHP’yi geliştiren ekip bunuda düşünerek server üzerinde konsoldan komut çalıştırır gibi komut çalıştırabileceğimiz system(), exec() gibi bazı method’lar hazırlamışlar.

Bu makalenin konusu olan LPR(Line Printer Remote) protokolü de ismi üzerinde Line printing işlemi için hazırlanmış. Yani  komut satırından kod çalıştırarak yazıcılarımızı yönetebiliyoruz.
Madem PHP ile komut satırında kod çalıştırabiliyoruz ve LPR denen bir protokolde bize komut satırından yazıcıları yönetmemize izin veriyor. O zaman PHP ile direkt yazıcıdan çıktı alırız diyebiliriz. Hatta bir adım öteye giderek printer failover senoryalarına karşı object’ler yazıp CRON’lar ile sistemi otomatize edebiliriz, ki bu senoryayu ben daha önce gerçeklemiştim.

Windows tarafında Turn Windows features on or off(Windows Özelliklerini Aç veya Kapat) seçeneklerinden Print and Document Services(Yazdırma ve Döküman Servisleri) kısmından aşağıdaki servislerin yanındaki check işaretini checked yapmanız gerekiyor.

  • LPD Print Service
  • LPR Port Monitor

Linux (Ubuntu, Debian etc.) kısmı içinde aşağıdaki şekilde LPR’ı kurabilirsiniz.

sudo apt-get install lpr

Kurulum yaptıktan sonra ikisininde help dökümantasyonundan basitçe parametre sistemini çözebilirsiniz. Örneğin; Windows tarafı için bakarsak aşağıdaki şekilde bir ekran çıktısı olması gerekmektedir.

Windows 7 LPR CMD

Windows 7 x64 Enterprise Edition ENG kullanıyorum ve problemsiz çalışıyor.

Tabii Windows üzerinde LPR kurduğumuzda direkt çalışmıyor, virtual LPR printer oluşturup eklememiz gerekiyor. Bunun için internette bir sürü kaynak var fakat sizi uğraştırmak istemiyorum. :) Makale bütünlüğünü korumak adına aşağıda stepleri takip ederek kurabilirsiniz. Farklı bir kaynak istersenizde TechNET’teki şu link’e bakabilirsiniz: http://technet.microsoft.com/en-us/library/cc732063.aspx

Start->Control Panel->System and Security->Administrative Tools–|>Printer Management ‘a ulaştığımızda, Sol taraftaki menu list’ten Print Servers’ın altında kendi PC-Adınız’ı açın ve Ports kısmına tıklayın. Karşınıza aşağıdaki bir sayfa gelicek burada sağ tıklayıp Add Port demeniz gerekmektedir.

Windows 7 LPR Port

Bu aşamadan sonra karşınıza aşağıdaki gibi bir pencere çıkacak ve LPR Port’u seçip New Port demelisiniz. İlk alana IP’yi ikinci alana yazıcı kuyruk adını girmelisiniz.

Windows 7 LPR New Port

Bu aşamadan sonra Start->Devices and Printers kısmından yazıcılarınıza basit isimler vermelisiniz. Örneğin HP X1230 ML Express gibi bir isim varsa bunun yerine sadece HP veya HP1230 yazmanız komut satırından ulaşırken hata yapma şansınızı azaltacaktır.

Daha sonra yine sol taraftaki menüden Printers’ı seçip açılan sayfada boş bir yere sağ tıklayıp Add Printer dediğimizde karşımıza gelen pencereden Add a new printer using an existing port’u seçip sağ tarafındaki selectbox’tan daha önce oluşturduğumuz 10.70.1.99:queue1 portunu seçip Next diyelim. Daha sonra bu porttan erişeceği printer’ın driver’nı soracaktır. Bir sonraki adımda sizden yazıcı adını soracaktır, bu isme basit bir isim koymanızı öneririm. Çünkü komut satırına bu adı yazacağız.  Next/Next diyerek işlemleri bitirelim.

Şimdi Windows üzerinde Virtual LPR portu üzerinden erişilebilen bir yazıcımız oldu. Şimdi komut satırından LPR ile yazıcıya birşeyler gönderip test edelim. Yeni sanal yazıcı eklersen XEROX yazdığınızı varsayarsak komutunuz aşağıdaki şekilde olması gerekmektedir.

lpr -S 10.70.1.99 -P XEROX -d “Hello World”

Bu komut yazıcıya tahmin ettiğiniz gibi Hello World yazdırtacaktır. Bunun yerine bir hello_world.txt ‘de verebilirdik. O zamanda tahmin ettiğiniz gibi bu dosyanın içeriğini yazardı. Dosya ismi verirken o Path’te olduğunuza veya tam path yazdığınıza dikkat ediniz.

Şimdi sıra geldi sora PHP’den bu işlemi nasıl yapacağımıza;

Örnek senorya için fatura bastırmanız gerektiğini varsayalım. Eğer faturaların file şeklinde kayıtlı durmasını isterseniz ki önermiyorum, o zaman /invoice diye bir dizine pdf etc. tarzında kaydettikten sonra Fatura bastır dendiğinde tahmin ettiğiniz gibi system() veya exec() method’ları ile yukarıdaki LPR komutunu dinamik oluşturup gönderebilirsiniz. Komutun sonunda bulunan “Hello World” yerine $invoicePath gibi içerisinde faturanın full path’nin tutulduğu bir değişken gelmesi gerekmektedir.

Diğer bir durumda temp dizininde oluşturup yazdırma işlemi sonrası silmek en iyisi bence. Bunun içinde PHP’deki tempnam() methodunu kullanmamız gerekmektedir.

 <?php
        $invoice  = "Faturanın bilgileri/full path bu değişkende olacak.";
        $tmpFile = tempnam(sys_get_temp_dir(), "invoice_");
        system("lpr -S 10.70.1.99 -P XEROX -d $invoice", $returnArgs);
        unlink($tmpFile);
 ?>

Eğer HDD’e faturayı bastırmak istiyorsanızda 2. satırdaki $tmpFile’dan sonra fopen(), fwrite() ile dosyayı yazıp daha sonra dosyayı oluşturduğunuz path’ı system’deki LPR string’ne verip işlemi tamamlayabilirsiniz. Fakat bu seçenekte unlink() methodunu yorum satırına almayı veya kaldırmayı unutmayınız.

Çok fazla zamanım olmadığından fazla detaya inemedim bu makalede, ilk zaman bulduğumda güncelleyip. Cluster Printing, Failover etc kısımlarınıda nasıl gerçekleyeceğinizi açıklamaya çalışacağım.

İyi Çalışmalar.

 
1 Comment

Posted in PHP

 

Tags: , , , , ,

Leave a Reply

 

 
  1. HD

    13/04/2011 at 10:03

    Not1: Unutmayın bu komutlar server-side’da çalışıyor. Yani yazıcının ve ayarların sunucu üzerinde yapılıp. Yazıcının sunucuya bağlanması gerekmektedir.

    Not2: Client-side tarafında JavaScript ile printer page’i (CTRL+P)’yi açtırabilirsiniz fakat yazdırmak için yine kullanıcının onay vermesi gerekmektedir.

    Not3: Client-side içinde direkt yazdırmak istiyorum diyorsanız o zaman Java derslerini takip etmelisiniz. :)

    İyi Çalışmalar.