Jump to content

C# - Belge Yazdırma (printdocument, Printsettings)


wmismail

Recommended Posts

PrintDocument

Uygulamalarımızın çıktısını yazıcıya gönderen sınıf PrintDocument sınıfıdır. Bu sınıfın metod ve özelliklerini inceleyelim.

Özellikler

DefaultPageSettings: Yazdırılacak sayfalardaki kenar boşlukları (margins) gibi sayfa ayarlarını ifade eder. PageSettings sınıfının bir örneğini alır ve veya döndürür.

DocumentName: Belgenin ismini temsil eder. Bu ismi, yazıcının kendi penceresini açtığımızda görünen yazdırma kuyruğundaki belgeler kısmında görebiliriz.

OriginAtMargins : “Boolean” bir değer alır. Sayfanın koordinat sisteminin başlangıç noktasını belirlemede kullanılır. Varsayılan değeri “false” olarak ayarlıdır. Yani “Graphics” sınıfı kullanılarak sayfaya bir şey yazdırıldığında, 0:0 noktası sayfanın sol üst noktasıdır. Ancak “true” olarak ayarlanırsa 0:0 noktası sayfa marjin ayarlarına göre belirlenir. Örneğin sol marjin 50, üst marjin 80 ise başlangıç noktası 50:80 koordinatları olur.

PrintController: Yazdırma işlemini kontrol eden “PrintController” sınıfının bir örneğini alır.

PrinterSettings : Yazıcı ayarlarını tutar. “PrinterSettings” sınıfının bir örneğini alır.

Metodlar

Print: Yazdırma işlemini başlatır.

Olaylar

BeginPrint : “Print” metodu çağrıldıktan hemen sonra ilk sayfanın yazdırma işlemi başlamadan önce tetiklenir. Sayfada kullanılacak “Font” vb. tanımların yapıldığı yerdir. Bu tanımları “PrintPage” içerisinde yapıp, bu olayı kullanmayabiliriz. Ancak unutmayın ki genel kural olarak döngü içlerinde değişken tanımı yapılmaz. Hata değildir ama performansı açısından sakıncalıdır. “PrintPage” olayı her sayfa yazdırılırken çağrılır. Yani 100 sayfalık bir belgede 100 defa bu olayın metodu kullanılır. Yani bir tür döngüdür. Eğer değişken tanımları (Font,Color vs.) “PrintPage” içerisinde yapılırsa aynı değişken 100 defa tanımlanmış olur. “Local” değişken olduğu için metodun işi bitince siliniyor diyebiliriz. Ancak “Garbage Collector”de ancak sistemde başka işlem yoksa çalışır, yani en iyi ihtimalle yazdırma sonlanınca çalışacaktır.

EndPrint: Son sayfa yazdırıldıktan sonra tetiklenir. Genelde “BeginPrint” olayı metodunda tanımlanan değişkenlerin, yok edildiği yerdir.

PrintPage: Bir sayfanın yazdırma işlemi başladığında tetiklenir. Yazdırılacak metin, resim ve belgelerin yazdırıldığı yer, bu olayın metodudur.

QueryPageSettings: Her sayfa yazdırılmadan önce tetiklenir. Sayfaların ayarlarını belirler.

PageSettings

Bir sayfanın, sayfa ayarlarını belirlemek için kullanılır.

Özellikler

Bounds: Sayfanın boyutlarını bulur. ReadOnly bir özelliktir. “Rectangle” sınıfının bir örneğini döndürür. Sayfanın yatay veya dikey olmasını dikkate alır. (Landscape özelliğinin True olarak ayarlanmasına veya ayarlanmamasına göre boyutları belirler.)

Color: Boolean bir değer tutar. Sayfanın renkli basılıp basılmayacağını belirler.

HardMarginX: Sayfanın solundaki “hard margin” boşluğunu inç/100 biriminde bulur. ReadOnly özelliktedir. Hard Margin ayarları yazıcıdan yazıcıya değişir. Yazıcılar kağıtların kenarlarındaki bazı alanlara baskı yapmazlar. Bu alanlara Hard Margin denir.

HardMarginY: Sayfanın üstündeki “hard margin” boşluğunu inç/100 biriminde bulur. ReadOnly bir özelliktir.

LandsCape: Sayfanın yatay olup olmadığını belirler.

Margins: Sayfanın kenar boşluklarını belirler. Margins sınıfının bir örneğini tutar. Bu sınıfın Left, Right, Top, Bottom özelliklerini kullanarak kenar boşluklarını belirleyebiliriz.

PaperSize: Sayfanın boyutunu tutar. “PaperSize” sınıfının bir örneğini kullanır. Bu sınıfın özellikleri şunlardır;

