C#利用PrintDocument定制打印單據(jù)的小例子
前言
本文是利用PrintDocument定制打印單據(jù)的小例子,僅供學(xué)習(xí)分享使用,如果不足之處,還請指正。
涉及知識點(diǎn):
- PrintDocument :從 Windows 窗體應(yīng)用程序打印時,定義一種可重用的可發(fā)送到打印機(jī)上的對象。
- PrintPreviewControl :表示 Windows 窗體應(yīng)用程序打印預(yù)覽的原始預(yù)覽部分,沒有任何對話框或按鈕。
- Graphics :GDI+繪圖對象
- PrinterSettings:設(shè)置打印機(jī)屬性,如:設(shè)置屬性Copies,可以設(shè)置打印份數(shù),默認(rèn)為1,
- PageSettings:指定應(yīng)用于單頁打印的設(shè)置
- DefaultPageSettings:PrintDocument的屬性
- PrintPage事件:PrintDocument的事件,通過此事件來繪制需要打印的內(nèi)容
- PaperSize:指定紙張大小
- 毫米和英寸的換算:打印機(jī)是以英寸為單位的,單據(jù)設(shè)置是以毫米為單位的,所以需要轉(zhuǎn)換
效果圖如下:

核心代碼
關(guān)鍵代碼如下:
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;//單位是mm
private int height_p = 70;//單位是mm
private int margin_lr = 2;//左右邊距
private int margin_tb = 2;//上下邊距
/// <summary>
/// 需要打印的內(nèi)容
/// </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>
/// 轉(zhuǎn)換毫米到百分之一英寸
/// </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>
/// 打印結(jié)束事件
/// </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);
//標(biāo)題配置
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);
//內(nèi)容
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();//刷新文檔的預(yù)覽,重新調(diào)用PrintDocument的Print方法
}
}
}
源碼鏈接
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。
- c# 實(shí)現(xiàn)打印機(jī)狀態(tài)查詢與阻塞打印
- c#使用Aspose打印文件的示例
- C# 調(diào)用exe傳參,并獲取打印值的實(shí)例
- 如何利用C#打印九九乘法表
- c# winform 解決PictureBox 無法打印全部圖片的問題
- C#操作Word打印的示例
- C#操作excel打印的示例
- C# 打印網(wǎng)頁不顯示頁眉頁腳的實(shí)現(xiàn)方法
- C#實(shí)現(xiàn)掃描槍掃描二維碼并打印(實(shí)例代碼)
- C#打印PDF文檔的10種方法(小結(jié))
- C# TSC打印二維碼和條形碼的實(shí)現(xiàn)方法
- C# winform打印excel的方法
- c# 如何實(shí)現(xiàn)web打印插件
相關(guān)文章
C# HttpClient 如何使用 Consul 發(fā)現(xiàn)服務(wù)
這篇文章主要介紹了C# HttpClient 如何使用 Consul 發(fā)現(xiàn)服務(wù),幫助大家更好的理解和使用c#,感興趣的朋友可以了解下2021-02-02
c#實(shí)現(xiàn)網(wǎng)站監(jiān)控查看是否正常示例
這篇文章主要介紹了使用c#監(jiān)控網(wǎng)站是否正常的功能示例,大家參考使用吧2014-01-01
Unity shader實(shí)現(xiàn)百葉窗特效
這篇文章主要為大家詳細(xì)介紹了Unity shader實(shí)現(xiàn)百葉窗特效,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-11-11
C# System.TypeInitializationException 異常處理方案
這篇文章主要介紹了C# System.TypeInitializationException 異常處理方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-02-02
C#實(shí)現(xiàn)創(chuàng)建標(biāo)簽PDF文件的示例代碼
標(biāo)簽PDF文件包含描述文檔結(jié)構(gòu)和各種文檔元素順序的元數(shù)據(jù),是一種包含后端提供的可訪問標(biāo)記,管理閱讀順序和文檔內(nèi)容表示的邏輯結(jié)構(gòu)的PDF文件。本文將用C#實(shí)現(xiàn)創(chuàng)建標(biāo)簽PDF文件,需要的可以參考一下2022-08-08
C#判斷一個字符串是否是數(shù)字或者含有某個數(shù)字的方法
這篇文章主要介紹了C#判斷一個字符串是否是數(shù)字或者含有某個數(shù)字的方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2018-06-06

