C# 利用PrintDocument定制打印单据

本文是利用PrintDocument定制打印单据的小例子。

涉及知识点:

  • PrintDocument :从 Windows 窗体应用程序打印时,定义一种可重用的可发送到打印机上的对象。
  • PrintPreviewControl :表示 Windows 窗体应用程序打印预览的原始预览部分,没有任何对话框或按钮。
  • Graphics :GDI+绘图对象
  • 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 }

源码链接

时间: 2024-10-14 20:48:52

C# 利用PrintDocument定制打印单据的相关文章

javaWeb项目springMVC框架下利用ITextpdf 工具打印PDF文件的方法(打印表单、插入图片)

方法一:打印PDF表单以及在PDF中加入图片 需要的资料: jar包:iTextAsian.jar ,itext-2.1.7.jar: 源码: 1 public static void main(String args[]) throws IOException, DocumentException { 2 String fileName = "D:/testPDF.pdf"; // pdf模板 3 InputStream input = new FileInputStream(new

jquery 利用CSS 控制打印样式

一.添加打印样式 1. 为屏幕显示和打印分别准备一个css文件,如下所示:  用于屏幕显示的css: <link rel="stylesheet" href="css/mainstylesheet.css" media="screen" />  用于打印的css:<link rel="stylesheet" href="css/printstylesheet.css" media=&quo

利用StackTraceElement设计打印Android日志

java.lang.StackTraceElement实现了接口Serializable,是堆栈跟踪中的元素,它由 Throwable.getStackTrace() 返回.每个元素表示单独的一个堆栈帧.所有的堆栈帧(堆栈顶部的那个堆栈帧除外)都表示一个方法调用.堆栈顶部的帧表示生成堆栈跟踪的执行点.通常,这是创建对应于堆栈跟踪的 throwable 的点.构造方法信息: public StackTraceElement(String declaringClass, String methodN

Python学习20:利用函数来打印文件内容

# -- coding: utf-8 -- # 从sys模块导入argv函数 from sys import argv # 利用argv函数,把 argv 中的东西解包,将所有的参数依次赋予左边的变量名 script, input_file = argv # 自定义一个函数,读取f的内容 def print_all(f): print f.read() # 自定义函数,使用file中的seek方法来移动文件游标,用于依次读取文件行的功能 def rewind(f): f.seek(0) # 该脚

linux利用grep查看打印匹配的下几行或前后几行的命令

linux系统中,利用grep打印匹配的上下几行 如果在只是想匹配模式的上下几行,grep可以实现. $grep -5 'parttern' inputfile //打印匹配行的前后5行 $grep -C 5 'parttern' inputfile //打印匹配行的前后5行 $grep -A 5 'parttern' inputfile //打印匹配行的后5行 $grep -B 5 'parttern' inputfile //打印匹配行的前5行 查看mysql慢日志中ip地址为192.168

web app中常用插件(zepto--用法类似于jquery、利用nodejs定制zepto)

1.移动端开发不用jquery的原因 jquery使用的优点中很大一个原因是解决了js的兼容性,但是在移动端开发中移动端的浏览器都很新进的浏览器,他的兼容性问题不需要jquery,所以不用考虑兼容性, 移动端的动画时支持css3的,所以直接使用css3来实现动画可以减少我们对jquery中动画函数的依赖 在移动端jquery对我们而言算是体积大,同时效率也不高 2.在移动端使用的插件---很多api都类似于jquery zepto是一个分模块的js库,他把不同的功能封装在不同模块(默认下载的ze

利用for循环打印实心棱形和空心棱形

一.要求: 提示用户输入棱形的行数,比如输入5时,打印如下实心棱形和空心棱形(由于排版问题,可能显示会有变形): * *** ***** *** * * * * *   * * * * 二.分析: A.图形是上下对称的 B.每行先打印空格,再打印星号,后面的空格不用打印 C.中间行不打印空格,其余行根据与中间的行距,依次增加打印空格的数量 D.每行打印的星号数量为最大列宽减去此行打印空格数量的两倍 三.实现: import java.util.Scanner; public class loop

使用C语言,利用for循环打印菱形(每个相邻菱形都要带空格)

之前看到网上的一些文章介绍如何打印菱形,但是和我当时题目要求的却不一样,网上的代码输出出来时每个相邻菱形并没有带空格. 我现在所介绍的是每个相邻菱形间都带有空格的代码. 习题及代码如下: 用*输出边长为n的实心菱形. * * * * * * * * * printf("请输入一个整数:"); int n = 0; scanf("%d",&n); //打印行数,注意必须是奇数行所以是2n-1 for (int i = 1; i <= 2*n - 1; i

PHP利用strtotime函数打印指定日期

打印某一日期的前一天 echo date("Y-m-d",(strtotime("2009-01-01") - 3600*24)); (1)打印明天此时的时间戳strtotime(”+1 day”) 当前时间:echo date(”Y-m-d H:i:s”,time()) //结果:2009-01-22 09:40:25 指定时间:echo date(”Y-m-d H:i:s”,strtotime(”+1 day”)) //结果:2009-01-23 09:40:2