C# 利用PrintDocument定制打印单据

news/2024/11/29 22:50:41/

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

涉及知识点:

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

 效果图如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Printing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace DemoPrint
{public partial class MainForm : Form{private int width_p = 200;//单位是mmprivate int height_p = 70;//单位是mmprivate int margin_lr = 2;//左右边距private int margin_tb = 2;//上下边距/// <summary>/// 需要打印的内容/// </summary>public List<PrintInfo> PrintInfos { get; set; }private PrintHelper printHelper = new PrintHelper();public MainForm(){InitializeComponent();}private void MainForm_Load(object sender, EventArgs e){InitInfo();InitDocument();}private void InitInfo() {PrinterSettings printSetting = new PrinterSettings();printSetting.PrintRange = PrintRange.AllPages;int width_in = MM2Inch(width_p);int height_in = MM2Inch(height_p);PageSettings pageSetting = new PageSettings(printSetting);pageSetting.PaperSize = new PaperSize("customer",width_in, height_in);int margin_lr_in = MM2Inch(margin_lr);int margin_tb_in = MM2Inch(margin_tb);pageSetting.Margins = new Margins(margin_lr_in, margin_lr_in, margin_tb_in, margin_tb_in);this.pdControl.DefaultPageSettings = pageSetting;}private void InitDocument() {List<PrintInfo> lstPrintInfos = new List<PrintInfo>();PrintInfo p0 = new PrintInfo(){PrtType = PrintType.Table,PrtColor = Color.Brown,Row = int.Parse(this.txtRow.Text.Trim()),Column = int.Parse(this.txtColumn.Text.Trim()),Start = new Point(int.Parse(this.txtStart.Text.Trim(new char[] { '(', ')' }).Split(',')[0]), int.Parse(this.txtStart.Text.Trim(new char[] { '(', ')' }).Split(',')[1])),End = new Point(int.Parse(this.txtEnd.Text.Trim(new char[] { '(', ')' }).Split(',')[0]), int.Parse(this.txtEnd.Text.Trim(new char[] { '(', ')' }).Split(',')[1]))};lstPrintInfos.Add(p0);printHelper.PrintInfos = lstPrintInfos;}/// <summary>/// 转换毫米到百分之一英寸/// </summary>/// <param name="mm"></param>/// <returns></returns>private int MM2Inch(int mm) {return (int)(mm * 100.0f / 25.4f);}/// <summary>/// 打印开始事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void pdControl_BeginPrint(object sender, PrintEventArgs e){}/// <summary>/// 打印事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void pdControl_PrintPage(object sender, PrintPageEventArgs e){Font font = new Font("Arial", 14f, FontStyle.Regular);Graphics g = e.Graphics;g.PageScale = 1;g.PageUnit = GraphicsUnit.Millimeter;//先画一个矩形Pen lineColor = new Pen(Color.Black, 0.2f);g.FillRectangle(Brushes.Linen,0,0,width_p,height_p);printHelper.Print(g);}/// <summary>/// 打印结束事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void pdControl_EndPrint(object sender, PrintEventArgs e){}/// <summary>/// 打印/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnPrint_Click(object sender, EventArgs e){//打印对话框if (this.ptDControl.ShowDialog() == DialogResult.OK){this.pdControl.Print();}}private void lblColor_Click(object sender, EventArgs e){ColorDialog f = new ColorDialog();if (f.ShowDialog() == DialogResult.OK){this.lblColor.BackColor = f.Color;}}/// <summary>/// 刷新/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnRefresh_Click(object sender, EventArgs e){List<PrintInfo> lstPrintInfos = new List<PrintInfo>();//表格配置PrintInfo p0 = new PrintInfo(){PrtType = PrintType.Table,PrtColor = Color.Brown,Row = int.Parse(this.txtRow.Text.Trim()),Column = int.Parse(this.txtColumn.Text.Trim()),Start = new Point(int.Parse(this.txtStart.Text.Trim(new char[] { '(', ')' }).Split(',')[0]), int.Parse(this.txtStart.Text.Trim(new char[] { '(', ')' }).Split(',')[1])),End = new Point(int.Parse(this.txtEnd.Text.Trim(new char[] { '(', ')' }).Split(',')[0]), int.Parse(this.txtEnd.Text.Trim(new char[] { '(', ')' }).Split(',')[1]))};lstPrintInfos.Add(p0);//标题配置PrintInfo p1 = new PrintInfo(){PrtType = PrintType.Text,PrtColor = this.lblColor.BackColor,Content = this.txtTitle.Text.Trim(),Size = int.Parse(this.txtSize.Text.Trim()),FontStyle = chkBold.Checked ? FontStyle.Bold : FontStyle.Regular,Start = new Point(int.Parse(this.txtLocation.Text.Trim(new char[] { '(', ')' }).Split(',')[0]), int.Parse(this.txtLocation.Text.Trim(new char[] { '(', ')' }).Split(',')[1]))};lstPrintInfos.Add(p1);//内容TextBox[] T = new TextBox[12] { T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12 };TextBox[] L = new TextBox[12] { L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12 };for (int i = 0; i < 12; i++){PrintInfo p = new PrintInfo(){PrtType = PrintType.Text,PrtColor = Color.Black,Content = T[i].Text.Trim(),Size = 12,FontStyle = FontStyle.Regular,Start = new Point(int.Parse(L[i].Text.Trim(new char[] { '(', ')' }).Split(',')[0]), int.Parse(L[i].Text.Trim(new char[] { '(', ')' }).Split(',')[1]))};lstPrintInfos.Add(p);}//打印时间PrintInfo p2 = new PrintInfo(){PrtType = PrintType.Text,PrtColor = this.lblColor.BackColor,Content = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),Size =11,FontStyle =FontStyle.Regular,Start = new Point(145,63)};lstPrintInfos.Add(p2);printHelper.PrintInfos = lstPrintInfos;this.ppVControl.InvalidatePreview();//刷新文档的预览,重新调用PrintDocument的Print方法}}
}

源码链接


http://www.ppmy.cn/news/554846.html

相关文章

金蝶精斗云PDA移动扫码入库出库,搭配蓝牙打印机打印单据小票

金蝶精斗云PDA移动扫码入库出库&#xff0c;搭配蓝牙打印机打印单据小票&#xff0c;单据小票打印&#xff0c;金蝶安卓盘点机PDA金蝶精斗云PDA轻松扫描商品条码盘点 第一步&#xff0c;装上单据小票纸。 打开蓝牙便携打印机的纸仓&#xff0c;调整里面的挡板到合适位置&#…

【C#】最全单据打印(打印模板、条形码二维码、字体样式、项目源码)

系列文章 【C#】编号生成器&#xff08;定义单号规则、固定字符、流水号、业务单号&#xff09; 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/129129787 【C#】日期范围生成器&#xff08;开始日期、结束日期&#xff09; 本文链接&#xff1a;h…

定时器的实现原理

文章目录 1.定时器的作用?2.数据结构要求3.时间轮4.分级时间轮5.业界实现方案参考文献 1.定时器的作用? 定时器的主要用途是执行定时任务。 定时任务在很多场景都需要用到&#xff0c;比如游戏的 Buff 实现&#xff0c;Redis 中的过期任务&#xff0c;Linux 中的定时任务&a…

团体程序设计天梯赛-练习集L2篇③

&#x1f680;欢迎来到本文&#x1f680; &#x1f349;个人简介&#xff1a;Hello大家好呀&#xff0c;我是陈童学&#xff0c;一个与你一样正在慢慢前行的普通人。 &#x1f3c0;个人主页&#xff1a;陈童学哦CSDN &#x1f4a1;所属专栏&#xff1a;PTA &#x1f381;希望各…

C语言的字符数组和字符串

文章目录 1 字符数组与字符串区别2 字符数组和字符串定义3 字符串长度 1 字符数组与字符串区别 1、C语言中没有字符串这种数据类型&#xff0c;可以通过char的数组来替代&#xff1b; 2、字符串一定是一个char的数组&#xff0c;但char的数组未必是字符串&#xff1b; 3、数字…

【Java 基础篇】Java StringBuffer:线程安全的可变字符串操作

文章目录 导言一、StringBuffer的创建和初始化二、StringBuffer的基本操作三、StringBuffer与String的转换四、StringBuffer的线程安全性总结 导言 在Java中&#xff0c;字符串是不可变的&#xff0c;这意味着每次对字符串进行操作时都会创建一个新的字符串对象。然而&#xf…

EC11编码器调光C语言程序代码 基于STC单片机 还可用于电机调速

EC11编码器调光C语言程序代码 基于STC单片机 还可用于电机调速 编号:565653220266749好运佳星(_)

2021年博客之星

我正在参加年度博客之星评选&#xff0c;请大家帮我投票打分&#xff0c;您的每一分都是对我的支持与鼓励。 https://bbs.csdn.net/topics/603960721