本文是利用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 = ;//单位是mm private int height_p = ;//单位是mm private int margin_lr = ;//左右边距 private int margin_tb = ;//上下边距 /// <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(',')[]), int.Parse(this.txtStart.Text.Trim(new char[] { '(', ')' }).Split(',')[])),
End = new Point(int.Parse(this.txtEnd.Text.Trim(new char[] { '(', ')' }).Split(',')[]), int.Parse(this.txtEnd.Text.Trim(new char[] { '(', ')' }).Split(',')[])) };
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 = ;
g.PageUnit = GraphicsUnit.Millimeter;
//先画一个矩形
Pen lineColor = new Pen(Color.Black, 0.2f);
g.FillRectangle(Brushes.Linen,,,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(',')[]), int.Parse(this.txtStart.Text.Trim(new char[] { '(', ')' }).Split(',')[])),
End = new Point(int.Parse(this.txtEnd.Text.Trim(new char[] { '(', ')' }).Split(',')[]), int.Parse(this.txtEnd.Text.Trim(new char[] { '(', ')' }).Split(',')[])) };
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(',')[]), int.Parse(this.txtLocation.Text.Trim(new char[] { '(', ')' }).Split(',')[]))
};
lstPrintInfos.Add(p1);
//内容
TextBox[] T = new TextBox[] { T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12 };
TextBox[] L = new TextBox[] { L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12 };
for (int i = ; i < ; i++)
{
PrintInfo p = new PrintInfo()
{
PrtType = PrintType.Text,
PrtColor = Color.Black,
Content = T[i].Text.Trim(),
Size = ,
FontStyle = FontStyle.Regular,
Start = new Point(int.Parse(L[i].Text.Trim(new char[] { '(', ')' }).Split(',')[]), int.Parse(L[i].Text.Trim(new char[] { '(', ')' }).Split(',')[]))
};
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 =,
FontStyle =FontStyle.Regular,
Start = new Point(,)
};
lstPrintInfos.Add(p2); printHelper.PrintInfos = lstPrintInfos;
this.ppVControl.InvalidatePreview();//刷新文档的预览,重新调用PrintDocument的Print方法
}
}
}

源码链接

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

  1. 使用PrintDocument定制打印格式

    虽然说使在IE上直接调用打印插件打印已经不常用,但是有时候还是会用到,这里就记录一下. 首先我们列出来我们的打印类 public class PrintService { //打印机名称 privat ...

  2. 利用dockerfile定制镜像

    利用dockerfile定制镜像 镜像的定制就是定制每一层所添加的配置.文件.如果可以吧每一层修改.安装.构建.操作的命令都写入到一个脚本,用脚本来构建.定制镜像,这个脚本就是dockerfile. ...

  3. 使用PrintDocument进行打印

    背景: 1.在winform中,需要直接调用打印机,进行打印处理 2.找了很多实现方法是web的处理,然后查了下度娘,发现可以使用自带类PrintDocument进行处理,所以就有了这篇文章 说明: ...

  4. 编程题:利用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  ...

  5. JASPER打印单据,标签开发培训, 界面开发培训

    JASPER打印单据,标签开发培训软件:TIBC JASPER Studio.Jaspersoft Studio是一个专为JasperReports报表引擎而开发的报表设计器,是 iReport设计器 ...

  6. 打印单据,A4纸,每个单据占一个A4纸,两个单据之间不挨着

    打印单据,A4纸,每个单据占一个A4纸,两个单据之间不挨着 <style type="text/css" media="print">.Noprin ...

  7. C语言利用for循环打印菱形

    C语言利用for循环打印菱形(高度为奇数) 这次用的方法是上下部分分开打印,先打印上部分,再打印下部分. 先举个简单的例子打印,再改进代码,登堂入室从而理解. 例:打印一个高度(高度必须为奇数)为 5 ...

  8. 利用AOP切面打印项目中每个接口的运行情况

    1.前言 AOP切面技术,大家应该都听知道,Spring框架的主要功能之一. AOP切面的用途很广,其中一个常见的用途就是打印接口方法的运行日志和运行时间. 日志对于一个项目很是重要,不仅有助于调错, ...

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

    转自:http://www.itokit.com/2013/0308/74883.html linux系统中,利用grep打印匹配的上下几行   如果在只是想匹配模式的上下几行,grep可以实现.   ...

随机推荐

  1. mac中:不能完成此操作,因为找不到一个或多个需要的项目。(错误代码 -43)

    今天使用mac删除某文件时,遇到此错误: 不能完成此操作,因为找不到一个或多个需要的项目.(错误代码 -43) 于是采用命令行删除可以正确删除:在要删除的文件夹坐在目录下执行   rm -rf tes ...

  2. Event Loop浅谈

    event loop 即事件循环.最初了解到js的event loop机制是通过自己对js中异步.同步的疑惑.今天聊一聊自己的理解,希望和大家一起学习. 首先,让我们看一个经典的setTimeOut的 ...

  3. NIO/BIO

    NIO/BIO    BIO网络通信        概述            网络编程的基本模型是Client/Server模型,也就是两个进程之间进行相互通信,其中服务端提供位置信息(绑定的IP地 ...

  4. VueJs(6)---V-on指令

    V-on指令 一.概述 v-on是用来绑定事件监听器,用在普通元素上时,只能监听原生 DOM 事件.用在自定义元素组件上时,也可以监听子组件触发的自定义事件. 在监听原生 DOM 事件时,方法以事件为 ...

  5. springMVC(2)---获取前段数据

    springMVC(1)---获取前段数据 首先说明,如果你学过Struts2,那么在学springMVC就会简单很多,我也不最基础的开始写了,我前篇文章搭建了个ssm框架,算是springmvc入门 ...

  6. mysql 开发进阶篇系列 44 物理备份与恢复( 热备份xtrabackup 工具介绍)

    一.概述 物理备份和恢复又分为冷备份和热备份.与逻辑备份相比,它最大优点是备份和恢复的速度更快.因为物理备份的原理都是基于文件的cp. 1.1 冷备份 冷备份就是停掉数据库服务.这种物理备份一般很少使 ...

  7. Linux编程 11(shell全局环境变量与局变环境变量)

    一.概述 在linux中,很多程序和脚本都通过环境变量来获取系统信息,存储临时数据,配置信息.环境变量是指用来存储有关shell会话和工作环境信息,允许你在内存中存储数据,以便程序或shell中运行的 ...

  8. JavaEE 要懂的小事:三、图解Session(会话)

    Writer      :BYSocket(泥沙砖瓦浆木匠) 微         博:BYSocket 豆         瓣:BYSocket FaceBook:BYSocket Twitter   ...

  9. leetcode — valid-number

    /** * * Source : https://oj.leetcode.com/problems/valid-number/ * * * Validate if a given string is ...

  10. leetcode — rotate-list

    /** * Source : https://oj.leetcode.com/problems/rotate-list/ * * * Given a list, rotate the list to ...