Would you like to react to this message? Create an account in a few clicks or log in to continue.

    C# Ta Yazıcı Çıktısı Alamak İçin Program

    Admin
    Admin
    Admin
    Admin


    Mesaj Sayısı : 77
    Kayıt tarihi : 25/06/10
    Yaş : 30
    Nerden : Amasya

    C# Ta Yazıcı Çıktısı Alamak İçin Program Empty C# Ta Yazıcı Çıktısı Alamak İçin Program

    Mesaj tarafından Admin Perş. Mart 21, 2013 8:55 am

    C# ile Windows iş uygulaması geliştiriyorsanız programınızın mutlaka
    yazıcı çıktısı alma bölümü olacaktır. Bu makalede C# ile nasıl yazıcı
    çıktısı alınabileceğinin temelleri üzerinde duracağım.




    .NET sınıf kütüphanesi her alanda olduğu gibi yazıcı çıktısı alma ile ilgili
    bir takım sınıflar sağlamıştır. PrintDocument sınıfı
    yazı çıktısı alma ile ilgili en temel sınıftır. Bu yazıda bu sınıfın
    özelliklerini, olaylarını ve metotlarını ayrıntılı bir şekilde inceleyip tek
    sayfalı yada çok sayfalı yazıcı çıktısının nasıl alınabileceğini göstereceğim.
    Ayrıca yazıcı çıktısı alma ile çok yakından ilgili olan PrintPreview,
    PageSetupDialog ve PrintDialog
    gibi sınıflarıda inceleyeceğiz.



    PrintDocument Sınıfı


    Bu sınıf programlarımıza yazıcı çıktısı alma desteğini eklemek için
    kullanabileceğimiz en temel yapıdır. Bu sınıf türünden bir nesne yaratıldığında
    çıktı alma ile ilgili hemen her tür bilgiye erişmemiz mümkündür.



    PrintDocument YaziciCiktisi = new PrintDocument();


    şeklinde bir tanımlama yaptığımızda varsayılan yazıcı(default
    printer) ile çalışılmaktadır. Bir dökümanı yazıcıya göndermek için
    PrintDocument sınıfının Print() metodu kullanılır.
    Print() metodu çağrıldığı anda PrintPage olayı
    meydana gelir. Bu olayı yakalayan kontrol yazıcıya gönderilecek döküman
    üzerinde işlemler yaparak çıktının şeklini belirlemelidir. Her bir sayfa
    için ayrıca PrintPage olayı meydana geleceği için her bir olay
    içinde doğru sayfaları yazıcıya göndermek için bir takım işlemler yapmak
    gerekecektir. Aksi halde her defasında birinci sayfayı yazıcıya gönderme
    ihtimalimiz vardır. Kısacası PrintPage olayı olmadan yazıcıya çıktı bilgilerini
    gönderemeyiz. Bu yüzden ilk olarak PrintPage olayını ve bu olaya ait
    argümanları içeren PrintPageEventArgs sınıfını
    inceleyelim.


    Önce PrintPage olayının argümanlarını içeren PrintPageEventArgs sınıfının üye
    elemanlarını inceleyelim, ardında bir konsol uygulamasından yazıcıya nasıl bir
    döküman göndereceğimizi göstereceğim.



    PrintPageEventArgs sınıfnın üye elemanları :



    Graphics : Yazıcıya gönderilecek döküman bilgilerini
    belirleyen grafik nesnesidir. Yazıcya gönderilecek bilgilerin tamamı bu nesne
    içerisinde belirtilecektir. Not : Graphics sınıf GDI+ kütüphanesinin en
    önemli sınıfıdr.



    Cancel : Çıktı alma işleminin iptal edilip edilemeyeceği ile
    ilgili bilgi veren bool türünden bir elemandır. Eğer değeri true ise çıktı alma
    işlemi iptal edilecektir.



    HasMorePages : Yazıcıya gönderilecek çıktının birden
    fazla sayfa kapladığı durumlarda PrintPage olayına ilişkin metotta bu özelliğin
    true olarak değiştirilmesi gerekir. Böylece bundan sonraki PrintPage
    olaylarında bu değişken kontrol edilerek diğer sayfaların çıktıya gönderilmesi
    ile ilgili işlemler yapılır.



    MarginBounds
    : Yazıcıya
    gönderilen çıktı dökümanının en ve boyutlarını temsil eden Rectangle
    türünden bir özelliktir. Rectangle sınıfıda GDI+ kütüphanesinin bir parçasıdır.
    Bu özellikte yazıcıya gönderilecek çıktının sadece üzerine çizim yapılabilen
    kısmı belirtilir.



    PageBounds : Yazıcıya gönderilen dökümanın
    tamamının en ve boy değerlerini tutan yine Rectangle sınıfı türünden bir
    elemandır.




    PageSettings: İlgili dökümana ait sayfa ayarlarını tutan ve
    PageSettings
    sınıfı türünden bir elemandır. PageSettings sınıfının
    Color, Landscape, Margins, PaperSize, PaperSource, PrinterResolution gibi sayfa
    ile ilgili bilgi tutan üye özellikleri bulunmaktadır.



    Şimdi basit bir örnekle yazıcıya çıktı gönderelim. Örneğimizde varsayılan
    yazıcınıza, sol üst köşesi (20,20) koordinatlarında eni ve boyu 100 olan bir
    dörtgen içeren sayfayı göndereceğiz. Gönderilecek sayfadaki dörtgeni çizmek
    için tahmin edeceğiniz üzere Graphics nesnesini kullanacağız.






    using System;
    using System.Drawing.Printing;
    using System.Drawing;
    class Printer
    {
    static void Main()
    {
    PrintDocument PD =
    new PrintDocument();
    PD.PrintPage += new
    PrintPageEventHandler(OnPrintDocument);

    try
    {
    PD.Print();
    }

    catch
    {
    Console.WriteLine("Yazıcı
    çıktısı alınamıyor...");
    }

    finally
    {
    PD.Dispose();
    }
    }
    private static void OnPrintDocument(object
    sender, PrintPageEventArgs e)
    {
    e.Graphics.DrawRectangle(Pens.Red,20,20,100,100);
    }
    }



    Yukarıdaki programı derleyip çalıştırdığınızda hiç bir uyarı eğer
    verilmeden sisteminize bir yazıcı bağlı OnPrintDocument() metodunda
    hazırlanan içerik yazıcıya gönderilecektir. Eğer sisteminize bağlı bir yazıcı
    yoksa doğal olarak catch bloğundaki kod çalışacaktır.




    Çizilen dörtgen nesnesinin kağıdın neresine basılacağını biz belirliyoruz.
    MarginBounds özelliğini kullanarak çizilecek içeriğin doğru noktaya çizilmesini
    sağlayabiliriz. Bu özellik sizin yazıcı ayarlarınız ile ilgili olduğu için
    programlama yolu ile kod içerisinden değiştirilemez. Yani bu özellik "read
    only" bir özelliktir. Dikkat edilmesi gereken diğer bir noktada yazıcıya
    gönderilecek içeriğin PageBounds özelliği ile belirtilen dörtgenin dışına
    taşmamasıdır. Bu yüzden çizimleri yapılırken bu özellik baz alınmalıdır.



    Yukarıda yazdığımız basit programda eksiklik bulunmaktadır. Bu eksiklik
    çizilecek dörtgenin tek bir sayfaya sığmadığı durumlarda görülür. Söz gelimi
    eğer dörtgenin yüksekliğini 2000 yaparsak yazıcıdan sadece ilk kağıda sığan
    bölümü çıkacaktır. Birden fazla sayfası olan çıktıları yazıcıya göndermek için
    PrintPageEventArgs sınıfnın HasMorePages özelliği kullanılır.
    Bu özellik OnPrintDocument() metodu içerisinde true değerine
    çekilerek çıktı alma işleminin devam ettiği belirtilmelidir. Ayrıca her bir
    sayfanın içeriğide metot her çağrıldığında farklı bir biçimde oluşturulacağı
    için programcının bu ayrımı da kodlaması gerekmektedir. Örneğin yüksekliği 2000
    pixel olan bir dikdörtgeni tek sayfada bastıramayacağımız için ilk sayfaya
    sığmayan diğer bölümleri parçalayarak her bir sayfaya sığacak şekilde
    ayarlamalıyız. Bu işlem için PrintPageEventArgs sınıfnın HasMorePages
    değişkenini kullanacağız.



    Hemen diğer bölümlere geçmeden önce birden fazla sayfalı yazıcı çıktısı alma
    işlemine örnek verelim. Bu örnekte bir text dosyasının içeriğini yazıcıya nasıl
    gönderebileceğimizi inceleyeceğiz. Tabi burda yazının birden fazla sayfada olup
    olmadığının kontrolünü yapmamız gerekir. Yazıları yazıcı çıktısına göndermek
    için Graphics sınıfnın DrawString metodunu kullanacağız. Bu metot grafik
    arayüzüne belirli bir fontta ve font büyüklüğünde yazı yazmamızı sağlar. Önce
    örneği inceleyelim ardından örnek üzerinde biraz konuşacağız.






    using System;
    using System.IO;
    using System.Drawing;
    using System.Windows.Forms;
    using System.Drawing.Printing;
    class Printer
    {
    private static StreamReader
    dosyaAkimi;
    static void Main(string[]
    args)
    {
    dosyaAkimi = new
    System.IO.StreamReader("C:\\Print.txt");
    PrintDocument PD =
    new PrintDocument();
    PD.PrintPage +=
    new PrintPageEventHandler(OnPrintDocument);
    try
    {
    PD.Print();
    }
    catch
    {
    Console.WriteLine("Yazici
    çiktisi alinamiyor...");
    }
    finally
    {
    PD.Dispose();
    }
    }
    public static void OnPrintDocument(object
    sender,PrintPageEventArgs e)
    {
    Font font = new
    Font("Verdana", 11) ;
    float yPozisyon = 0 ; int
    LineCount = 0 ;
    float leftMargin =
    e.MarginBounds.Left;
    float topMargin =
    e.MarginBounds.Top;
    string
    line=null;
    float
    SayfaBasinaDusenSatir = e.MarginBounds.Height / font.GetHeight() ;
    while
    (((line=dosyaAkimi.ReadLine()) != null) &&
    LineCount < SayfaBasinaDusenSatir)
    {
    yPozisyon
    = topMargin + (LineCount * font.GetHeight(e.Graphics));
    e.Graphics.DrawString
    (line, font, Brushes.Red, leftMargin,yPozisyon);
    LineCount++;
    }
    if
    (line = = null)
    e.HasMorePages
    = false ;
    else
    e.HasMorePages
    = true ;
    }
    }

    Yukarıdaki program herhangi bir text formatındaki dosyayı yazıcıya gönderek
    çıktı almanızı sağlayacaktır. Dosyanın içeriğini yazıcıya gönderirken çıktının
    ne şekilde olacağı tamamen programlama yolu ile bizim tarafımızdan
    yapılmaktadır. Örneğin çıktının yazı fontunu GDI+ kütüphanesinin bir sınıfı
    olan Font ile yazı renginide yine GDI+ kütüphanesinin Brushes sınıfının üye
    elemanları ile rahatlıkla değiştirebiliriz.



    Yukarıdaki örnek uygulamada en önemli kısım dosya içeriğinin yazıcıyı
    gönderilmesi sırasında görülür. Dosya içeriğinin birden fazla sayıda sayfa
    içermesi durumunda dosya akımından bir sayfaya sığacak kadar satır okunmalıdır.
    Eğer dosya akımının sonuna gelinmediyse HasMorePages özelliği
    true yapılarak OnPrintDocument metodunun yeniden çağrılması gerekir. Kaynak
    koddanda gördüğünüz üzere dosya akımından okunan satır null değereeşit
    olduğunda yani dosyanın sonuna gelindiğinde HasMorePages özeliiği false
    yapılarak Print() metodunun icrası sonlandırılmıştır.




    Bir diğer önemli nokta ise yazıcıya gönderilecek her bir sayfada kaç satırın
    bulunacağının belirlenmesidir. Sayfa başına düşen satır sayısı, sayfanın
    yazıcıya gönderilecek bölümünün yüksekliğinin yani e.MarginBounds.Height
    'in çıktıya gönderilecek yazıya ait fontun yüksekliğine bölümü ile elde edilir.
    Sayfa başına üşen satır sayısı elde edildikten sonra herbir sayfanın içeriği
    while döngüsü yardımı ile hazırlanır. Okunan satır sayısı null
    değere eşit olmayana kadar ve okunan satır sayısı sayfa başına düşen satır
    sayısı olana kadar döngüye devam edilir. Döngü içerisinde PrintPageEventArgs
    olay argümanlarını içeren sınıfın Graphics nesnesine DrawString()
    metodu yardımıyla dosya akımından okunan satır yazılır. Bir sonraki satırın
    çıktı ekranının neresinden başlayacağını tutmak için ise her bir satır
    okunduğunda yPozisyon'u kullanılan font'un yüksekliği kadar artırılır. Bütün bu
    işlemleri yaptıktan sonra HasMorePages özelliği ayarlanır ki sonraki sayfalar
    çıktıya gönderilsin. Eğer dosya sonuna gelinmişse artık basılacak sayfa yok
    demektir ve HasMorePages özelliği false olarak belirlenir.



    Not : Dosya akımının neden
    OnPrintDocument() metodunun içinde tanımlanmadığını merak ediyor olabilirsiniz.
    Bunun sebebi OnPrintDocument() metodunun her bir sayfa için yeniden
    çağrılmasıdır. Eğer dosya akımını bahsi geçen metotta tanımlamış olsaydık her
    defasında dosya akımı baştan okunacağı için hiç bir zaman dosya akımının sonuna
    gelemeyecektik ve her defasında sonsuza dek ilk sayfayı çıktıya göndermiş
    olacaktık. Bu yüzden dosya akımını global düzey diyebileceğimiz bir noktada
    yani ana sınıfımın bir üye elamanı olacak şekilde tanımladık.




    Aklınıza takılmış olabilecek diğer bir nokta ise yazıcının renk ayarlarıdır.
    Eğer yazcınız renkli çıktı almayı desteklemiyorsa DrawString() metoduna
    parametre olarak geçtiğimiz Brushes.Red parametresinin bir
    önemi olmayacaktır. Bu yüzden dökümanları yazıcya göndermeden yazcının renkli
    baskıyı desteleyip desteklemediğini kontrol etmek en akıllıca yöntemdir.
    Bu şekildeki bri kontrol için PrintDocument sınıfının PrinterSettings
    özelliği kullanılabilir. Bu özellik varsayılan yazcınız ile ilgili bir takım
    ayarları yapısında barındıran özelliklere sahiptir. Örneğin varsayılan
    yazıcınızın renkli bakıyı destekleyip desteklemediğini kontrol etmek için SupportsColor
    özelliğini aşağıdaki gibi kullanabilirsiniz. Not : SupportsColor özelliği bool
    türündendir.



    using System;
    using System.Drawing.Printing;
    using System.Drawing;
    class Printer
    {
    static void Main()
    {
    PrintDocument PD =
    new PrintDocument();
    PD.PrintPage += new
    PrintPageEventHandler(OnPrintDocument);
    if
    ( PD.PrinterSettings.SupportsColor )
    {
    //renkli
    baskı ayarları
    }
    else
    {
    //renksiz
    baskı ayarları
    }
    }
    private static void OnPrintDocument(object
    sender, PrintPageEventArgs e)
    {
    ....
    }
    }




    PrinterSettings yolu ile elde edebileceğimiz diğer önemli özellikler
    aşağıda listelenmiştir.



    CanDuplex : bool türünden olan bu değişken yazıcının arkalı
    önlü çıktı almayı destekleyip desteklemediğini belirtir.



    Copies: short türünden olan bu değişken yazıcıya gönderilecek
    dökümanın kaç kopya çıkarılacğını belirtir. Eğer 10 sayfalık bir döküman için
    bu özelliği 5 olarak girerseniz 50 adet kağıdınızı yazıcıya yerleştirmeyi
    unutmayın.



    CanDuplex
    : bool türünden olan bu değişken yazıcının arkalı önlü
    çıktı almayı destekleyip desteklemediğini belirtir.



    Duplex : Duplex enum sabiti türünden olan bu değişken arkalı
    önlü baskı özelliğini belirler. Duplex numaralandırması
    Default,Sizmplex,Horizontal ve Vertical olmak üzere dört tane üyesi vardır.



    IsDefaultPrinter : PrinterName ile belirtilen yazıcının
    bilgisayarınızdaki varsayılan yazıcı(default printer) olup olmadığını belirtir.



    IsValid
    : PrinterName ile belirtilenin gerçekten sisteminize
    ait bir yazıcı olup olmadığını belirtir.



    PaperSizes : Yazıcı tarafından desteklenen sayfa
    ebatlarının PaperSizeCollection türünden bir koleksiyon
    nesnesi ile geri döner. Bu koleksiyondaki her bir eleman System.Drawing isim
    alanında bulunan PaperSize türündendir. PaperSize sınıfnın
    Width(sayfa eni), Height(sayfa boyu),Kind(sayfa türü) gibi özellikleri
    bulunmaktadır.



    PaperSources : Yazıcı tarafından desteklenen
    sayfa kağıt alma kaynaklarını PaperSourceCollection türünden
    bir koleksiyon nesnesi ile geri döner. Bu koleksiyondaki her bir eleman
    System.Drawing isim alanında bulunan PaperSource türündendir.
    PaperSource sınıfnın Kind özelliği PaperSourceKind
    numaralandırması türünden bir nesne olup kağıt kaynağının tipini belirtir.Bu
    numaralandırmanın bazı semboleri şunlardır : Envelope, Cassette, Custom,
    Manuel, TractorFeed.



    PrintToFile : Çıktının herhangi port yerine bir dosyaya
    yazdırılıp yazdırılmayacağını tutan bool türünden bir değişken. Bu değişken
    daha çok birazdan göreceğimiz PrintDialog ekranının görüntülenmesi sırasında
    değiştirilip kullanılır.





    Çıktı Ön-İzleme Penceresi



    Profesyonel uygulamaların tamamında yazıcıya çıktı göndermeden önce kullanıcıya
    ön izleme imkanı sağlanır. .NEt ortamında program geliştiriyorsanız Windows'un
    standart ön izleme penceresini programlama yolu ile görüntülemeniz son derece
    kolaydır. Bu ekranın görüntülenmesi için System.Drawing isim alanında bulunan
    PrintPreviewDialog
    sınıfı kullanılır. Bu sınıf ile
    ilişkilendirilmiş PrintDocument nesnesinin PrintPage olayına
    ilişkin metot çalıştırılarak ön-izleme penceresindeki içerik elde edilir.




    Bir PrintPreviewDialog nesnesi oluşturulduktan sonra nesnenin Document
    özelliğine PrintDocument türünden bir nesne atanır. Ve ardından
    PrintPreviewControl türünden olan nesne üzerinden Show() yada
    ShowDialog()
    metotları kullanılarak ön izleme ekranı gösterilir.



    Ön izleme çıktısnın görüntülendiği pencereyi elbette PrintDocument sınıfnın
    Print() metodunu çağırmadan önce göstermeliyiz. Daha önce yaptığımız ve dosya
    içeriğini yazıcıya gönderen uygulmanın Main() metodunu aşağıdaki gibi
    değiştirerek ön izleme ekranından çıktıya gönderilecek içeriği görüntüleyelim.



    static void Main(string[]
    args)
    {
    dosyaAkimi = new
    System.IO.StreamReader("C:\\Print.txt");
    PrintDocument PD =
    new PrintDocument();
    PD.PrintPage +=
    new PrintPageEventHandler(OnPrintDocument);
    PrintPreviewDialog
    pdlg = new PrintPreviewDialog();

    pdlg.Document = PD;

    pdlg.ShowDialog();
    try
    {
    PD.Print();
    }
    catch
    {
    Console.WriteLine("Yazici
    çiktisi alinamiyor...");
    }
    finally
    {
    PD.Dispose();
    }
    }


    Programı yeni haliyle derleyip çalıştırdığımızda ilk önce öıktı ön izleme
    ekranı aşağıdaki gibi gösterilecektir. Not : Çıktıya gönderilecek dosyanın yolu
    örneğimiz için "C:\Print.txt" şeklinde olmalıdır.



    C# Ta Yazıcı Çıktısı Alamak İçin Program PrintPreviewDialog1





    Sayfa Düzenleme Ekranı (PageSetupDialog Sınıfı)



    Dökümanı çıktıya göndermeden önce gönderme işleminin hangi yazıcı ayarları ile
    yapılacağını belirlemek için genellikle sayfa düzenleme ekranı gösterilir. Bu
    ekranda kağıt tipinden, yazcının kağıt kaynağına kadar bir çok özelliği
    değiştirmeniz mümkündür. Bu ekranda yapılan bütün değişiklikler PrintDocument
    sınıfının PrinterSettings özelliğine aktarılır. Sayfa düzenleme ekrana
    System.Drawing isim alanında bulunan PrintSetupDialog sınıfı
    ile gerçekleştirilir. Bu sınıfının kullanımı PrintPreviewDialog
    sınıfının kullanımı ile nerdeyse aynıdır. Bu yüzden ayrıca açıklmaya gerek
    duymuyorum.



    Son olarak yazıcı ön izleme ekranından önce sayfa düzenleme ekranının
    gösterilmesini sağlamak için uygulamamaızın Main() metodunu aşağıdaki gibi
    değiştirin ve çalıştırın.



    static void Main(string[]
    args)
    {
    dosyaAkimi = new
    System.IO.StreamReader("C:\\Print.txt");
    PrintDocument PD =
    new PrintDocument();
    PD.PrintPage +=
    new PrintPageEventHandler(OnPrintDocument);
    PrintDialog
    pdiyalog = new PrintDialog();

    pdiyalog.Document =
    PD;
    pdiyalog.ShowDialog();
    PrintPreviewDialog pdlg = new
    PrintPreviewDialog();
    pdlg.Document = PD;
    pdlg.ShowDialog();
    try
    {
    PD.Print();
    }
    catch
    {
    Console.WriteLine("Yazici
    çiktisi alinamiyor...");
    }
    finally
    {
    PD.Dispose();
    }
    }



    Programı derleyip çalıştırdığınızda karşınıza ilk çıkacak görüntü aşağıdaki
    ekran olacaktır.



    C# Ta Yazıcı Çıktısı Alamak İçin Program PrintPreviewDialog2



    Bu örnekle birlikte yazıcı çıktısı alma ile ilgili temel işlemlerin anlatıldığı
    yazımızın sonuna geldik. .NET teki yazıcı çıktısı alma işlemleri bu
    anlattıklarımla sınırlı değildir. Ancak bu yazıda anlatılanlar bu konuya çok
    hızlı bir giriş yapmanızı sağlamıştır. İlerleyen yazılarda görüşmek dileğiyle.

      Forum Saati Salı Mayıs 07, 2024 6:27 am