C# 利用PrintDocument定製列印單據

来源:http://www.cnblogs.com/hsiang/archive/2017/05/30/6921817.html
-Advertisement-
Play Games

本文是利用PrintDocument定製列印單據的小例子。 涉及知識點: PrintDocument :從 Windows 窗體應用程式列印時,定義一種可重用的可發送到印表機上的對象。 PrintPreviewControl :表示 Windows 窗體應用程式列印預覽的原始預覽部分,沒有任何對話框 ...


本文是利用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 }
View Code


源碼鏈接


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 最近項目上要用到跑馬燈的效果,和網上不太相同的是,網上大部分都是連續的,而我們要求的是不連續的。 也就是是,界面上就展示4項(展示項數可變),如果有7項要展示的話,則不斷的在4個空格裡左跳,當然,銜接上效果不是很好看。 然後,需要支持點擊以後進行移除掉不再顯示的內容。 效果如下: 思路大致如下: 1 ...
  • jlink 如何 離開 keil、IAR 監控變數呢? 目前 jlink的 api 可以做到,自己可以用C# 做一個 上位機,監控RAM裡面的變數。而不用打開keil 調試。還可以 刷寫 flash,可以用在產品量產的刷寫上。 SEGGER 的 jlink sdk並不是免費的,在調試API 過程中, ...
  • 最近在做一個資源對接項目,對方的介面中要求我們把文件的md5值傳過去,搜了一下找到這個方法,記錄之。 ...
  • 一、目標樣式 我們要實現上圖中的效果,需要如下的操作: 二、資源分享代碼 註:Client.Share.SendURL("URL地址") 分享文本:Client.Share.SendText("文本") 分享圖片:Client.Share.SendImage("圖片") 分享截屏:Client.Sh ...
  • 在angularjs中,想在文本框中,驗證用戶輸入的字元串是否為日期時間。剛開始時,Insus.NET想到的是正則,這隻是驗證到日期與時間的格式是否正確而已,而對於2月最後一天或是30或是31號,還是無能為力。 因此,Insus.NET想使用angularjs的自定義指令來驗證解決此問題。在ASP. ...
  • 1,這是因為用線程式控制制子窗體,刷新數據的時候會影響主窗體,因為主次窗體是以 Main man = new Main(); man.ShowDialog();形式存在 2,解決辦法: 新建公共類,Bool屬性並賦值,在需要調用刷新數據方法地方通過給刷新數據的方法套一個事件,在通過Timer 控制項結束當 ...
  • 接上一篇,眾所周知一個網站的用戶登錄是非常重要,一站式的登錄(SSO)也成了大家討論的熱點。微軟在這個Demo中,把登錄單獨拉了出來,形成了一個Service,用戶的註冊、登錄、找回密碼等都在其中進行。這套service是基於IdentityServer4開發的, 它是一套基於 .Net Core的... ...
  • 一、需求 我們在開發中經常會遇到一些枚舉,而且這些枚舉類型可能會在表單中的下拉中,或者單選按鈕中會用到等。 這樣用是沒問題的,但是用過的人都知道一個問題,就是枚舉的命名問題,當然有很多人枚舉直接中文命名,我是不推薦這種命名規則,因為實在不夠友好。 那有沒有可以不用中文命名,而且可以顯示中文的方法呢。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...