پرینت گرفتن در سی شارپ
برای پرینت گرفتن در سی شارپ ، از کلاس PrintDocument در فضای نام System.Drawing.Printing استفاده کنید
28 اردیبهشت 1405
لینک کوتاه
پرینت گرفتن در سی شارپ
در سی شارپ، پرینت گرفتن معمولاً با استفاده از کلاس PrintDocument در فضای نام System.Drawing.Printing انجام میشود.ابتدا یک شیء از این کلاس ساخته، سپس رویداد PrintPage آن را پیادهسازی میکنید؛ در این رویداد با استفاده از شیء Graphics که از طریق e.Graphics در دسترس است،
میتوانید با متدهایی مانند DrawString برای متن، DrawLine برای رسم خط و DrawImage برای چاپ تصویر، خروجی مورد نظر را روی صفحه رسم کنید.
در نهایت با فراخوانی متد ()Print کار چاپ آغاز میشود.
برای انتخاب پرینتر، تنظیم تعداد کپی و سایر گزینهها میتوانید از کنترل PrintDialog استفاده کنید و همچنین با PrintPreviewDialog امکان پیشنمایش خروجی قبل از چاپ را به کاربر بدهید.
اجزای اصلی پرینت در سی شارپ
1. کلاس PrintDocument (مهمترین کلاس)
PrintDocument هسته اصلی عملیات چاپ است. این کلاس شامل رویدادها و متدهایی است که فرآیند چاپ را کنترل میکند.2. کلاس PrintDialog
یک دیالوگ استاندارد ویندوزی که به کاربر امکان انتخاب پرینتر، تعداد کپی، محدوده صفحات و سایر تنظیمات را میدهد.3. کلاس PrintPreviewDialog
پیشنمایش سند قبل از چاپ را نمایش میدهد.4. کلاس PageSetupDialog
تنظیمات صفحه مانند حاشیهها، اندازه کاغذ و جهت چاپ (عمودی/افقی) را فراهم میکند.5. کلاس PrintPageEventArgs
حاوی اطلاعات صفحه در حال چاپ است، از جمله شیء Graphics که برای رسم محتوای صفحه استفاده میشود.

