C# 利用PrintDocument定制打印单据
本文是利用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定制打印单据的更多相关文章
- 使用PrintDocument定制打印格式
虽然说使在IE上直接调用打印插件打印已经不常用,但是有时候还是会用到,这里就记录一下. 首先我们列出来我们的打印类 public class PrintService { //打印机名称 privat ...
- 利用dockerfile定制镜像
利用dockerfile定制镜像 镜像的定制就是定制每一层所添加的配置.文件.如果可以吧每一层修改.安装.构建.操作的命令都写入到一个脚本,用脚本来构建.定制镜像,这个脚本就是dockerfile. ...
- 使用PrintDocument进行打印
背景: 1.在winform中,需要直接调用打印机,进行打印处理 2.找了很多实现方法是web的处理,然后查了下度娘,发现可以使用自带类PrintDocument进行处理,所以就有了这篇文章 说明: ...
- 编程题:利用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 ...
- JASPER打印单据,标签开发培训, 界面开发培训
JASPER打印单据,标签开发培训软件:TIBC JASPER Studio.Jaspersoft Studio是一个专为JasperReports报表引擎而开发的报表设计器,是 iReport设计器 ...
- 打印单据,A4纸,每个单据占一个A4纸,两个单据之间不挨着
打印单据,A4纸,每个单据占一个A4纸,两个单据之间不挨着 <style type="text/css" media="print">.Noprin ...
- C语言利用for循环打印菱形
C语言利用for循环打印菱形(高度为奇数) 这次用的方法是上下部分分开打印,先打印上部分,再打印下部分. 先举个简单的例子打印,再改进代码,登堂入室从而理解. 例:打印一个高度(高度必须为奇数)为 5 ...
- 利用AOP切面打印项目中每个接口的运行情况
1.前言 AOP切面技术,大家应该都听知道,Spring框架的主要功能之一. AOP切面的用途很广,其中一个常见的用途就是打印接口方法的运行日志和运行时间. 日志对于一个项目很是重要,不仅有助于调错, ...
- linux利用grep查看打印匹配的下几行或前后几行的命令
转自:http://www.itokit.com/2013/0308/74883.html linux系统中,利用grep打印匹配的上下几行 如果在只是想匹配模式的上下几行,grep可以实现. ...
随机推荐
- Java多线程可以分组,还能这样玩!
前面的文章,栈长和大家分享过多线程创建的3种方式<实现 Java 多线程的 3 种方式>. 但如果线程很多的情况下,你知道如何对它们进行分组吗? 和 Dubbo 的服务分组一样,Java ...
- Java 虚拟机对锁优化所做的努力
作为一款公用平台,JDK 本身也为并发程序的性能绞尽脑汁,在 JDK 内部也想尽一切办法提供并发时的系统吞吐量.这里,我将向大家简单介绍几种 JDK 内部的 "锁" 优化策略. 1 ...
- vue 国际化i18n 多语言切换
安装 npm install vue-i18n 新建一个文件夹 i18n ,内新建 en.js zh.js index.js 三个文件 准备翻译信息 en.js export default { ho ...
- Kubernetes 持续集成 SpringCloud
写在开始之前,在开始之前我们需要了解几个概念: 1.什么是持续集成? 持续集成是一种软件开发实践,即团队开发成员经常集成他们的工作,通常每个成员每天至少集成一次,也就意味着每天可能会发生多次集成.每次 ...
- [Jenkins]IOS构建机配置记录
------------------- 如需转载,请注明出处 ------------------- 随着业务量和开发人员的递增,IOS构建每天都会排队,影响研发效率.随购买了新的垃圾桶,进行配置. ...
- 关于富文本编辑器ueditor(jsp版)上传文件到阿里云OSS的简单实例,适合新手
关于富文本编辑器ueditor(jsp版)上传文件到阿里云OSS的简单实例,适合新手 本人菜鸟一枚,最近公司有需求要用到富文本编辑器,我选择的是百度的ueditor富文本编辑器,闲话不多说,进入正 ...
- ⑧javaWeb之在例子中学习(过滤器Filter)
前言 本系列 Servlet & JSP 学习系列[传送门]逐渐到了中期了,希望大家喜欢我写的,总结的点点滴滴- 今天我们来讲讲过滤器 你们的支持是我写博客的动力哦. 最近买了两本书,觉得大二 ...
- 阿里云CentOS安装配置Python3.7及pip3
一.安装Python3.7 安装依赖包 yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqli ...
- AspectJ在Spring中的使用
在上一篇AspectJ的入门中,简单的介绍了下AspectJ的使用,主要是以AspectJ的example作为例子.介绍完后也留下了几个问题:1)我们在spring中并没有看到需要aspectj之类的 ...
- 为什么使用SLF4J比使用log4j或者java.util.logging更好
1.SLF4j是什么? SLF4J 并没有真正地实现日志记录,它只是一个允许你使用任何java日志记录库的抽象适配层. 如果你正在编写内部或者外部使用的API或者应用库的话,如果使用了slf4j,那么 ...