Height : Yükseklik

Width : Genişlik

PaperName : Kağıt tipinin ismi

Kind :”PaperKind” numaralı listesindeki değerlerden birini alır. Bunlardan birkaçı letter, lettersmall, a3, a4, a4small, a5, b4, b5, legal, tabloid’dir.

PaperSource : Yazıcının kağıt kaynağını belirler. “PaperSource” sınıfının bir örneğini kullanır. Bu sınıfın “Kind” özelliğini kullanarak kaynağın tipini belirtebiliriz. Bu değerler “PaperSourceKind” numaralı listesinde tutulur. Bunlardan birkaçı upper, lower, middle, manual, envelope, manualfeed’dir.

PrintableArea : Yazıcıya göre yazdırılacak alanı belirler. Yazıcıların genellikle sayfa kenarlarını “kesmepayı” ve “tutmapayı” diye ifade edilen kendileri için ayarladıkları alanları(hard margin) vardır. Bu kısımları yazdırma için kullanamayız.

PrinterResolution : Yazıcının çözünürlüğünü belirler. “PrinterResolution” sınıfının bir örneğini kullanır. Bu sınıfın 3 özelliği vardır. Bunlar;

Kind: Çözünürlük türünü belirler. PrinterResolutionKind numaralı listesini kullanır. Bu listedeki (enumeration) değerler şunlardır;

High, Medium, Low, Draft, Custom, X(Yazıcının yatay çözünürlüğünü ayarlar), Y(Yazıcının dikey çözünürlüğünü ayarlar)’dir.

PrinterSettings: Sayfanın yazıcı ayarlarını belirler. “PrinterSettings” sınıfının bir örneğini kullanır.

Şimdi bu anlattıklarımı pekiştirmek amacıyla küçük bir uygulama geliştirelim ve makalemizi sonlandıralım.

Yeni bir Windows projesi oluşturuyoruz. Formumuza 3 button, 1 textbox (multiline özelliği true olmalı) ve yazdırma kontrollerimizi (printdocument1, printpreviewdialog1, printdialog1, pagesetupdialog1) ekliyoruz. Görünüm aşağıdaki gibi olmalıdır;

1000000783_image001.jpg

1000000783_image002.jpg

PrintPreviewDialog1’in Document özelliğini PrintDocument1 olarak ayarlıyoruz.

PageSetupDialog1’in Document özelliğini de PrintDocument1 olarak ayarlıyoruz.

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Drawing.Printing; //unutmayın

using System.Text;

using System.Windows.Forms;

namespace PrintWorks

{

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

}

private void btnayarlar_Click(object sender, EventArgs e)

{

this.PageSetupDialog1.ShowDialog();

PageSettings ayarlar = this.PageSetupDialog1.PageSettings;

this.PrintDocument1.DefaultPageSettings = ayarlar;

}

private void btnonizleme_Click(object sender, EventArgs e)

{

this.PrintPreviewDialog1.ShowDialog();

}

private void btnyazdir_Click(object sender, EventArgs e)

{

this.PrintDialog1.ShowDialog();

}

int toplamsayfa = 10;

int sayfano = 1;

private void PrintDocument1_PrintPage(object sender, PrintPageEventArgs e)

{

//yazi fontumuzu ayarliyoruz

Graphics gr = e.Graphics;

//yazi tipi Trebuchet MS, boyutu 30 ve bold karakterlerle yazilicak

Font f = new Font("Trebuchet MS", 30, FontStyle.Bold);

//yazdirma alanimizin ozellıklerını belirliyoruz

Rectangle yazdirma_alani = new Rectangle();

yazdirma_alani.X = this.PrintDocument1.DefaultPageSettings.Margins.Left;

yazdirma_alani.Y = this.PrintDocument1.DefaultPageSettings.Margins.Top;

yazdirma_alani.Width = this.PrintDocument1.DefaultPageSettings.PaperSize.Width - this.PrintDocument1.DefaultPageSettings.Margins.Left - this.PrintDocument1.DefaultPageSettings.Margins.Right;

yazdirma_alani.Height = this.PrintDocument1.DefaultPageSettings.PaperSize.Height - this.PrintDocument1.DefaultPageSettings.Margins.Top - this.PrintDocument1.DefaultPageSettings.Margins.Bottom;

if (this.PrintDocument1.DefaultPageSettings.Landscape)

{

int tempwidth = yazdirma_alani.Width;

yazdirma_alani.Width = yazdirma_alani.Height;

yazdirma_alani.Height = tempwidth;

}

//yazdirma alaninin kenarındaki cizgilerin ozelliklerini ayarliyoruz

Pen p = new Pen(Color.Pink);

p.DashStyle = System.Drawing.Drawing2D.DashStyle.Dot;

gr.DrawRectangle(p, yazdirma_alani);

gr.DrawString(this.TextBox1.Text + " : " + sayfano, f, Brushes.Black, (yazdirma_alani.X + 10), (yazdirma_alani.Y + 20));

sayfano++;

if (sayfano < toplamsayfa)

e.HasMorePages = true;

else

e.HasMorePages = false;

}

}

}

