C# 列印/預覽 入門教學 [淺析C#打印和C#打印預覽的實現]

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);
            }
        }

    }
}

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *