C# da yazıcı kullanmak için PrintDocument nesnesi kullanılır.PrintDocument nesnesini kullanabilmek için ilk olarak
System.Drawing.Printing;
namespace i projeye eklenmelidir. PrintDocument nesnesi parametre almayan bir yapıcı fonksiyon kullanılarak oluşturulur.
PrintDocument belge = new PrintDocument();
bu tanımlamayı class seviyesinde yaparsanız nesneye heryerden erişebilirsiniz. Yazdırılacak metin bir dosyadan alınabileceği gibi form üzerindeki componentlerden veya herhangi bir değişkendende alınabilir. Biz burada dosyadan yazdırma işlemi yapacağız. Onun için yine class seviyesinde dosyadan okuma yapacak bir nesne oluşturuyoruz.
StreamReader okuyucu = new StreamReader(@"C:\Yazilimgrubu.txt");
veya
StreamReader okuyucu = new StreamReader("C:\\Yazilimgrubu.txt");
@ işareti escape karekterleri pasif hale getirir. Yazdırma işlemine başlamak için
belge.Print();
komutu kullanılır. bu komut kullanıldığında PrintPage olayı tetiklenir. Biz bu olay tetiklendiğinde hangi fonksiyonun çalışacağınıbelirlemek zorundayız. onun için şu satırı eklemeliyiz.
belge.PrintPage += new PrinPagetEventHandler(belge_Yazdir);daha sonra yazdırma sırasında kullanılacak yazı tipini belirlemeye. Yine bunun için de class seviyesinde bir tanımlama yapacağız.
Font yazitipi = new Font("Arial", 10);
daha sonra "belge_Yazdir" adında bir fonksiyon oluşturmalıyız. Tüm işi yapacak olan fonksiyon işte bu.
private void belge_Yazdir(object sender, PrintPageEventArgs e)
{
}
Artık bu kısımdan sonra işin en önemli kısmı. öncelikle kenar boşlukları için birkaç tane float türünden değişken oluşturuyoruz.
float satirsayisi = 0; // Belgedeki bir sayfanın kaç satırdan oluştuğunu bulmak için
float pozisyon = 0; //Yazdırılacak satırın koordinatı
float aktifsatir = 0; // O an aktif sayfadaki kaçıncı satırın yazdırıldığı
float solbosluk = e.MarginBounds.Left; //Sayfanın sol kenar boşluğu. bu değer sayfa özelliklerinden alınıyor
float ustbosluk = e.MarginBounds.Top; //Sayfanın üst kenar boşluğu. bu değer sayfa özelliklerinden alınıyor
string satir = null; //O an yazdırılacak satırdaki metin
Değişkenlerimizi oluşturduktan sonra bir sayfaya kaç satır metin yazdırılacağını bulmamız gerekiyor. A4 boyutundaki bir kağıda sığacak satır sayısı ile A3 boyutundaki kağıda sığacak satır sayısı farklıdır. Bunu bulmak için sayfa yüksekliğini yazıtipinin yüksekliğine bölüyoruz.
satirsayisi = e.MarginBounds.Height / yazitipi.GetHeight(e.Graphics);
Metnimizin kaç satırdan oluştuğunu hesapladığımıza göre artık metni satır satır yazıcıya gönderebiliriz. Bunun için döngülerden faydalanacağız. Bu iş için en uygun döngü türü while döngüsüdür.
while (aktifsatir < satirsayisi && (satir = okuyucu.ReadLine())!=null)
{
pozisyon = ustbosluk + (aktifsatir * yazitipi.GetHeight(e.Graphics));
e.Graphics.DrawString(satir, yazitipi, new SolidBrush(Color.Black), solbosluk, pozisyon);
aktifsatir++;
}
Yazdırma işlemi bitti fakat while döngüsü sadece 1 sayfa için çalıştı yazdırılacak başka sayfalar olup olmadığını kontrol etmemiz gerekli.
bunun için
if (satir != null)
e.HasMorePages = true;
else
e.HasMorePages = false;
komutunu kullanıyoruz ve yazdırma işlemi otomatik olarak devam ediyor. Son olarak kodun tamamı şu şekilde
using System;
using System.Drawing.Printing;
using System.Drawing;
using System.IO;
using System.Windows.Forms;
namespace YazilimGrubu
{
public partial class Form1 : Form
{
PrintDocument belge = new PrintDocument();
StreamReader okuyucu = new StreamReader(@"C:\Yazilimgrubu.txt");
Font yazitipi = new Font("Arial", 10);
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
belge.Print();
belge.PrintPage += new PrintPageEventHandler(belge_Yazdir);
}
void belge_PrintPage(object sender, PrintPageEventArgs e)
{
float satirsayisi = 0;
float pozisyon = 0;
float aktifsatir = 0;
float solbosluk = e.MarginBounds.Left;
float ustbosluk = e.MarginBounds.Top;
string satir = null;
satirsayisi = e.MarginBounds.Height / yazitipi.GetHeight(e.Graphics);
while (aktifsatir < satirsayisi && (satir = okuyucu.ReadLine())!=null)
{
pozisyon = ustbosluk + (aktifsatir * yazitipi.GetHeight(e.Graphics));
e.Graphics.DrawString(satir, yazitipi, new SolidBrush(Color.Black), solbosluk, pozisyon);
aktifsatir++;
}
if (satir != null)
e.HasMorePages = true;
else
e.HasMorePages = false;
}
}
}
Hiç yorum yok:
Yorum Gönder