• C# 利用PrintDocument定制打印单据


    本文是利用PrintDocument定制打印单据的小例子,仅供学习分享使用,如果不足之处,还请指正。

    涉及知识点:

    • PrintDocument :从 Windows 窗体应用程序打印时,定义一种可重用的可发送到打印机上的对象。
    • PrintPreviewControl :表示 Windows 窗体应用程序打印预览的原始预览部分,没有任何对话框或按钮。
    • Graphics :GDI+绘图对象
    • PrinterSettings:设置打印机属性,如:设置属性Copies,可以设置打印份数,默认为1,
    • PageSettings:指定应用于单页打印的设置
    • DefaultPageSettings:PrintDocument的属性
    • PrintPage事件:PrintDocument的事件,通过此事件来绘制需要打印的内容
    • PaperSize:指定纸张大小
    • 毫米和英寸的换算:打印机是以英寸为单位的,单据设置是以毫米为单位的,所以需要转换

     效果图如下:

    核心代码

    关键代码如下:

      1 using System;
      2 using System.Collections.Generic;
      3 using System.ComponentModel;
      4 using System.Data;
      5 using System.Drawing;
      6 using System.Drawing.Printing;
      7 using System.Linq;
      8 using System.Text;
      9 using System.Threading.Tasks;
     10 using System.Windows.Forms;
     11 
     12 namespace DemoPrint
     13 {
     14     public partial class MainForm : Form
     15     {
     16         private int width_p = 200;//单位是mm
     17 
     18         private int height_p = 70;//单位是mm
     19 
     20         private int margin_lr = 2;//左右边距
     21 
     22         private int margin_tb = 2;//上下边距
     23 
     24         /// <summary>
     25         /// 需要打印的内容
     26         /// </summary>
     27         public List<PrintInfo> PrintInfos { get; set; }
     28 
     29         private PrintHelper printHelper = new PrintHelper();
     30 
     31         public MainForm()
     32         {
     33             InitializeComponent();
     34         }
     35 
     36         private void MainForm_Load(object sender, EventArgs e)
     37         {
     38             InitInfo();
     39             InitDocument();
     40         }
     41 
     42         private void InitInfo() {
     43             PrinterSettings printSetting = new PrinterSettings();
     44             printSetting.PrintRange = PrintRange.AllPages;
     45 
     46         
     47             int width_in = MM2Inch(width_p);
     48             int height_in = MM2Inch(height_p);
     49             PageSettings pageSetting = new PageSettings(printSetting);
     50             pageSetting.PaperSize = new PaperSize("customer",width_in, height_in);
     51             
     52             int margin_lr_in = MM2Inch(margin_lr);
     53             int margin_tb_in = MM2Inch(margin_tb);
     54             pageSetting.Margins = new Margins(margin_lr_in, margin_lr_in, margin_tb_in, margin_tb_in);
     55             this.pdControl.DefaultPageSettings = pageSetting;
     56         }
     57 
     58         private void InitDocument() {
     59             List<PrintInfo> lstPrintInfos = new List<PrintInfo>();
     60             PrintInfo p0 = new PrintInfo()
     61             {
     62                 PrtType = PrintType.Table,
     63                 PrtColor = Color.Brown,
     64                 Row = int.Parse(this.txtRow.Text.Trim()),
     65                 Column = int.Parse(this.txtColumn.Text.Trim()),
     66                 Start = new Point(int.Parse(this.txtStart.Text.Trim(new char[] { '(', ')' }).Split(',')[0]), int.Parse(this.txtStart.Text.Trim(new char[] { '(', ')' }).Split(',')[1])),
     67                 End = new Point(int.Parse(this.txtEnd.Text.Trim(new char[] { '(', ')' }).Split(',')[0]), int.Parse(this.txtEnd.Text.Trim(new char[] { '(', ')' }).Split(',')[1]))
     68                 
     69             };
     70             lstPrintInfos.Add(p0);
     71             printHelper.PrintInfos = lstPrintInfos;
     72         }
     73 
     74         /// <summary>
     75         /// 转换毫米到百分之一英寸
     76         /// </summary>
     77         /// <param name="mm"></param>
     78         /// <returns></returns>
     79         private int MM2Inch(int mm) {
     80            return (int)(mm * 100.0f / 25.4f);
     81         }
     82 
     83         /// <summary>
     84         /// 打印开始事件
     85         /// </summary>
     86         /// <param name="sender"></param>
     87         /// <param name="e"></param>
     88         private void pdControl_BeginPrint(object sender, PrintEventArgs e)
     89         {
     90 
     91         }
     92 
     93         /// <summary>
     94         /// 打印事件
     95         /// </summary>
     96         /// <param name="sender"></param>
     97         /// <param name="e"></param>
     98         private void pdControl_PrintPage(object sender, PrintPageEventArgs e)
     99         {
    100             Font font = new Font("Arial", 14f, FontStyle.Regular);
    101             Graphics g = e.Graphics;
    102             g.PageScale = 1;
    103             g.PageUnit = GraphicsUnit.Millimeter;
    104             //先画一个矩形
    105             Pen lineColor = new Pen(Color.Black, 0.2f);
    106             g.FillRectangle(Brushes.Linen,0,0,width_p,height_p);
    107             printHelper.Print(g);
    108         }
    109 
    110         /// <summary>
    111         /// 打印结束事件
    112         /// </summary>
    113         /// <param name="sender"></param>
    114         /// <param name="e"></param>
    115         private void pdControl_EndPrint(object sender, PrintEventArgs e)
    116         {
    117 
    118         }
    119 
    120 
    121         /// <summary>
    122         /// 打印
    123         /// </summary>
    124         /// <param name="sender"></param>
    125         /// <param name="e"></param>
    126         private void btnPrint_Click(object sender, EventArgs e)
    127         {
    128             //打印对话框
    129             if (this.ptDControl.ShowDialog() == DialogResult.OK)
    130             {
    131                 this.pdControl.Print();
    132             }
    133 
    134         }
    135 
    136         private void lblColor_Click(object sender, EventArgs e)
    137         {
    138             ColorDialog f = new ColorDialog();
    139             if (f.ShowDialog() == DialogResult.OK)
    140             {
    141 
    142                 this.lblColor.BackColor = f.Color;
    143             }
    144         }
    145 
    146         /// <summary>
    147         /// 刷新
    148         /// </summary>
    149         /// <param name="sender"></param>
    150         /// <param name="e"></param>
    151         private void btnRefresh_Click(object sender, EventArgs e)
    152         {
    153             List<PrintInfo> lstPrintInfos = new List<PrintInfo>();
    154             //表格配置
    155             PrintInfo p0 = new PrintInfo()
    156             {
    157                 PrtType = PrintType.Table,
    158                 PrtColor = Color.Brown,
    159                 Row = int.Parse(this.txtRow.Text.Trim()),
    160                 Column = int.Parse(this.txtColumn.Text.Trim()),
    161                 Start = new Point(int.Parse(this.txtStart.Text.Trim(new char[] { '(', ')' }).Split(',')[0]), int.Parse(this.txtStart.Text.Trim(new char[] { '(', ')' }).Split(',')[1])),
    162                 End = new Point(int.Parse(this.txtEnd.Text.Trim(new char[] { '(', ')' }).Split(',')[0]), int.Parse(this.txtEnd.Text.Trim(new char[] { '(', ')' }).Split(',')[1]))
    163 
    164             };
    165             lstPrintInfos.Add(p0);
    166             //标题配置
    167             PrintInfo p1 = new PrintInfo()
    168             {
    169                 PrtType = PrintType.Text,
    170                 PrtColor = this.lblColor.BackColor,
    171                 Content = this.txtTitle.Text.Trim(),
    172                 Size = int.Parse(this.txtSize.Text.Trim()),
    173                 FontStyle = chkBold.Checked ? FontStyle.Bold : FontStyle.Regular,
    174                 Start = new Point(int.Parse(this.txtLocation.Text.Trim(new char[] { '(', ')' }).Split(',')[0]), int.Parse(this.txtLocation.Text.Trim(new char[] { '(', ')' }).Split(',')[1]))
    175             };
    176             lstPrintInfos.Add(p1);
    177             //内容
    178             TextBox[] T = new TextBox[12] { T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12 };
    179             TextBox[] L = new TextBox[12] { L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12 };
    180             for (int i = 0; i < 12; i++)
    181             {
    182                 PrintInfo p = new PrintInfo()
    183                 {
    184                     PrtType = PrintType.Text,
    185                     PrtColor = Color.Black,
    186                     Content = T[i].Text.Trim(),
    187                     Size = 12,
    188                     FontStyle = FontStyle.Regular,
    189                     Start = new Point(int.Parse(L[i].Text.Trim(new char[] { '(', ')' }).Split(',')[0]), int.Parse(L[i].Text.Trim(new char[] { '(', ')' }).Split(',')[1]))
    190                 };
    191                 lstPrintInfos.Add(p);
    192             }
    193             //打印时间
    194             PrintInfo p2 = new PrintInfo()
    195             {
    196                 PrtType = PrintType.Text,
    197                 PrtColor = this.lblColor.BackColor,
    198                 Content = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
    199                 Size =11,
    200                 FontStyle =FontStyle.Regular,
    201                 Start = new Point(145,63)
    202             };
    203             lstPrintInfos.Add(p2);
    204 
    205             printHelper.PrintInfos = lstPrintInfos;
    206             this.ppVControl.InvalidatePreview();//刷新文档的预览,重新调用PrintDocument的Print方法
    207         }
    208     }
    209 }
    View Code


    源码链接

  • 相关阅读:
    基于SpringBoot打造在线教育系统(6)-- 二级分类模块UI篇
    基于SpringBoot打造在线教育系统(5)-- 课程分类模块
    基于SpringBoot打造在线教育系统(4)-- SpringBoot集成ElementUI
    基于SpringBoot打造在线教育系统(3)-- 登录与授权管理
    基于SpringBoot打造在线教育系统(2)-- 深入学习JPA与Junit测试
    我只会HelloWorld,但是我却完成了一个SpringBoot项目!(1)
    Constrast Learnning
    BlazePose: On-device Real-time Body Pose tracking
    pytest---fixture作用范围
    pytest---fixture中conftest.py文件
  • 原文地址:https://www.cnblogs.com/hsiang/p/6921817.html
Copyright © 2020-2023  润新知