C# 列印/預覽 入門教學 [淺析C#打印和C#打印預覽的實現]
C# (.net6 )列印/預覽 入門教學 [淺析C#打印和C#打印預覽的實現]
資料來源:https://github.com/zhangsanlzh/Solutions/blob/master/Micro.NET/C%23%E5%88%A4%E6%96%AD%E6%89%93%E5%8D%B0%E6%9C%BA%E5%B7%A5%E4%BD%9C%E7%8A%B6%E6%80%81.md
https://blog.csdn.net/lishimin1012/article/details/102638874
https://blog.csdn.net/qq_29331365/article/details/51538369
GITHUB: https://github.com/jash-git/CS_PrintDocument_EX
Code~PrinterSys.cs
using System; using System.Collections.Generic; using System.Linq; using System.Management;//nuget ~ System.Management [版本 6.0.0][作者: Microsoft] using System.Text; using System.Threading.Tasks; namespace CS_PrintDocument_EX { // 印表機狀態集合 public enum enum_printerSys_status { /// <summary> /// 其他狀態 /// </summary> other = 1, /// <summary> /// 未知 /// </summary> unknown, /// <summary> /// 空閒 /// </summary> free, /// <summary> /// 正在列印 /// </summary> print, /// <summary> /// 預熱 /// </summary> warmup, /// <summary> /// 停止列印 /// </summary> stop, /// <summary> /// 列印中 /// </summary> printing, /// <summary> /// 離線 /// </summary> offline, } public class PrinterSys : Printer { public PrinterSys(string name) : base(name) { } /// <summary> /// 獲取印表機狀態 /// </summary> /// <returns></returns> public enum_printerSys_status getStatus() { return (enum_printerSys_status)base.getStatus(); } } public class Printer { /// <summary> /// 構造函數 /// </summary> /// <param name="name">印表機名稱</param> public Printer(string name) { this.printer_name = name; } // 設備名:EPSON R330 Series private string _printer_name; /// <summary> /// 印表機名稱 /// </summary> public string printer_name { get { return _printer_name; } set { _printer_name = value; } } /// <summary> /// 獲取印表機狀態 /// </summary> /// <returns></returns> public int getStatus() { string path = @"win32_printer.DeviceId='" + this.printer_name + "'"; ManagementObject printer = new ManagementObject(path); printer.Get(); return Convert.ToInt32(printer.Properties["PrinterStatus"].Value); } } }
Code~Form1.cs
using System.Drawing.Printing; /* * C# 列印/預覽 入門教學 [淺析C#打印和C#打印預覽的實現] * C#印表機相關主要就是包括:頁面設置、打印預覽、打印三大部分 * WINDOWS打印的原理是:生成mdi文件,系統碰到mdi的時候會自動以打印的方式處理。所以不管用什麼模板/什麼方式;只要能在PrintPage事件處理中,生成一張要打印內容的圖片就OK了 * C# 列印/預覽 的實現主要通過PrintDocument類來完成,另外還包括幾個輔助類:PrintDialog(打印對話框)、PrintPreviewDialog(打印預覽對話框)、PageSetupDialog。 */ //https://github.com/zhangsanlzh/Solutions/blob/master/Micro.NET/C%23%E5%88%A4%E6%96%AD%E6%89%93%E5%8D%B0%E6%9C%BA%E5%B7%A5%E4%BD%9C%E7%8A%B6%E6%80%81.md //https://blog.csdn.net/lishimin1012/article/details/102638874 namespace CS_PrintDocument_EX { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e)//列印紙張設定 { PageSetupDialog page = new PageSetupDialog(); page.Document = printDocument1; page.AllowMargins = true; page.AllowOrientation = true; page.AllowPaper = true; page.AllowPrinter = true; page.ShowHelp = true; if (page.ShowDialog() == DialogResult.OK) { printDocument1.DefaultPageSettings = page.PageSettings; } } private void button2_Click(object sender, EventArgs e)//印表機設定 { PrintDialog print = new PrintDialog(); print.Document = printDocument1; print.AllowCurrentPage = true; print.AllowPrintToFile = true; print.AllowSelection = true; print.AllowSomePages = true; print.ShowHelp = true; if (print.ShowDialog() == DialogResult.OK) { printDocument1.PrinterSettings = print.PrinterSettings; } } private void button3_Click(object sender, EventArgs e)//列印預覽 { if (MessageBox.Show("是否要預覽列印檔案?", "預覽列印", MessageBoxButtons.OKCancel, MessageBoxIcon.Exclamation) == DialogResult.OK) { // 設置要預覽的文檔 printPreviewDialog1.Document = printDocument1; // 開啟作業系統的抗鋸齒功能 printPreviewDialog1.UseAntiAlias = true; // 打開預覽視窗 if (printPreviewDialog1.ShowDialog() == DialogResult.OK) { // 如果選擇的是系統預設印表機,點擊“列印”按鈕之後,會跳出“檔另存為”窗口; // 如果選擇別的印表機,點擊“列印”之後,會直接列印,不會返回“OK”。 MessageBox.Show("開始列印"); } else { MessageBox.Show("關閉預覽"); } } } private void button4_Click(object sender, EventArgs e)//開始列印 { // PrintController:控制一個PrintDocument是如何列印的。 PrintController printController = new StandardPrintController(); printDocument1.PrintController = printController; printDocument1.DocumentName = "社保樣卡"; //printDocument1.PrinterSettings.PrinterName = "XID8600 U1"; printDocument1.Print(); // 觸發Print_Page事件。 } // PrintDocument 三個事件中的第二個參數 e 有如下屬性: // e.Cancel:設置為true,將取消這次列印工作。 // e.Griphics:所使用印表機的設備環境。 // e.HasMorePages:PrintPage事件列印一頁後,如果仍有資料未列印,退出事件前設置 // HasMorePages=true;退出事件之後將再次出發PrintPage事件,列印下一頁。 // e.MarginBounds:列印範圍的大小,是Rectangle結構,元素包括左上角座標(Left和Top), // 寬和高(Width和Height),單位為1/100英寸。 // e.PageSettings:PageSettings類物件,包含用對話方塊PageSetupDialog設置的頁面列印方式的 // 全部資訊, // 在調用 Print 方法後,在列印文檔的第一頁之前發生。 private void printDocument1_BeginPrint(object sender, System.Drawing.Printing.PrintEventArgs e) { } // 需要列印新的一頁時發生,負責列印一頁所需要的資料 // 預覽列印會調用該事件,預覽的內容就是此處設置好的內容。 private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e) { Image iamge = Image.FromFile(@"D:\photo\test.jpg"); e.Graphics.DrawString("社保卡樣卡", new Font("黑體", 35), Brushes.Black, new Point(400, 120)); e.Graphics.DrawString("姓名 張三", new Font("黑體", 25), Brushes.Black, new Point(480, 270)); e.Graphics.DrawString("社會保障號碼 32032032302030230", new Font("黑體", 25), Brushes.Black, new Point(480, 360)); e.Graphics.DrawString("社會保障卡號 JS2018098", new Font("黑體", 25), Brushes.Black, new Point(480, 450)); e.Graphics.DrawString("制卡日期 2016年5月", new Font("黑體", 25), Brushes.Black, new Point(480, 540)); e.Graphics.DrawImage(iamge, new Point(100, 240)); } // 在列印完最後一頁文檔時發生。 private void printDocument1_EndPrint(object sender, System.Drawing.Printing.PrintEventArgs e) { } private void button5_Click(object sender, EventArgs e)//印表機狀態 { PrinterSys PrinterSys = new PrinterSys(comboBox1.SelectedItem.ToString()); textBox1.Text = $"{PrinterSys.getStatus()}"; } private void button6_Click(object sender, EventArgs e)//所有印表機列表 { PrintDocument print = new PrintDocument(); string sDefault = print.PrinterSettings.PrinterName;//預設印表機名 foreach (string sPrint in PrinterSettings.InstalledPrinters)//獲取所有印表機名稱 { comboBox1.Items.Add(sPrint); if (sPrint == sDefault) comboBox1.SelectedIndex = comboBox1.Items.IndexOf(sPrint); } } } }