Uygulamamızın çalışır durumdaki önizleme görüntüsü şöyle olacaktır;

1000000783_image003.jpg

Ayarlar butonunun click eventindeki

this.PageSetupDialog1.ShowDialog();

PageSettings ayarlar = this.PageSetupDialog1.PageSettings;

this.PrintDocument1.DefaultPageSettings = ayarlar;

kodların sayesinde açılan sayfa ayarları penceresindeki ayarlar olduğu gibi belgemize aktarılmaktadır.

Bu makalemizde böylelikle sona erdi. C#.Net ile Belge yazdırmayı, PrintDocuments ve PrintSettings sınıfının özelliklerini öğrenmiş olduk.

Umarım faydalı ve işe yarar olmuştur. Farklı makalelerde tekrar görüşmek üzere, İyi çalışmalar.

Daha önceki makalemde PrintDocument sınıfını tanımış ve System.Drawing.Printing namespacei hakkında bilgi sahibi olmuştuk. Şimdi bu bilgilerimizi küçük bir uygulamayla pekiştirme vakti..

Daha öncede söylediğimiz gini C#’ta belgeleri yazdırmak için kullanacağımız temel sınıf “PrintDocument” sınıfıdır.

Yazdırmayla ilgili sınıflar ise “System.Drawing.Printing” namespaceinde bulunur. Bu sınıflar hakkında detaylı bilgiler zaten ilk makalemde var.

Şimdi gelelim uygulamamızın içeriğine ve oluşturulmasına. Maddeler halinde uygulamamız şu şekilde işleyecektir.

- Öncelikle programımız bir Windows programıdır. 1 formdan oluşmaktadır.

- Formun üzerinde 5 label, 5 textbox ve 3 button bulunmaktadır.

- Buttonların isimleri btnyazdir, btnonizleme, btnayarlar’dır.

- Textbox ve labelların isimlerine herhangi bir şey yazmıyoruz.

- Ayrıca projemize toolboxtan pageSetupDialog, printDialog, printDocument ve printPreviewDialog ekliyoruz.

- PageSetupDialog, printDialog ve printPreviewDialog’un document özelliğinde printDocument1’i seçiyoruz.

- Amacımız textboxa yazdığımız değerlerin (bu değerler veritabanından da gelebilir) labellarla karşılıklı bir biçimde bir sayfada yayınlanması ve print edilebilinmesi.

Aslında bu tip işlemler crystal reports’la da yapılabilinir ancak bu şekilde daha basit ve daha az zamanla istediğimize ulaşabiliriz bu tamamen sizin opsiyonunuzda J

Uygulamanız orta düzeydeyse bu print yolu da ihtiyacınızı rahatlıkla karşılayabilir.

- Çalıştığım kurumdaki geliştirdiğim projede böyle bir şeye ihtiyacım vardı. 2 yol vardı önümde; ya crystral reportslarla yapıcaktım ya da bu şekilde bir sistemle.

Projem bir işçi takip programıydı ve artık banada 15 veri giriş çıkışı pek abartı gelmediğinden bu sistemi uyguladım.

Eğer sizden çok ciddi bir raporlama bekleniyorsa mutlaka crystal reports kullanın derim.

Bu sadece insanların bilgi edinebileceği basit bir yazdırma şekli olucak.

Aslında sayfa tasarımındaki yaratıcılık tamamen sizin elinizde. Grafikle arası iyi olanlar çok hoş şeyler çıkarabilir J

Formumuzun görünümü şu şekilde olacaktır;

1000000907_image001.jpg

Ayrıca eklediğimiz diğer kontrollerimizde şöyle;

1000000907_image002.jpg

Şimdi gelelim kodlarımıza. Kodların açıklamalarını satır aralarında bulabileceksiniz.

Bu şekilde birebir kodları anlayabilir ve aklınızda kurabilirsiniz.

private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)