مثال کاربردی 1: چاپ یک متن ساده
در این مثال، یک متن ساده را با فونت و موقعیت مشخص چاپ میکنیم.using System;
using System.Drawing;
using System.Drawing.Printing;
using System.Windows.Forms;
public class SimplePrintExample
{
private PrintDocument printDocument = new PrintDocument();
private string textToPrint = "سلام! این متن توسط سی شارپ چاپ شده است.";
public SimplePrintExample()
{
// اتصال رویداد PrintPage
printDocument.PrintPage += new PrintPageEventHandler(PrintPageHandler);
}
public void Print()
{
// نمایش دیالوگ چاپ
PrintDialog printDialog = new PrintDialog();
printDialog.Document = printDocument;
if (printDialog.ShowDialog() == DialogResult.OK)
{
printDocument.Print();
}
}
private void PrintPageHandler(object sender, PrintPageEventArgs e)
{
// تعریف فونت و قلممو
Font font = new Font("B Nazanin", 14);
Brush brush = Brushes.Black;
// موقعیت شروع متن (x=100, y=100)
float x = 100;
float y = 100;
// رسم متن روی صفحه
e.Graphics.DrawString(textToPrint, font, brush, x, y);
// اگر صفحه دیگری وجود نداشته باشد، false برگردانید
e.HasMorePages = false;
}
}
آیا به دنبال یک فرصت عالی برای یادگیری برنامهنویسی هستید؟ 🚀
با دوره آموزشی سیشارپ ما، شما میتوانید مهارتهای خود را به سطح جدیدی ارتقا دهید! این دوره بهطور کامل طراحی شده تا به شما کمک کند تا از مبتدی تا پیشرفته در دنیای برنامهنویسی سیشارپ پیش بروید.
👨🏫 چرا دوره ما را انتخاب کنید؟
- محتوای جامع و عملی: با پروژههای واقعی و تمرینات عملی، یادگیری را به تجربهای جذاب تبدیل کنید.
- مدرس مجرب: از تجربه و دانش مدرس حرفهای بهرهمند شوید که شما را در هر مرحله از یادگیری راهنمایی میکنند.
- پشتیبانی ۲۴/۷: هر زمان که سوالی داشتید، ما در کنار شما خواهیم بود تا به شما کمک کنیم.
- دسترسی مادامالعمر: به محتوای دوره دسترسی دائمی داشته باشید و هر زمان که خواستید، میتوانید به آن مراجعه کنید.
💡 فرصت را از دست ندهید!
بایادگیری سیشارپ، میتوانید در دنیای فناوری اطلاعات به یک متخصص تبدیل شوید و در پروژههای جذاب و چالشبرانگیز شرکت کنید.
همین امروز به جمع یادگیرندگان ما بپیوندید و اولین قدم را به سوی آیندهای روشنتر بردارید!
شرکت در دوره آموزش برنامه نویسی سی شارپ
مثال کاربردی 2: چاپ چندین صفحه با فهرست
در این مثال، لیستی از آیتمها را در چندین صفحه چاپ میکنیم.using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Printing;
using System.Windows.Forms;
public class MultiPagePrintExample
{
private PrintDocument printDocument = new PrintDocument();
private List<string> items;
private int currentPage = 0;
private int linesPerPage = 40;
private Font printFont = new Font("B Nazanin", 11);
private Font headerFont = new Font("B Nazanin", 14, FontStyle.Bold);
public MultiPagePrintExample(List<string> data)
{
this.items = data;
printDocument.PrintPage += new PrintPageEventHandler(PrintPageHandler);
printDocument.BeginPrint += new PrintEventHandler(BeginPrintHandler);
}
public void ShowPrintPreview()
{
PrintPreviewDialog previewDialog = new PrintPreviewDialog();
previewDialog.Document = printDocument;
previewDialog.WindowState = FormWindowState.Maximized;
previewDialog.ShowDialog();
}
public void Print()
{
PrintDialog printDialog = new PrintDialog();
printDialog.Document = printDocument;
if (printDialog.ShowDialog() == DialogResult.OK)
{
printDocument.Print();
}
}
private void BeginPrintHandler(object sender, PrintEventArgs e)
{
// ریست کردن شماره صفحه در شروع چاپ
currentPage = 0;
}
private void PrintPageHandler(object sender, PrintPageEventArgs e)
{
// محاسبه موقعیت شروع
float yPos = e.MarginBounds.Top;
int count = 0;
int startIndex = currentPage * linesPerPage;
int endIndex = Math.Min(startIndex + linesPerPage, items.Count);
// رسم هدر صفحه
string header = $"گزارش - صفحه {currentPage + 1} از {Math.Ceiling((double)items.Count / linesPerPage)}";
e.Graphics.DrawString(header, headerFont, Brushes.Black,
e.MarginBounds.Left, yPos);
yPos += headerFont.GetHeight(e.Graphics) + 10;
// رسم خط جداکننده
e.Graphics.DrawLine(Pens.Black, e.MarginBounds.Left, yPos,
e.MarginBounds.Right, yPos);
yPos += 10;
// رسم آیتمهای صفحه جاری
for (int i = startIndex; i < endIndex; i++)
{
string line = $"{i + 1}. {items[i]}";
e.Graphics.DrawString(line, printFont, Brushes.Black,
e.MarginBounds.Left, yPos);
yPos += printFont.GetHeight(e.Graphics);
count++;
}
// اگر صفحات بیشتری باقی مانده باشد
currentPage++;
e.HasMorePages = (currentPage * linesPerPage) < items.Count;
}
}
// نحوه استفاده
public class Program
{
public static void Main()
{
List<string> data = new List<string>();
for (int i = 1; i <= 150; i++)
{
data.Add($"آیتم شماره {i} - توضیحات مربوط به این آیند");
}
MultiPagePrintExample printer = new MultiPagePrintExample(data);
printer.ShowPrintPreview(); // نمایش پیشنمایش
// printer.Print(); // چاپ مستقیم
}
}
مثال کاربردی 3: چاپ یک فرم یا گزارش
در این مثال، یک فرم صورتحساب (فاکتور) را با طراحی حرفهای چاپ میکنیم.using System;
using System.Drawing;
using System.Drawing.Printing;
using System.Windows.Forms;
public class InvoicePrintExample
{
private PrintDocument printDocument = new PrintDocument();
// اطلاعات فاکتور
private class InvoiceData
{
public string InvoiceNumber { get; set; }
public DateTime Date { get; set; }
public string CustomerName { get; set; }
public string CustomerPhone { get; set; }
public List<InvoiceItem> Items { get; set; }
public decimal SubTotal { get; set; }
public decimal Tax { get; set; }
public decimal Total { get; set; }
}
private class InvoiceItem
{
public string Name { get; set; }
public int Quantity { get; set; }
public decimal UnitPrice { get; set; }
public decimal Total { get; set; }
}
private InvoiceData invoice;
public InvoicePrintExample(InvoiceData data)
{
this.invoice = data;
printDocument.PrintPage += new PrintPageEventHandler(PrintPageHandler);
}
public void Print()
{
PrintDialog printDialog = new PrintDialog();
printDialog.Document = printDocument;
if (printDialog.ShowDialog() == DialogResult.OK)
{
printDocument.Print();
}
}
public void ShowPreview()
{
PrintPreviewDialog preview = new PrintPreviewDialog();
preview.Document = printDocument;
preview.WindowState = FormWindowState.Maximized;
preview.ShowDialog();
}
private void PrintPageHandler(object sender, PrintPageEventArgs e)
{
Graphics g = e.Graphics;
Font titleFont = new Font("B Nazanin", 18, FontStyle.Bold);
Font headerFont = new Font("B Nazanin", 12, FontStyle.Bold);
Font normalFont = new Font("B Nazanin", 10);
Font smallFont = new Font("B Nazanin", 9);
Brush blackBrush = Brushes.Black;
float y = e.MarginBounds.Top;
int leftMargin = e.MarginBounds.Left;
int rightMargin = e.MarginBounds.Right;
int centerX = (leftMargin + rightMargin) / 2;
// عنوان فاکتور
StringFormat centerFormat = new StringFormat();
centerFormat.Alignment = StringAlignment.Center;
g.DrawString("شرکت نمونه - صورتحساب فروش", titleFont, blackBrush,
centerX, y, centerFormat);
y += titleFont.GetHeight(g) + 15;
// اطلاعات فاکتور (دو ستونه)
// ستون راست: اطلاعات فاکتور
string invoiceInfo = $"شماره فاکتور: {invoice.InvoiceNumber}\n" +
$"تاریخ: {invoice.Date:yyyy/MM/dd}\n";
g.DrawString(invoiceInfo, normalFont, blackBrush,
rightMargin - 150, y);
// ستون چپ: اطلاعات مشتری
string customerInfo = $"نام مشتری: {invoice.CustomerName}\n" +
$"تلفن: {invoice.CustomerPhone}";
g.DrawString(customerInfo, normalFont, blackBrush,
leftMargin, y);
y += 80;
// رسم خط جداکننده
g.DrawLine(Pens.Black, leftMargin, y, rightMargin, y);
y += 10;
// هدر جدول
int col1 = leftMargin;
int col2 = leftMargin + 200;
int col3 = leftMargin + 350;
int col4 = leftMargin + 450;
g.DrawString("نام کالا", headerFont, blackBrush, col1, y);
g.DrawString("تعداد", headerFont, blackBrush, col2, y);
g.DrawString("قیمت واحد", headerFont, blackBrush, col3, y);
g.DrawString("مجموع", headerFont, blackBrush, col4, y);
y += headerFont.GetHeight(g);
g.DrawLine(Pens.Black, leftMargin, y, rightMargin, y);
y += 10;
// رسم آیتمهای فاکتور
foreach (var item in invoice.Items)
{
g.DrawString(item.Name, normalFont, blackBrush, col1, y);
g.DrawString(item.Quantity.ToString(), normalFont, blackBrush, col2, y);
g.DrawString(item.UnitPrice.ToString("N0"), normalFont, blackBrush, col3, y);
g.DrawString(item.Total.ToString("N0"), normalFont, blackBrush, col4, y);
y += normalFont.GetHeight(g);
}
y += 20;
g.DrawLine(Pens.Black, leftMargin, y, rightMargin, y);
y += 15;
// جمعهای فاکتور (سمت راست)
string totals = $"جمع کل: {invoice.SubTotal:N0} تومان\n" +
$"مالیات (9%): {invoice.Tax:N0} تومان\n" +
$"قابل پرداخت: {invoice.Total:N0} تومان";
g.DrawString(totals, headerFont, blackBrush, rightMargin - 200, y);
y += 80;
// امضا
g.DrawString("امضاء و مهر شرکت", smallFont, blackBrush,
leftMargin, y);
g.DrawString("امضاء مشتری", smallFont, blackBrush,
rightMargin - 100, y);
e.HasMorePages = false;
}
}
// نحوه استفاده
public class Program
{
public static void Main()
{
var invoice = new InvoiceData
{
InvoiceNumber = "123456",
Date = DateTime.Now,
CustomerName = "شرکت بازرگانی الف",
CustomerPhone = "021-12345678",
Items = new List<InvoiceItem>
{
new InvoiceItem { Name = "لپتاپ ایسوس", Quantity = 2, UnitPrice = 25000000, Total = 50000000 },
new InvoiceItem { Name = "موس بیسیم", Quantity = 5, UnitPrice = 350000, Total = 1750000 },
new InvoiceItem { Name = "کیبورد مکانیکال", Quantity = 3, UnitPrice = 1200000, Total = 3600000 }
}
};
invoice.SubTotal = 55350000;
invoice.Tax = 4981500;
invoice.Total = 60331500;
InvoicePrintExample printer = new InvoicePrintExample(invoice);
printer.ShowPreview();
}
}
مثال کاربردی 4: چاپ مستقیم بدون دیالوگ
گاهی نیاز است بدون نمایش هیچ دیالوگی، مستقیماً به پرینتر پیشفرض چاپ کنیم.using System;
using System.Drawing;
using System.Drawing.Printing;
public class SilentPrintExample
{
public void PrintDirectly(string text)
{
PrintDocument printDoc = new PrintDocument();
// استفاده از پرینتر پیشفرض
printDoc.PrinterSettings.PrinterName = PrinterSettings.InstalledPrinters[0];
// تنظیمات اضافی
printDoc.DefaultPageSettings.Landscape = false;
printDoc.DefaultPageSettings.Margins = new Margins(50, 50, 50, 50);
printDoc.PrintPage += (sender, e) =>
{
Font font = new Font("B Nazanin", 12);
e.Graphics.DrawString(text, font, Brushes.Black,
e.MarginBounds.Left, e.MarginBounds.Top);
e.HasMorePages = false;
};
// چاپ مستقیم (بدون دیالوگ)
printDoc.Print();
}
public void PrintRawTextToPOSPrinter(string text)
{
// برای پرینترهای حرارتی و POS
RawPrinterHelper.SendStringToPrinter(PrinterSettings.DefaultPrinterSettings.PrinterName, text);
}
}
// کلاس کمکی برای چاپ خام به پرینتر
public class RawPrinterHelper
{
[System.Runtime.InteropServices.DllImport("winspool.Drv", EntryPoint = "OpenPrinterA",
SetLastError = true, CharSet = System.Runtime.InteropServices.CharSet.Ansi,
ExactSpelling = true, CallingConvention = System.Runtime.InteropServices.CallingConvention.StdCall)]
public static extern bool OpenPrinter(string szPrinter, out IntPtr hPrinter, int pd);
[System.Runtime.InteropServices.DllImport("winspool.Drv",
EntryPoint = "ClosePrinter", SetLastError = true, ExactSpelling = true,
CallingConvention = System.Runtime.InteropServices.CallingConvention.StdCall)]
public static extern bool ClosePrinter(IntPtr hPrinter);
public static bool SendStringToPrinter(string printerName, string text)
{
IntPtr hPrinter;
if (!OpenPrinter(printerName, out hPrinter, 0))
return false;
try
{
// تبدیل متن به بایت
System.Text.Encoding encoding = System.Text.Encoding.UTF8;
byte[] bytes = encoding.GetBytes(text);
// ارسال به پرینتر
// (کد کامل نیاز به DllImportهای اضافی دارد)
return true;
}
finally
{
ClosePrinter(hPrinter);
}
}
}
تنظیمات پیشرفته پرینت در سی شارپ
1. تنظیم حاشیهها و اندازه صفحه
PrintDocument printDoc = new PrintDocument();
// تنظیم اندازه صفحه A4
printDoc.DefaultPageSettings.PaperSize = new PaperSize("A4", 827, 1169); // بر حسب صدم اینچ
// تنظیم حاشیهها (صدم اینچ)
printDoc.DefaultPageSettings.Margins = new Margins(100, 100, 100, 100);
// جهت چاپ افقی
printDoc.DefaultPageSettings.Landscape = true;
2. چاپ با کیفیت بالا
printDoc.DefaultPageSettings.PrinterSettings.DefaultPageSettings.PrintQuality =
PrinterResolutionKind.High;
// یا تنظیم DPI خاص
printDoc.DefaultPageSettings.PrinterSettings.DefaultPageSettings.PrinterResolution =
new PrinterResolution
{
Kind = PrinterResolutionKind.Custom,
X = 600,
Y = 600
};
3. رویدادهای مهم PrintDocument
printDoc.BeginPrint += (sender, e) =>
{
// قبل از شروع چاپ - مثل باز کردن فایل یا اتصال به دیتابیس
Console.WriteLine("شروع چاپ...");
};
printDoc.EndPrint += (sender, e) =>
{
// بعد از اتمام چاپ - مثل بستن اتصالات
Console.WriteLine("چاپ پایان یافت.");
};
printDoc.QueryPageSettings += (sender, e) =>
{
// قبل از هر صفحه - امکان تغییر تنظیمات هر صفحه جداگانه
if (e.PageNumber == 1)
{
e.PageSettings.Landscape = false;
}
else
{
e.PageSettings.Landscape = true;
}
};

