本文是利用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

源码链接

转载于:https://www.cnblogs.com/hsiang/p/6921817.html

C# 利用PrintDocument定制打印单据相关推荐

  1. php批量打印快递单,excel怎么利用vba实现批量套打快递单批量打印单据?

    excel vba 批量套打快递单,批量打印单据,可以自定义修改设置新的格式. 快递套打模板2015:点击下载 1.设置快递单的自定义纸张.选择对应打印机-点击打印服务器属性-勾选创建新表单-输入表单 ...

  2. System verilog利用class类打印信息

    1.1 System verilog利用class类打印信息 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)System verilog利用class类打印信息: 5) ...

  3. 利用PL/SQL打印ASCII表?

    利用PL/SQL打印ASCII表? 系统环境: 1.操作系统:Windows 2000 2.数据库: Oracle 8i R2 (8.1.6) for NT 企业版 3.安装路径:C:\ORACLE ...

  4. 天联高级版客户端_天联客户端登录的KIS旗舰版打印单据问题

    如何解决天联客户端登录的KIS旗舰版打印单据问题 用户通过天联高级客户端访问服务器端的KIS旗舰版,但是反应两边单据打印出来的结果不一致,现在以KIS旗舰版打印外购入库单为例具体介绍一下如何操作 1. ...

  5. python画图代码星星-Python利用for循环打印星号三角形的案例

    简单的for循环打印三角形 1,for循环方法实现星星三角 代码: for i in range(0,5): for j in range(i+1): if i == 4: print("* ...

  6. java使用三种循环打印99表_编程题:利用for循环打印 9*9 表

    # 利用for循环打印 9*9 表? 1*1=1 1*2=2 2*2=4 1*3=3 2*3=6 3*3=9 1*4=4 2*4=8 3*4=12 4*4=16 1*5=5 2*5=10 3*5=15 ...

  7. K3打印单据,提示:等待C盘释放空间,内存不足

    K3打印单据,提示:等待C盘释放空间,内存不足 今天采购部同事碰到一个问题, 在打结算单时,提示要等待C盘释放空间. 像这种错误, 大家都觉得自己C盘还有好大的空间,怎么会有如此错误. 其实电脑在交互 ...

  8. 利用for循环打印图形

    利用for循环打印图形 利用for循环打印图形时,我们需要记住外层循环列,内层循环行,然后们需要做的不外乎是找到它们循环的规律罢了. 打印矩形图形 打印: ***** ***** ***** **** ...

  9. 6.2_[Java 数组]-利用二重循环打印各种图形

    ################################################## 目录 玩坏二重循环 一句话概括二重循环 打印一个矩形 打印正直角三角形左下角顶点 打印倒直角三角形 ...

最新文章

  1. 怎么编写段错误(Segmentation fault)的程序
  2. JSBinding+SharpKit / 菜单介绍
  3. 如何将Pytorch生成的模型进行CPU部署
  4. [今日干货]短视频获得种子用户的途径
  5. JFreeChart(五)之XY图
  6. [转载] Python3 数组
  7. ajax编写前台的时候,列表显示部分,表格显示不出来,但是可以获取到数据
  8. jquery获取div/div之间的内容.text() 和 .html()区别
  9. TCP协议疑难杂症全景解析
  10. python记录(4)- lxml模块创建xml文件
  11. [Linux 性能检测工具]IOSTAT
  12. 多家大厂的存储设备受第三方加密软件缺陷影响
  13. Oracle-数据库
  14. 十八、vim进入编辑模式、vim命令模式、vim实践
  15. RCC_APB2Periph_AFIO的理解。。。重映射的一点心得
  16. node - 收藏集 - 掘金
  17. 【探索HTML5第二弹03】走近地图应用的世界,看我们google地图可以看些什么!
  18. 高新计算机考试试题ps,最新版计算机高新考试ps第1单元1-8.pdf
  19. java socket 打印机_socket.BeginReceive()使打印机无响应
  20. 电脑配置低用不了PS怎么办?你需要网页版ps!

热门文章

  1. 代码重构的力量:如何衡量重构成功
  2. 关于端口被占用的解决办法
  3. Unreal Blueprint API Reference[Add Documentation Node...]
  4. web前端面试--浏览器兼容性问题
  5. 关于程序化交易系统的详细定义
  6. 记录Multidex介绍和使用
  7. git合并丢失代码问题分析与解决
  8. 数据库及相关知识详解大全
  9. ESP8266-Arduino编程实例-ILI9341-TFT LCD驱动(基于TFT_eSPI库)
  10. 计算机网络第二章 物理层练习题(中文带答案解析)