{

//bir graphics tanımlıyoruz

//e parametresi ile yazdırma işlemi sırasında kullanılacak nesne, metoda gönderılır

Graphics cizer = e.Graphics;

//f ismibde bir font tanımlayıp 12 punto buyuklugunde ve Trebuchet MS cinsinde oldugunu belirtiyoruz

Font f = new Font("Trebuchet MS", 12);

//bir fırça olusturup rengini yesil seciyoruz

Brush b = Brushes.Green;

//garfigimizin milimetrik olacagini belirtiyoruz

//cunku vericegimiz rakamlar milimetre hesabi olucak

//ve bize sayfa duzenimizi buna gore ayarlayacagiz

cizer.PageUnit = GraphicsUnit.Millimeter;

//yazdirma olayi drawstring metodu ile olmaktadir

//bu metodun ılk parametresi degeri alacagi kontrol olacaktir

//ikinci parametre font, ucuncusu brush, dorduncusu baslangic degeri

//ve besinci parametre bitis degeri olmalidir

cizer.DrawString(label1.Text, f, b, 25, 25);

cizer.DrawString(textBox1.Text, f, b, 100, 25);

cizer.DrawString(label2.Text, f, b, 25, 40);

cizer.DrawString(textBox2.Text, f, b, 100, 40);

cizer.DrawString(label3.Text, f, b, 25, 55);

cizer.DrawString(textBox3.Text, f, b, 100, 55);

cizer.DrawString(label4.Text, f, b, 25, 65);

cizer.DrawString(textBox4.Text, f, b, 100, 65);

cizer.DrawString(label5.Text, f, b, 25, 80);

cizer.DrawString(textBox5.Text, f, b, 100, 80);

//istersek sayfamızın tam ortasına bir elips cizdirebiliriz

//belki bu da sayfa tasarımını ayarlamamızda bıze yardımcı olabılır

//once bir kalem tanımlarız ve rengini belirleriz

//Pen p = new Pen(Color.Blue);

//sonrada elips cizecegimizi belirleyip parametrelerimizi gireriz

//cizer.DrawEllipse(p, 100, 100, 40, 30);

//yine istersek sayfamıza kenarlık cizdirebiliriz

//yine once bir kalem tanımlar rengini belirleriz

//Pen p = new Pen(Color.Blue);

//cizer.DrawRectangle(p, 20, 20, 100, 200);

//ise bir kolaylık olarak resimde ekleyebiliriz

//formumuza bir picturebox koyup resimini belirtiriz

//daha sonra o resmide yazdirmak icin

//e.Graphics.DrawImage(picturebox1.image, 50,50);

//seklinde belirtmemiz yeterli

}

private void printDocument1_BeginPrint(object sender, System.Drawing.Printing.PrintEventArgs e)

{

//sayfa sayımızı hesaplıyoruz, en fazla 1 sayfa olabilir

printDocument1.PrinterSettings.MinimumPage = 1;

printDocument1.PrinterSettings.MaximumPage = 1;

}

private void btnayarlar_Click(object sender, EventArgs e)

{

//sayfa ayarlarımız ıcın bir dialog kutusu cıkartıyoruz

//bu kutudan gerekli ayarlamaları yapabiliriz

pageSetupDialog1.ShowDialog(this);

}

private void btnonizleme_Click(object sender, EventArgs e)

{

//onizleme kutusu cıkartarak sayfanın yazdırılmadan once son durumunu gorebiliriz

printPreviewDialog1.ShowDialog(this);

}

private void button2_Click(object sender, EventArgs e)

{

//son olarak yazdirma islemini yapacagimiz kutuyu ekrana getiriyoruz

//buradan ilgili printerı secerek yazdırma ıslemımızı tamamlayabılırız

printDialog1.ShowDialog(this);

}

Projemizi çalıştıralım. Önce sayfa ayarlarını yapacağımız buttonumuza tıklayalım.

Görünüm şu şekilde olmalıdır;

1000000907_image003.jpg

Daha sonra tamam diyerek formumuzdaki textboxlara çeşitli değerler girelim.

Değerleri girdikten sonra da önizleme butonuna tıklayalım. Görünüm şöyle olacaktır;

1000000907_image004.jpg

Son olarak önizleme penceremizi kapatıp yazdır buttonuna tıkladığımızda, belirttiğimiz printerdan sayfamızın çıktığı görünmelidir J

Aksi durumda kodlarımızı kontrol etmeliyiz. Özellikle toolboxtan sürüklediğimiz kontrollerin printDocument nesnesini belirtmeliyiz.

Zira bu küçük hatalar projemizde sorunlar ortaya çıkartabilir ve sonuç düzgün olmaz.

Yine bir sorun çıkarsa bana mail yoluyla ulaşabilirsiniz J

Umarım faydalı bir makale olmuştur, ben kendi projelerimde epey faydasını gördüm.

Tekrar etmem gerekirse, bir sayfa çıkartmak istediğiniz projelerinizde bu sistemi kullanabilirsiniz.

Ancak ciddi bir raporlama sistemi oluşturmak istiyorsanız crystal reports kullanmalısınız.

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...