عیبیابی مشکلات رایج پرینت گرفتن در سی شارپ
مشکل 1: متن فارسی به درستی چاپ نمیشود
// استفاده از StringFormat با پشتیبانی از راستبهچپ
StringFormat rightToLeft = new StringFormat();
rightToLeft.Alignment = StringAlignment.Near;
rightToLeft.FormatFlags = StringFormatFlags.DirectionRightToLeft;
e.Graphics.DrawString("متن فارسی", font, Brushes.Black, x, y, rightToLeft);
مشکل 2: پرینتر پیدا نمیشود
// بررسی پرینترهای نصب شده
foreach (string printer in PrinterSettings.InstalledPrinters)
{
Console.WriteLine(printer);
}
// انتخاب اولین پرینتر موجود
if (PrinterSettings.InstalledPrinters.Count > 0)
{
printDoc.PrinterSettings.PrinterName = PrinterSettings.InstalledPrinters[0];
}
جمعبندی
پرینت گرفتن در سی شارپ با استفاده از فضای نام System.Drawing.Printing و کلاس PrintDocument بسیار قدرتمند و انعطافپذیر است.با استفاده از مثالهای ارائه شده در این مقاله میتوانید:
- متون ساده و چند صفحهای چاپ کنید
- گزارشها و فاکتورهای حرفهای طراحی کنید
- پیشنمایش و دیالوگهای تنظیمات را پیادهسازی کنید
- چاپ مستقیم و بدون دیالوگ انجام دهید


کاربران ما
شما هم نظرتون با ما دریاره “پرینت گرفتن در سی شارپ” اشتراک بزارید
برای ارسال نظر لطفا ورود یا ثبت نام کنید